1. 程式人生 > >繼承,封裝,多型,抽象

繼承,封裝,多型,抽象

繼承

一,為什麼需要繼承?

第一好處:繼承的本質在於抽象。類是對物件的抽象,繼承是對某一批類的抽象。

第二好處:為了提高程式碼的複用性。

二,如何實現繼承?

使用extends關鍵字,extends的意思是“擴充套件”。子類是父類的擴充套件。

三,注意事項

1,java中只有單繼承(一個類只能有一個直接父類),沒有像c++那樣的多繼承,多繼承會引起混亂,使得繼承鏈過於複雜,系統難以維護。
2,java中的多繼承可以通過介面來實現。
3,如果定義一個類時,沒有呼叫extends,那麼它的父類是java.lang.Object

四,方法的重寫

1,重寫方法必須和被重寫方法具有相同方法名稱,引數列表和返回型別。
2,重寫方法不能使用比被重寫方法更嚴格的訪問許可權(由於多型)。
3,子類的返回值型別小於等於父類的返回值型別。

五,Object類

是所有類的父類,裡面含有toString(),equals()等方法,其中toString得到的是包名+型別+”@“+地址雜湊碼。 其返回值是 String 型別,描述當前物件的有關資訊。
在進行String與其它型別資料的連線操作時(如:System.out.println(“info”+person)),將自動呼叫該物件類的 toString()方法。

//Object類中toString方法的原始碼是:

public String toString() {

   return getClass().getName() + "@" + Integer.toHexString(hashCode());

}

equals()方法不同類有不同的實現,有的只需要內容相同有的還需要物件相同。

//Object類中的equals方法原始碼可以看出:

public boolean equals(Object obj) {

    return (this == obj);

}

六,super()

直接父類物件的引用。
可以通過super訪問父類中被子類覆蓋的方法或屬性。

//例如構造方法:
public Animal() {
    super();//呼叫父類的構造方法,只能位於第一句 
    ...
}

七,繼承與組合

從程式碼複用的角度來看,組合可以替代繼承。

組合:不需要繼承,只需要在類中持有另一個類的引用即可。

從建模的角度來看,繼承是”is a”關係,意思為:是…
組合是”has a”關係,意思為:包含,有…

封裝

一,為什麼需要封裝?

隱藏物件內部的複雜性,只對外公開簡單的藉口,便於外接呼叫,從而提高系統的可擴充套件性,可維護性。

程式設計追求的是”高內聚,低耦合“。高內聚就是類的內部資料操作細節自己完成,不允許外部干涉;低耦合:僅暴露少量的方法給外部使用。

二,封裝需要的許可權設定

引用塊內容

三,封裝的使用細節

1,static常量可以用public,其餘一般都用private
(提供相應的get/set方法來訪問相關屬性. 這些方法通常是public,從而提供對屬性的讀取操作。 (注意:boolean變數的get方法是用:is開頭!)
2, 一些只用於本類的輔助性方法可以用private,希望其他類呼叫的方法用public。

多型

一,定義

多型性是OOP中的一個重要特性,主要是用來實現動態聯編的,換句話說,就是程式的最終狀態只有在執行過程中才被決定而非在編譯期間就決定了。這對於大型系統來說能提高系統的靈活性和擴充套件性。

多型可以讓我們不用關心某個物件到底是什麼具體型別,就可以使用該物件的某些方法,從而實現更加靈活的程式設計,提高系統的可擴充套件性。

二,為什麼需要多型

多型性是指允許不同類的物件對同一訊息作出不同的響應。

三,java中如何實現多型?

引用變數的兩種型別:

編譯時型別(模糊一點,一般是一個父類)

由宣告時的型別決定。

執行時型別(執行時,具體是哪個子類就是哪個子類)

由實際對應的物件型別決定。通過動態繫結呼叫該物件的方法。動態繫結會使我們的程式編寫更加靈活,但是會減慢程式執行速度。這也是JAVA比C++/C慢的主要原因之一。

多型:如果編譯時型別和執行時型別不一致,就會造成多型。

四,方法繫結

方法繫結(method binding)

執行呼叫方法時,系統根據相關資訊,能夠執行記憶體地址中代表該方法的程式碼。分為靜態繫結和動態繫結。

靜態繫結:

在編譯期完成,可以提高程式碼執行速度。

動態繫結:

通過物件呼叫的方法,採用動態繫結機制。 這雖然讓我們程式設計靈活,但是降低了程式碼的執行速度。這也是JAVA比C/C++速度慢的主要因素之一。 JAVA中除了final類、final方、static方法,所有方法都是JVM在執行期才進行動態繫結的。

五,多型的使用特點

  1. 多型是方法的多型,屬性沒有多型性。

  2. 編寫程式時,如果想呼叫執行時型別的方法,只能進行型別轉換。不然通不過編譯器的檢查。但是如果兩個沒有關聯的類進行強制轉換,會報:ClassCastException。 比如:本來是狗,我把它轉成貓。就會報這個異常。

  3. 多型的存在要有3個必要條件:要有繼承,要有方法重寫,父類引用指向子類物件

六,物件的轉型

為什麼需要強制轉換型別?

引用變數只能呼叫它編譯型別的方法,不能呼叫它執行型別的方法。這時,我們就需要進行型別的強制轉換!

1,一個父類的引用型別變數可以“指向”其子類的物件。

2,一個父類的引用不可以訪問其子類物件新增加的成員(屬性和方法)。

3,可以使用 引用 變數 instanceof 類名 來判斷該引用型變數所“指向”的物件是否屬於該類或該類的子類。

4,子類的物件可以當作基類的物件來使用稱作向上轉型(upcasting),反之稱為向下轉型(downcasting)

抽象

一,抽象方法

只聲明瞭方法,同時使用了abstract修飾,沒有方法體!必須要子類來重寫!

二,抽象類

可以避免子類設計的隨意性,將設計和實現分開。

三,注意事項

1,有抽象方法的類只能定義抽象類。
2,抽象類不能例項化,即不能用new來例項化抽象類。
3,抽象類可以包含屬性,方法,構造方法。
4,抽象類只能用來繼承。
5,抽象方法必須被子類實現。