㈠ 談談你對面向對象的理解
淺談對面向對象的理解
為什麼要使用面向對象的思想來看待問題?
1.面向對象更利於我們看待問題,它使得我們看待問題變得清晰化。對於問題我們只需要了解問題所牽扯到的對象有哪些,它們在這個問題中都有著哪些行為即可。
2.面向對象最大的改變應該是我們看待問題高度發生改變。在利用面向過程的思想看待問題時只是關注程序的變數,語句,表達式的合理性,關注代碼塊的功能。而利用面向對象的思想進行設計時,我們只需關注對象與對象之間關系。而具體的實現細節是由對象的方法來實現的。但並不是說面向過程就一無是處,對於對象里的方法還是要利用面向過程的思想的。
面向對象的特性
繼承是面向對象編程思想中重要的一部分。簡單的講就是從一個已有的類中派生出新的類。來實現一些父類沒有的功能。父類允許子類繼承它的方法,如果父類中有些方法和子類中的方法發生沖突,子類可以重寫該方法。子類也可以實現父類的所有功能。對於基類的設計過程,我們應該根據實際情況包含各種可能性。比如說有一個狗的類,任何一個品種的狗都可以繼承它,去實現自己細節。但如果要實現貓的行為方式,顯然狗這個類就不適合了,應該在往上走,去實現一個動物的類,就可以繼承這個類來實現貓的行為屬性。這樣做的目的是使程序具有較高的可擴展性。繼承的優點是,提高代碼的復用性,降低工作量。缺點是,如果父類的大部分功能子類都用不上,那麼子類就顯得比較冗餘了。
面向過程的實現過程就是變數在函數之間的不斷傳遞,使得函數之間進行信息的交流來實現編程的需要的。這樣的後果就是如果變數在某一函數中被改變了,會導致整個程序出錯。對於面向對象來說,信息之間的交流是以對象做為參數的,調用的類只能使用該類的某些功能來實現自己的功能。裡面的信息對外界來說是不可見的,也無法改變類中的屬性。因為類中的屬性大多都是私有的或保護的。這就體現了封裝性,封裝是將屬性和方法「打包」,屬性私有化或保護化,方法公有化,只能使用該類的方法來使用和改變該類的屬性。就好像人一樣,比如吃飯是一個方法,那麼吃多吃少是自己的事,與別人無關。別人也不可能改變這個事實。
對於面向對象來說,類相當於一個模板,一個抽象的概念,對象才是類的實例化體現,即是程序代碼的組成部分。對於繼承了父類的多個子類而言,重寫了父類的某些方法,方法名雖然相同,方法體不同,實現過程不同,即不同子類的該方法不同。使用父類類型定義的子類對象。調用不同子類的方法,產生的了不同結果,這種變化就叫多態性。尤其對於父類是抽象類來說,由於父類中的方法未定義,不同子類繼承父類後,可以重寫父類的方法。抽象類不能實例化對象,只能被繼承,一般作為基類。
面相對象的原則
一.單一原則
就一個類來說,類的功能應該較為單一一點,不應該是各種功能都包含在一起,這樣不利於代碼的維護,容易產生BUG,也破壞了類的本質。應該是類中的所有方法都為某一功能服務。但並不是類分的越詳細越好,根據實際情況而定。
二.開閉原則
對於一個類來說,應該是擴展是開放的,修改是關閉的。隨著人們的對軟體功能的不斷期待和改變,我們總是避免不了的要在原有的代碼的基礎上進行變化,但我們不可能對原有的代碼進行修改,因為這可能使原有出現BUG,所以擴展是理所當然的。這個就要通過繼承來實現了。
三.迪米特原則
一個類應該降低對其它類的耦合度,如果避免不了要與其它類產生關聯的話,應該避免對其它類的了解。保持類的封裝性特點。如果兩個類之間耦合度較高的話,一個類的改變會影響另一個類,而面向對象的原則是程序之間的類應該是很少關聯的各個類執行自己的功能就好。
對象之間的關系
泛化關系是對象之間耦合度最大的一種關系,就是繼承關系。在java中介面就類似於抽象類,它是方法說明的集合,子類繼承介面,並實現介面中的方法,就是實現關系。在程序中,有時候避免不了的要把某一個對象做為參數,局部變數,返回值,讓另一個對象調用完成該類的某些功能。這就是依賴關系。聚合關系是整體包含局部的概念。例如班級與學生之間的關系。組合關系是一種強烈的包含關系。例如學校和班級之間的關系,公司和部門之間的關系。聚合關系和組合關系的區別就在於,聚合關系中的的局部可以獨立存在,例如這個班級被取消了,不能說明班裡的學生就不是學生了。組合關系而言,整體的生命周期和局部的生命周期是息息相關的,如果整體不存在了,局部肯定不存在了,例如公司倒閉了,那麼它其中的某一個部門肯定也不會存在。
總結
所謂面向對象編寫的程序,就是通過不同對象的實現來實現整個功能。重點還是如何合理的設置對象,以及對程序的包容性,即你要考慮將來可能會改變某一功能或添加某一功能。對程序的升級。還有就是在滿足程序功能的前提下保持低耦合度。
㈡ JAVA面向對象六大原則是什麼
1) Open-Close Principle(OCP),開-閉原則,講的是設計要對擴展有好的支持,而對修改要嚴格限制。這是最重要也是最為抽象的原則,基本上我們所說的Reusable Software既是基於此原則而開發的。其他的原則也是對它的實現提供了路徑。
2) Liskov Substituition Principle(LSP),里氏代換原則,很嚴格的原則,規則是「子類必須能夠替換基類,否則不應當設計為其子類。」也就是說,子類只能去擴展基類,而不是隱藏或覆蓋基類.
3) Dependence Inversion Principle(DIP),依賴倒換原則,「設計要依賴於抽象而不是具體化」。換句話說就是設計的時候我們要用抽象來思考,而不是一上來就開始劃分我需要哪些哪些類,因為這些是具體。這樣做有什麼好處呢?人的思維本身實際上就是很抽象的,我們分析問題的時候不是一下子就考慮到細節,而是很抽象的將整個問題都構思出來,所以面向抽象設計是符合人的思維的。另外這個原則會很好的支持OCP,面向抽象的設計使我們能夠不必太多依賴於實現,這樣擴展就成為了可能,這個原則也是另一篇文章《Design by Contract》的基石。
4) Interface Segregation Principle(ISP),「將大的介面打散成多個小介面」,這樣做的好處很明顯,我不知道有沒有必要再繼續描述了,為了節省篇幅,實際上我對這些原則只是做了一個小總結,如果有需要更深入了解的話推薦看《Java與模式》,MS MVP的一本巨作!^_^
5) Composition/Aggregation Reuse Principle(CARP),設計者首先應當考慮復合/聚合,而不是繼承(因為它很直觀,第一印象就是「哦,這個就是OO啊」)。這個就是所謂的「Favor Composition over Inheritance」,在實踐中復合/聚合會帶來比繼承更大的利益,所以要優先考慮。
6) Law of Demeter or Least Knowlegde Principle(LoD or LKP),迪米特法則或最少知識原則,這個原則首次在Demeter系統中得到正式運用,所以定義為迪米特法則。它講的是「一個對象應當盡可能少的去了解其他對象」。也就是又一個關於如何松耦合(Loosely-Coupled)的法則。
㈢ 在java中,什麼是介面,介面的特點是什麼
java介面:
1、Java語言中存在的結構,有特定的語法和結構。
2、Java語言中一個類所具有的方法的特徵集合,是一種邏輯上的抽象。
java介面作用:
1、利於代碼的規范
這樣做的目的一方面是為了給開發人員一個清晰的指示,告訴他們哪些業務需要實現;同時也能防止由於開發人員隨意命名而導致的命名不清晰和代碼混亂,影響開發效率。
2、有利於對代碼進行維護
可以一開始定義一個介面,把功能菜單放在介面里,然後定義類時實現這個介面,以後要換的話只不過是引用另一個類而已,這樣就達到維護、拓展的方便性。
3、保證代碼的安全和嚴密
一個好的程序一定符合高內聚低耦合的特徵,能夠讓系統的功能較好地實現,而不涉及任何具體的實現細節。這樣就比較安全、嚴密一些,這一思想一般在軟體開發中較為常見。
(3)ocp原則java擴展閱讀:
關於java介面的使用規范:
1、介面中可以定義常量,不能定義變數,介面中的屬性都是全局靜態常量,介面中的常量必須在定義時指定初始值。
2、 介面中所有的方法都是抽象方法,介面中方法都會自動用public abstract 修飾,即介面中只有全局抽象方法。
3、 介面不能實例化,介面中不能有構造。
4、 介面之間可以通過extends實現繼承關系,一個介面可以繼承多個介面,但介面不能繼承類。
5、 介面的實現類必須實現介面的全部方法,否則必須定義為抽象類。
參考資料來源:網路:java介面