天天看點

Java-面向對象三大基本特性,五大基本原則

作者:Java千練

前面文章我們分享過 《面向對象程式設計思想》,深刻了解面向對象思想在于深刻了解面向對象三大基本特性和五大基本原則,而且透切了解面向對象三大基本特性是了解面向對象五大基本原則的基礎。

面向對象三大特征

1.封裝(Encapsulation)

封裝就是把客觀世界中有共同之處的事物抽象為類,并且該類可以把資料(成員變量)和方法隻提供給可信任的類或者對象操作,對其他對象進行資訊隐藏不可見。簡而言之,一個類就是封裝了資料和方法的邏輯實體,并且在對象内部某些資料和方法是私有的,外界無法通路的,防止外界意外改變或錯誤使用對象私有部分,達到對資料和方法不同級别保護的目的。

  1. public class Person {
  2. private String name;
  3. private int age;
  4. public void say() {
  5. System.out.print("person say.");
  6. }
  7. }

2.繼承(Inheritance)

如果想複用已有的類的所有代碼怎麼辦?答案是繼承,繼承是可以使用現有類的所有功能,并且無需重新編寫原來類的前提下對功能進行擴充的方法。繼承建立的新類叫做 “ 子類 ”或 “ 派生類 ”,被繼承的類叫做 “基類”、“父類”、“超類”。繼承有二類:實作繼承與接口繼承,實作繼承是指直接使用基類的屬性和方法而無需額外編碼的能力;接口繼承是指僅使用屬性和方法的名稱、但是子類必須提供實作的能力。

  1. public Student extends Person {
  2. public void say() {
  3. System.out.print("student say.");
  4. }
  5. public void study() {
  6. System.out.print("I like study.");
  7. }
  8. }

代碼複用

通過 “繼承” 和 “組合(Composition)” 可以用來實作代碼複用,上面展示了繼承,組合:

  1. public School {
  2. private Student stu;
  3. public School(Student stu) {
  4. this.stu = stu;
  5. }
  6. public void selfintroduction() {
  7. stu.say();
  8. stu.study();
  9. }
  10. }

這裡選擇 “繼承” 或 “組合” 的原則:父類和子類的關系是 “ is a ” 選擇繼承,而父類和子類的關系是 “ has a ” 選擇組合。

3.多态(Polymorphism)

多态指一個類執行個體的相同方法在不同情形有不同表現形式,多态機制使具有不同内部結構的對象可以共享相同的外部接口。這意味着,雖然針對不同對象的具體操作不同,但通過一個公共的類,它們(那些操作)可以通過相同的方式予以調用。最常見的多态就是将子類傳入父類參數中,運作時調用父類方法時通過傳入的子類決定具體的内部結構或行為。

  1. public SelfIntroduction {
  2. public void self(Person person) {
  3. person.say();
  4. }
  5. }

上面這個 selfIntroduction(Personperson) 方法如果傳遞的是 Person 對象,輸出 Person 對象的自我介紹,如果傳遞的是 Student 對象(Student 是 Person 子類),輸出 Student 對象的自我介紹。

面向對象五大原則

1.單一職責原則(Single-Resposibility Principle)

一個類的功能要單一,不能包羅萬象,如果要變動某個功能,隻需要修改一個類或者很少量的類。比如不能把所有的職業(Student等)的行為都寫入一個類中,那樣會十分臃腫。

2.開放封閉原則(Open-Closed principle)

一個子產品在擴充性方面應該是開放的而在更改性方面應該是封閉的,什麼意思呢?如果不必改動類的源代碼,就能擴充它的行為,那麼這個軟體實體設計就是滿足開放封閉原則的。如果說我們預測到某種變化,或者某種變化發生了,我們應當建立抽象類來隔離以後發生的同類變化。還有就是暴露出去的方法(public 修飾)是可以讓使用者重寫擴充的,而隐藏私有(private 修飾)的是可以自己修改的,而且也不會影響既有使用者的現在使用。

3.裡氏替換原則(Liskov-Substituion Principle)

父類應盡可能使用接口或者抽象類來實作,子類通過實作了父類接口,能夠替父類的使用地方。貫徹 GOF (Gang of Four、四人組,《設計模式》一書由四人所著)倡導的面向接口程式設計。這樣做的好處就是,在根據新要求擴充父類接口的新子類的時候而不影響目前用戶端的使用。

4.依賴倒置原則(Dependecy-Inversion Principle)

傳統的結構化程式設計中,最上層的子產品通常都要依賴下面的子子產品來實作,稱為高層依賴低層。依賴倒置原則就是要逆轉這種依賴關系,讓高層子產品不要依賴低層子產品,是以稱之為依賴倒置原則。

假設 B 是較 A 低的子產品,但 B 需要使用到 A 的功能,這個時候,B 不應當直接使用 A 中的具體類: 而應當由 B 定義一抽象接口,并由 A 來實作這個抽象接口,B 隻使用這個抽象接口,這樣就達到了依賴倒置的目的,B 也解除了對A的依賴,反過來是 A 依賴于 B 定義的抽象接口。

5.接口隔離原則 (Interface-Segregation Principle)

使用接口的地方,記住使用多個專門、專一的接口比使用單個接口包括一切要好的多,接口所定義的操作相當于對用戶端的一種承諾,這種承諾當然是越少越好,越精練越好,過多的承諾就是你的大量精力和時間去維護一個冗雜的接口。

參考:

https://blog.csdn.net/jiyiqinlovexx/article/details/46593053

繼續閱讀