java基础(一)-面向对象思想
前言
java是一門面向對象的語言,在學習java前,先要理解面向對象這個概念,區別于c這類的面向過程語言,面向對象有著什么一樣的特點呢?先上一張思維導圖吧:
對象
什么是對象
問題空間中的元素及其在解空間中的表示
這句話摘抄自java編程思想,是一句很難理解的話語(果然大佬的總結概括不是一般的抽象)。那么什么是問題空間?什么是在解空間呢?
問題空間:問題空間是問題解決者對一個問題所達到的全部認識狀態,它是由問題解決者利用問題所包含的信息和已貯存的信息主動地構成的。一般來說包括3部分:
- 初始狀態 -- 開始時的不完全的信息或令人不滿意的狀況,
- 目標狀態 -- 你希望獲得的信息或狀態或者說是目標狀態
- 操作 --為了從初始狀態邁向目標狀態,你可能采取的步驟
如果拿方法來類比這段內容,初始狀態也就是入參,目標狀態是結果或者返回值,操作就是方法體啦。
在解空間:emmmm這個沒有找到具體的解釋,不過有解空間的解釋,應該類似:n元齊次線性方程組的解集S={x|Ax=0}是一個向量空間,稱為齊次線性方程組的解空間。相當于問題的結果集。
大致概念解釋完成了,貌似還是不好理解,用個人的話來講:問題空間其實就是我們的問題,這個問題有什么條件,運算的過程,和問題解決后的狀態。問題空間的元素都可以是一個對象。對象可以是一個有著獨立特性的實體。解空間就是結果集了。問題的結果也是一個對象。簡單的說,對象其實就是一個可描述的實體,一個可描述的實體都可以是對象
對象的五個基本特性
- 萬物皆對象(也就是所以可以描述的實體都可以是一個對象)
- 程序是對象的集合,它們通過發送消息的方式告知彼此要做的事情(發送消息其實就是方法的調用,或者通知)
- 每個對象都有著自己的以及其他對象所構成的存儲(對象的構成可以是其他的對象組合,或者自己本身的一下特性組合而成)
- 每個對象都有著其類型:對象都有著自己的歸屬標示,比如它是屬于那一類的對象,是人還是其他的可描述的類別。每一個對象都是其歸屬標示的一個實例
- 某一特定類型的所有對象都可以接收相同的信息(也就是它們對外開發的通信方式都是一致的)
以上就是對象的全部概念了,解釋完了對象,那就要解釋下對象的歸屬標示了,在java中這個稱之為類
什么是類
在上文有提到過每個對象都擁有其類型,這個類型在java中稱之為類,類是具有相同特性(數據元素和行為)的對象集合
- 數據元素:我們一般當成特征,即該對象中有著那些屬性來描述,比如長方形的長和寬。
- 行為:是方法的總稱,如果我們把對象比作個體,那么方法就是個體可以做的事情,擁有的行為
上文解釋了對象的概念,但是我們主要還是講解一下面向對象,所有來解釋下面向對象的內容吧。
面向對象
什么是面向對象
面向對象思想可以看作一種在程序中包含各種獨立而又互相調用的對象的思想。 與面向過程的做法不同,面向過程我們可以理解為流水線似操作,類似與我們現在機器化操作,對應特定過程,制定特定的方法。而面向對象就不同了,面向對象是基于對象,也就是說由對象的相互交流,協作來完成問題的解決,相當于我們的工人們做一些活,他們有著自己的技能,可以適用與不同的場景,交互配合實現。
第一眼看貌似都是一樣,無非就是面向對象多了一個維修工多概念,沒錯,維修工其實就是一個對象,面向對象把流程的實現都封裝到了對象中,由對象的行為或者屬性來處理問題。維修工是一個歸類,不同的維修工是其具體表現。對于場景,流程是不會變的,更多是變化細節,在面向過程中,沒錯改動就是修改流程,而面向對象則是修改其行為,似的該對象的行為能適配流程。具有很強的靈活性和可維護性面向對象的三大特征
-
封裝 隱藏一切可隱藏的細節,只暴露最簡單的行為。也就是說通信方不需要知道被通信方的實現,只需要知道如何通信即可,也就是被通信方的實現對通信方而言是透明對 在java中,我們一般只會暴露類的api,而不會告知是如何實現的,對于調用方而言,實現細節都是透明的。
-
繼承 繼承指的是一種能力,是由當前類派生出新類的過程,可以在現有類的基礎上構建新的類。 在java中:由繼承創建的新類我們統稱為子類/派生類;而被繼承的類稱為父類/基類。Object是所有的父類。還有一點java中,是單繼承模式的。
-
多態 是同一種行為具有不同表現活形態的能力,是對象的多種表現能力的體現。 多態基礎是繼承,允許子對象賦予父對象不同的能力。 形成多態的條件有:
- 繼承基類
- 重寫
- 父類引用指向子類對象
在java中與多態有關系的是重寫:由子類重新定義父類的行為,也就是條件2。而重載卻不是,重載是類內部多個相同行為,不同參數的一個多樣化。和多態沒有關系。
面向對象的5大原則
S.O.L.I.D簡稱面向對象的5大原則,分別是:單一原則,開放封閉原則,里氏替換原則,接口隔離原則,依賴倒置原則。雖然大多數我們在編寫程序的時候是不太會記得這些原則,這些原則也不應該使用在編寫程序上,而是在設計程序上面。準確來說,這是一個基本的優化原則。
- 單一原則
指某一個類的功能,職責要單一,不能包羅萬象。
也就是對于類要足夠的細化,對行為足夠的明確,隔離不必要的行為。
- 開放封閉原則
一個模塊在擴展性方面應該是開放的,而在更改性上面應該是封閉的。
這個其實很好理解,比如我們在一個模塊中需要新增一個功能(不是擴展性的),而這個新功能和其中一個功能有很大一部分相似,一般情況下,我們修改下原接口,多個特判形式的編寫,其實就可以解決問題,但是這樣子做不符合開放封閉原則。我們不應該在更改上面是開放的,改動之前的邏輯,而是應該新開一個接口,擴展功能,并把兩部分相同的地方抽象出來。
- 里氏替換原則
子類可以出現在父類能夠出現的任何地方,并代替它 這句話就是父類能使用的地方,子類也都可以代替它。
- 依賴倒置原則
實體必須依賴抽象而不是具體實現
這個就不太好理解了,換個方式說:
emmm更加不好理解了,最簡單的來說,就是程序應該依賴抽象接口,而不是依賴具體的實現。拿很簡單的例子而言,我們在代碼中聲明對象的時候,是否都是XXX x=new XXX(),其實這種就是依賴了具體的實現,因為后面指待的就是特定的XXX類,那么應該怎么樣的?這邊就要借助設計模式中的抽象工廠模式(注意是抽象哦,因為不依賴具體的實現),利用工廠模式來代替直接聲明,這樣子做有個很大好處,一旦某一天XXX類要被替換了,那安裝之前的方式,我們是不是要該全部XXX類所在的地方?這樣子很容易出現遺漏。而利用了抽象工廠模式,我們其實只要該該工廠模式內部的實現一個地方就好了,如果要替換工廠模式,也直接替換工廠模式的實現就好了(所以為嘛是抽象工廠模式了),這樣程序就有很好的擴展性和靈活性。
- 接口隔離原則
拆分非常龐大臃腫的接口成為更小和更具體的接口
個人理解上呢,這個相當于是接口的單一原則,也就是接口的職責要足夠細化,功能單一,這樣子使用方就不需要依賴它實現不使用的方法了
總結
大致內容就這樣子描述完了,這章基本描述了對象,面向對象思想里面的部分內容,講了大概的概念,全是文字,好枯燥的呦。
歡迎關注我的博客-FightCrap
轉載于:https://juejin.im/post/5cffa5556fb9a07eb74b33a5
總結
以上是生活随笔為你收集整理的java基础(一)-面向对象思想的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: javascript12-object0
- 下一篇: 微信小程序笔记心得