java基礎(一)-面向對象思想

前言

java是一門面向對象的語言,在學習java前,先要理解面向對象這個概念,區別於c這類的面向過程語言,面向對象有着什麼同樣的特色呢?先上一張思惟導圖吧: java

面向對象思惟導圖


對象

什麼是對象

問題空間中的元素及其在解空間中的表示git

這句話摘抄自java編程思想,是一句很難理解的話語(果真大佬的總結歸納不是通常的抽象)。那麼什麼是問題空間?什麼是在解空間呢?github

  1. 問題空間:問題空間是問題解決者對一個問題所達到的所有認識狀態,它是由問題解決者利用問題所包含的信息和已貯存的信息主動地構成的。通常來講包括3部分:編程

    • 初始狀態 -- 開始時的不徹底的信息或使人不滿意的情況,
    • 目標狀態 -- 你但願得到的信息或狀態或者說是目標狀態
    • 操做 --爲了從初始狀態邁向目標狀態,你可能採起的步驟

    若是拿方法來類比這段內容,初始狀態也就是入參,目標狀態是結果或者返回值,操做就是方法體啦。設計模式

  2. 在解空間:emmmm這個沒有找到具體的解釋,不過有解空間的解釋,應該相似:n元齊次線性方程組的解集S={x|Ax=0}是一個向量空間,稱爲齊次線性方程組的解空間。至關於問題的結果集。
    大體概念解釋完成了,貌似仍是很差理解,用我的的話來說:問題空間其實就是咱們的問題,這個問題有什麼條件,運算的過程,和問題解決後的狀態。問題空間的元素均可以是一個對象。對象能夠是一個有着獨立特性的實體。解空間就是結果集了。問題的結果也是一個對象。簡單的說,對象其實就是一個可描述的實體,一個可描述的實體均可以是對象api

對象的五個基本特性

  • 萬物皆對象(也就是因此能夠描述的實體均可以是一個對象)
  • 程序是對象的集合,它們經過發送消息的方式告知彼此要作的事情(發送消息其實就是方法的調用,或者通知)
  • 每一個對象都有着本身的以及其餘對象所構成的存儲(對象的構成能夠是其餘的對象組合,或者本身自己的一下特性組合而成)
  • 每一個對象都有着其類型:對象都有着本身的歸屬標示,好比它是屬於那一類的對象,是人仍是其餘的可描述的類別。每個對象都是其歸屬標示的一個實例
  • 某一特定類型的全部對象均可以接收相同的信息(也就是它們對外開發的通訊方式都是一致的)

以上就是對象的所有概念了,解釋完了對象,那就要解釋下對象的歸屬標示了,在java中這個稱之爲類學習

什麼是類

在上文有提到過每一個對象都擁有其類型,這個類型在java中稱之爲類,類是具備相同特性(數據元素和行爲)的對象集合優化

  • 數據元素:咱們通常當成特徵,即該對象中有着那些屬性來描述,好比長方形的長和寬。
  • 行爲:是方法的總稱,若是咱們把對象比做個體,那麼方法就是個體能夠作的事情,擁有的行爲

上文解釋了對象的概念,可是咱們主要仍是講解一下面向對象,全部來解釋下面向對象的內容吧。設計

面向對象

什麼是面向對象

面向對象思想能夠看做一種在程序中包含各類獨立而又互相調用的對象的思想。 與面向過程的作法不一樣,面向過程咱們能夠理解爲流水線似操做,相似與咱們如今機器化操做,對應特定過程,制定特定的方法。而面向對象就不一樣了,面向對象是基於對象,也就是說由對象的相互交流,協做來完成問題的解決,至關於咱們的工人們作一些活,他們有着本身的技能,能夠適用與不一樣的場景,交互配合實現。 cdn

面向對象和麪向過程區別
第一眼看貌似都是同樣,無非就是面向對象多了一個維修工多概念,沒錯,維修工其實就是一個對象,面向對象把流程的實現都封裝到了對象中,由對象的行爲或者屬性來處理問題。維修工是一個歸類,不一樣的維修工是其具體表現。對於場景,流程是不會變的,更可能是變化細節,在面向過程當中,沒錯改動就是修改流程,而面向對象則是修改其行爲,似的該對象的行爲能適配流程。具備很強的靈活性和可維護性

