1. 程式人生 > >Java基礎1:面向物件四大特性

Java基礎1:面向物件四大特性

面向物件四大特性

  • 抽象(有時候會省略)
  • 封裝
  • 繼承
  • 多型

抽象

將一類物件的共同特徵提取出來構建的類。包括資料抽象和行為抽
象。抽象只關注物件有哪些行為和屬性,而不關注具體的細節。

封裝

利用抽象資料型別將物件的屬性和對屬性的操作封裝起來,使之成為 一個整體。資料被保護起來,對外保留必要的介面。使用者無需知道具體的細節,可以通過物件對外提供的介面來訪問資料。

優點

  • 減少耦合:可以獨立地開發、測試、優化、使用、理解和修改
    減輕維護的負擔:可以更容易被程式設計師理解,並且在除錯的時候可以不影響其他模組
  • 有效地調節效能:可以通過剖析確定哪些模組影響了系統的效能 提高軟體的可重用性
  • 降低了構建大型系統的風險:即使整個系統不可用,但是這些獨立的模組卻有可能是可用的

如下程式碼,使用者不需要知道name,gender,age屬性的具體細節,只能通過相應的public介面實現具體的業務,保護了程式碼的完整性和安全性。

public class Person {

    private String name;
    private int gender;
    private int age;

    public String getName() {
        return name;
    }

    public String getGender
() { return gender == 0 ? "man" : "woman"; } public void work() { if (18 <= age && age <= 50) { System.out.println(name + " is working very hard!"); } else { System.out.println(name + " can't work any more!"); } } }

繼承

繼承是從已有的類中得到(派生出)繼承資訊產生新類的過程(is-a)。在設計模式中,繼承應當遵循里氏替換原則,即子類物件必須能夠替換所有父類物件。

多型

不同子型別的物件對同一訊息做出不同的響應。
包括執行時多型和編譯時多型。

  • 執行時多型指方法的重寫(程式中物件指向的具體型別要等到執行時才能夠確定)。
  • 編譯時多型指方法的過載。

執行時多型的條件:

  • 繼承關係
  • 重寫方法
  • 向上轉型
public class Instrument {

    public void play() {
        System.out.println("Instument is playing...");
    }
}

//繼承
public class Wind extends Instrument {

//重寫父類的方法
    public void play() {
        System.out.println("Wind is playing...");
    }
}

//繼承
public class Percussion extends Instrument {

//重寫父類的方法
    public void play() {
        System.out.println("Percussion is playing...");
    }
}

public class Music {

    public static void main(String[] args) {
        List<Instrument> instruments = new ArrayList<>();
        //加入Wind物件
        instruments.add(new Wind());
        //加入Percussion物件
        instruments.add(new Percussion());
        for(Instrument instrument : instruments) {
        //執行時多型
            instrument.play();
        }
    }
}

Q:面向物件和麵向過程的區別?用面向過程可以實現面向物件嗎?

  • 面向物件和麵向過程的區別
    • 面向過程就像是一個細心的管家,事無具細的都要考慮到。而面向物件就像是個家用電器,你只需要知道他的功能,不需要知道它的工作原理。
    • 面向過程是一種是“事件”為中心的程式設計思想。就是分析出解決問題所需的步驟,然後用函式把這些步驟實現,並按順序呼叫。面向物件是以“物件”為中心的程式設計思想。
    • 簡單的舉個例子:汽車發動、汽車到站
      • 這對於 面向過程 來說,是兩個事件,汽車啟動是一個事件,汽車到站是另一個事件,面向過程程式設計的過程中我們關心的是事件,而不是汽車本身。針對上述兩個事件,形成兩個函式,之 後依次呼叫。(事件驅動,動詞為主)
      • 然而這對於面向物件來說,我們關心的是汽車這類物件,兩個事件只是這類物件所具有的行為。而且對於這兩個行為的順序沒有強制要求。(物件驅動,名詞為主,將問題抽象出具體的物件,而這個物件有自己的屬性和方法,在解決問題的時候是將不同的物件組合在一起使用)
  • 用面向過程可以實現面向物件嗎 ?
    • 如果是 C 語言來展現出面向物件的思想,C 語言中是不是有個叫結構體的東西,這個裡面有自己定義的變數 可以通過函式指標就可以實現物件

Q:面向物件開發的六個基本原則

  • 單一原則:一個類應該僅有一個引起它變化的原因。
  • 里氏替換原則:任何時候子型別能夠替換掉它們的父型別。
  • 開閉原則:軟體實體應當對擴充套件開放,對修改關閉。
  • 依賴倒置原則:要依賴於抽象,不要依賴於具體類。
  • 介面隔離:不應該強迫客戶依賴於他們不用的方法 。
  • 最少知道原則(迪米特法則):只和你的朋友談話。