1、面向對象三大特性設計模式
1.封裝:對外隱藏類的屬性和變量,經過接口(方法)的形式提供給外面,避免外部修改內部數據。封裝性就是利用接口將數據和基於數據的操做封裝在內部,保護數據並隱蔽具體的細節,只保留有限的接口與外界聯繫。模塊化
public class Student { private String name;// 聲明一個私有字符串變量,表示姓名 private int age;// 聲明一個私有整型變量,表示年齡public Student(String name, int age, String sex, String major) { // 有參構造方法 this.name = name; this.age = age; } public String getName() { //得到姓名的方法 return name; } public void setName(String name) { //設置姓名的方法 this.name = name; } public int getAge() { //得到年齡的方法 return age; } public void setAge(int age) { //設置年齡的方法 this.age = age; } }
2.繼承:使子類的對象擁有父類的所有屬性和行爲(protect和public),同時能夠增添本身的所特有的屬性和行爲。這樣有利於代碼的複用,避免重複造輪子,這就是繼承的基本思想。this
3.多態:簡單來講就是一個程序中同名的多個不一樣方法共存的狀況,一般使用方法的重載和重寫(也叫覆蓋)來實現類的多態性。spa
重載:方法名同樣,參數列表不同。不一樣的參數列表能夠是不一樣的參數類型,不一樣的參數個數,不一樣的參數順序(參數類型必須不同);設計
重寫:子類從新實現父類的虛方法。code
封裝能夠隱藏實現細節,使得代碼模塊化;繼承能夠擴展已存在的代碼模塊(類);它們的目的都是爲了——代碼重用對象
2、類間的關係blog
1.繼承,對於類來講,這種關係叫作繼承,對於接口來講,這種關係叫作實現。繼承
2.依賴,一個類A中的方法使用到了另外一個類B。通常而言,依賴關係在Java中體現爲局域變量、方法的形參,或者對靜態方法的調用。接口
public class Pen { public void write(){ System.out.println("use pen to write"); } } public class Me { public void write(Pen pen){//這裏,pen做爲Me類方法的參數 pen.write(); } }
3.聚合,b類是a類的一部分,一種強引用關係,b類生命週期跟a類沒有關係,因此a類刪除時,b類不會被刪除。通常而言,聚合關係在Java中體現爲成員變量。例如界面和數據類的關係,界面被銷燬,可是數據類不會被銷燬。
4.組合,b類是a類組成的一部分,比聚合更強的引用關係,a類的生命週期結束也就意味着b類的生命週期結束,因此a類刪除時,b類必定會跟着刪除。通常而言,聚合關係在Java中體現爲成員變量。例如界面和他的子界面、item的關係,界面被銷燬時,子界面、item都會被銷燬。
少用繼承,多用組合。
繼承的缺點:
1.破壞封裝性,有時候須要實現子類不須要的方法,例如
鴨子是不要飛的,那麼若是你要解決這個問題,你須要在封裝一層
那若是再來一個會游泳的鳥,會下蛋的鳥呢,那你的繼承層級可能會多達十種,繼承層級一旦多於三層,就較難理解、維護了。可是若是把會游泳、會飛、會下蛋等特性作成功能組件自由組合就不會有這個問題了。
2.緊耦合,修改父類可能會影響全部的子類以及子類的調用類,例如修改方法簽名(返回值、名字、參數列表),會影響到全部子類。
3、設計模式六大原則
1.職責單一:一個類只負責一項職責,若是這項職責很複雜,能夠拆分紅多個子功能進行組合,避免一個類過於龐大,難以修改。
問題由來:類T負責兩個不一樣的職責:職責P1,職責P2。當因爲職責P1需求發生改變而須要修改類T時,有可能會致使本來運行正常的職責P2功能發生故障。
2.依賴倒置:實現依賴抽象,高層模塊不該該依賴低層模塊,兩者都應該依賴其抽象。使用接口、抽象類的方法,參數使用接口(抽象)類進行傳遞,便於不一樣子類的傳參。
問題由來:類A直接依賴類B,假如要將類A改成依賴類C,則必須經過修改類A的代碼來達成。這種場景下,類A通常是高層模塊,負責複雜的業務邏輯;類B和類C是低層模塊,負責基本的原子操做;假如修改類A,會給程序帶來沒必要要的風險。
3.里氏替換:全部父類出現的地方都能用子類代替,子類不該該修改父類已經實現的方法。類B繼承類A時,除添加新的方法完成新增功能P2外,儘可能不要重寫父類A的方法,也儘可能不要重載父類A的方法。
問題由來:有一功能P1,由類A完成。現須要將功能P1進行擴展,擴展後的功能爲P,其中P由原有功能P1與新功能P2組成。新功能P由類A的子類B來完成,則子類B在完成新功能P2的同時,有可能會致使原有功能P1發生故障。
4.接口隔離:設計接口儘可能精簡,客戶端不該該依賴它不須要的接口。
問題由來:類A經過接口I依賴類B,類C經過接口I依賴類D,若是接口I對於類A和類B來講不是最小接口,則類B和類D必須去實現他們不須要的方法。
5.迪米特原則(最少知道):一個類對本身依賴的類知道的越少越好。儘可能下降類與類之間的耦合,對於被依賴的類來講,不管邏輯多麼複雜,都儘可能地的將邏輯封裝在類的內部,對外除了提供的public方法,不對外泄漏任何信息。
問題由來:類與類之間的關係越密切,耦合度越大,當一個類發生改變時,對另外一個類的影響也越大。
6.開閉原則:對修改關閉,對擴展開放。