面向對象的三大特徵

  • 封裝 隱藏一切可隱藏的細節,只暴露最簡單的行爲。也就是說通訊方不須要知道被通訊方的實現,只須要知道如何通訊便可,也就是被通訊方的實現對通訊方而言是透明對 在java中,咱們通常只會暴露類的api,而不會告知是如何實現的,對於調用方而言,實現細節都是透明的。

  • 繼承 繼承指的是一種能力,是由當前類派生出新類的過程,能夠在現有類的基礎上構建新的類。 在java中:由繼承建立的新類咱們統稱爲子類/派生類;而被繼承的類稱爲父類/基類。Object是全部的父類。還有一點java中,是單繼承模式的。

  • 多態 是同一種行爲具備不一樣表現活形態的能力,是對象的多種表現能力的體現。 多態基礎是繼承,容許子對象賦予父對象不一樣的能力。 造成多態的條件有:

    1. 繼承基類
    2. 重寫
    3. 父類引用指向子類對象

    在java中與多態有關係的是重寫:由子類從新定義父類的行爲,也就是條件2。而重載卻不是,重載是類內部多個相同行爲,不一樣參數的一個多樣化。和多態沒有關係。

面向對象的5大原則

S.O.L.I.D簡稱面向對象的5大原則,分別是:單一原則,開放封閉原則,里氏替換原則,接口隔離原則,依賴倒置原則。雖然大多數咱們在編寫程序的時候是不太會記得這些原則,這些原則也不該該使用在編寫程序上,而是在設計程序上面。準確來講,這是一個基本的優化原則。

  • 單一原則

指某一個類的功能,職責要單一,不能一應俱全。

也就是對於類要足夠的細化,對行爲足夠的明確,隔離沒必要要的行爲。

  • 開放封閉原則

一個模塊在擴展性方面應該是開放的,而在更改性上面應該是封閉的。

這個其實很好理解,好比咱們在一個模塊中須要新增一個功能(不是擴展性的),而這個新功能和其中一個功能有很大一部分類似,通常狀況下,咱們修改下原接口,多個特判形式的編寫,其實就能夠解決問題,可是這樣子作不符合開放封閉原則。咱們不該該在更改上面是開放的,改動以前的邏輯,而是應該新開一個接口,擴展功能,並把兩部分相同的地方抽象出來。

  • 里氏替換原則

子類能夠出如今父類可以出現的任何地方,並代替它 這句話就是父類能使用的地方,子類也均可以代替它。

  • 依賴倒置原則

    實體必須依賴抽象而不是具體實現

這個就不太好理解了,換個方式說:

  1. 高層次的模塊不該該依賴低層次的實現
  2. 高層次的模塊應該依賴抽象

emmm更加很差理解了,最簡單的來講,就是程序應該依賴抽象接口,而不是依賴具體的實現。拿很簡單的例子而言,咱們在代碼中聲明對象的時候,是否都是XXX x=new XXX(),其實這種就是依賴了具體的實現,由於後面指待的就是特定的XXX類,那麼應該怎麼樣的?這邊就要藉助設計模式中的抽象工廠模式(注意是抽象哦,由於不依賴具體的實現),利用工廠模式來代替直接聲明,這樣子作有個很大好處,一旦某一天XXX類要被替換了,那安裝以前的方式,咱們是否是要該所有XXX類所在的地方?這樣子很容易出現遺漏。而利用了抽象工廠模式,咱們其實只要該該工廠模式內部的實現一個地方就行了,若是要替換工廠模式,也直接替換工廠模式的實現就行了(因此爲嘛是抽象工廠模式了),這樣程序就有很好的擴展性和靈活性。

  • 接口隔離原則

拆分很是龐大臃腫的接口成爲更小和更具體的接口

我的理解上呢,這個至關因而接口的單一原則,也就是接口的職責要足夠細化,功能單一,這樣子使用方就不須要依賴它實現不使用的方法了

總結

大體內容就這樣子描述完了,這章基本描述了對象,面向對象思想裏面的部份內容,講了大概的概念,全是文字,好枯燥的呦。

歡迎關注個人博客-FightCrap

相關文章
相關標籤/搜索