抽象類和接口的區別
相同點
- 都位於繼承的頂端,用於被其他類實現或繼承;
- 都不能直接實例化對象;
- 都包含抽樣方法,其子類必須覆寫這些抽樣方法;
- 抽象類爲部分方法提供實現,避免子類重複實現這些方法,提高代碼重用性;接口只能包含抽樣方法;
- 一個類只能繼承一個直接父類,接口可以多繼承;
- 抽象類是某個事物中應該具備的內容,而接口是這個事物額外的內容;
**注意 : **
- 優先選用接口,少用抽象類;
- 需要定義子類的行爲,又要爲子類提供共性功能才選用抽象類;
多態
java的多態特性體現於,一個子類的對象(實現類對象)既可以給這個子類(實現類對象)引用變量賦值,也可以給其父類(接口)變量賦值。
最終多態體現爲:
- 父類的引用變量可以指向子類對象;
父類名 對象名 = new 子類名();
- 多態的前提是必須擁有子父類關係或者類實現接口關係,否則無法完成多態;
- 在使用多態後的父類引用變量調用方法時,會調用子類覆寫的方法;
多態定義格式
普通類式
父類的引用變量指向子類對象:
父類類型 變量名 = new 子類類型();
變量名.方法名();
* 普通類多態定義格式:
父類 變量名 = new 子類();
抽象類定義格式
抽象類 變量名 = new 抽象類子類();
接口多態定義格式
接口 類名 = new 接口實現類();
注意事項:
- 成員變量參考的是父類中的變量,存在編譯成功,否則編譯失敗;
- 成員方法編譯時參考父類中的方法,存在編譯成功,否則編譯失敗;
- 成員方法運行時參考子類中的方法,子類中不存在時,參考父類方法;
instanceof關鍵字
通過instanceof關鍵字來判斷某個對象是否屬於某種數據類型
多態-轉型
- 向上轉型:當子類對象賦值給父類引用時,爲向上轉型,多態的本質就是向上轉型的過程。
//格式
父類型行 變量名 = new 子類類型();
特點:
* 調用子類和父類共有功能,不可調用子類特有功能;
- 向下轉型:一個已經向上轉型的子類對象可以使用強制類型轉換轉換的格式,將父類引用轉爲子類引用,如果直接創建父類對象,無法向下轉型
//格式
子類型行 變量名 = (子類類型) 父類類型的變量;
特點:
* 可調用子類特有功能,不可調用子類和父類共有功能;
注意:
* 當不需要面對子類類型時,通過提高擴展性,或者使用父類的功能就能完成相應的操作,這時就可以使用向上轉型;
* 當要使用子類特有功能時,就需要使用向下轉型;
* 需要面對具體的子類對象;在向下轉型時容易發生ClassCastException類型轉換異常。在轉換之前必須做類型判斷。
Animal cat = new Cat();
Animal dog = new Dog();
if (dog instanceof Cat){
Cat c = (Cat) dog;
c.run;
}else{
System.out.println("dog is not a instance of Cat");
}
>>> dog is not a instance of Cat
封裝、繼承、多態的作用:
- 封裝:把對象的屬性與方法的實現細節隱藏,僅對外提供一些公共的訪問方式
- 繼承:子類會自動擁有父類所有可繼承的屬性和方法。
- 多態:配合繼承與方法重寫提高了代碼的複用性與擴展性;如果沒有方法重寫,則多態同樣沒有意義。