Java基礎1:面向物件四大特性
阿新 • • 發佈:2018-11-06
面向物件四大特性
- 抽象(有時候會省略)
- 封裝
- 繼承
- 多型
抽象
將一類物件的共同特徵提取出來構建的類。包括資料抽象和行為抽
象。抽象只關注物件有哪些行為和屬性,而不關注具體的細節。
封裝
利用抽象資料型別將物件的屬性和對屬性的操作封裝起來,使之成為 一個整體。資料被保護起來,對外保留必要的介面。使用者無需知道具體的細節,可以通過物件對外提供的介面來訪問資料。
優點
- 減少耦合:可以獨立地開發、測試、優化、使用、理解和修改
減輕維護的負擔:可以更容易被程式設計師理解,並且在除錯的時候可以不影響其他模組 - 有效地調節效能:可以通過剖析確定哪些模組影響了系統的效能 提高軟體的可重用性
- 降低了構建大型系統的風險:即使整個系統不可用,但是這些獨立的模組卻有可能是可用的
如下程式碼,使用者不需要知道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:面向物件開發的六個基本原則
- 單一原則:一個類應該僅有一個引起它變化的原因。
- 里氏替換原則:任何時候子型別能夠替換掉它們的父型別。
- 開閉原則:軟體實體應當對擴充套件開放,對修改關閉。
- 依賴倒置原則:要依賴於抽象,不要依賴於具體類。
- 介面隔離:不應該強迫客戶依賴於他們不用的方法 。
- 最少知道原則(迪米特法則):只和你的朋友談話。