多态的好处与弊端
多態的好處:
??1.提高了代碼的維護性(繼承保證)
? 2.提高了代碼的擴展性(由多態保證)
多態的弊端:
??1.不能使用子類的特有功能
??2.創建子類對象調用方法(可行但是很多時候是不合理的,而且太占內存)
? 3.?對象間的轉型問題
1.向上轉型(父類引用指向子類對象) Fu??f=new??zi();現在是zi類型的,外面看到的是fu類型的所以是zi向fu的向上轉型
2.向下轉型(父類引用轉為子類對象) Zi????z=(zi)f;看到的是f,外面看到的是zi所以是f向zi的向下轉型
?多態的成員訪問特點:
??成員變量:編譯看左邊,運行看左邊
? 成員方法:編譯看左邊,運行看右邊
??構造方法:創建子類對象的時候,訪問父類的構造方法,對父類的數據進行初始化。
? 靜態方法:編譯看左邊,運行看左邊
??成員方法存在方法的重寫,所以運行看右邊?繼承的時候:
??子類中有和父類中一樣的方法,叫重寫
??子類中沒有父類中出現過的方法,方法被繼承過來了。
抽象類的概述
特點:抽象類和抽象方法必須用abstract關鍵字修飾
抽象類的實例化是靠具體的子類進行實例化的
接口的特點:
?接口不能實例化,以多態的方式實例化?成員變量:只能是常量,而且是靜態的
? ?1.Public int num=10;
? ?2.Public ?final int ?num2=20;
? ?3.Public ?static ?final int num3=30;
注:如果寫成第一種方式的,那么它就是省略了第三種里面的static和final?接口中的變量默認是常量
? ?接口沒有構造方法,因為接口主要是擴展功能的,而沒有具體存在
? ?成員方法:只能是抽象方法 ?默認修飾符public??abstract??
類與類?,類與接口,接口與接口的關系
? ? 類與類繼承關系,只能單繼承,可以多層繼承
?? ?類與接口實現關系
?? ?接口與接口:可以多繼承,單繼承
抽象類和接口之間的區別
?? ?抽象類:
?1.成員區別:a,成員變量:可以是變量
?2.構造方法:有
?3.成員方法:可以抽象,也可以非抽象
? 接口:
1.成員變量:只可以常量
2.長遠方法:只可以抽象;
設計理念區別?
抽象類 被繼承體現的是:is?a的關系。抽象類中定義的是噶繼承體系的共性功能
接口 ? 被實現體現的是:like??a的關系。接口中定義的是該繼承體系的擴展功能。
?
多態的好處與弊端?
當父類的引用指向子類對象時,就發生了向上轉型,即把子類類型對象轉成了父類類型。向上轉型的好處是隱藏了子類類型,提高了代碼的擴展性。?
但向上轉型也有弊端,只能使用父類共性的內容,而無法使用子類特有功能,功能有限制。看如下代碼?
//描述動物類,并抽取共性eat方法?
abstract class Animal {?
? ? ? ?abstract void eat();?
}
// 描述狗類,繼承動物類,重寫eat方法,增加lookHome方法?
class Dog extends Animal {?
? ? ?void eat() {?
? ? ? ? ? System.out.println(“啃骨頭”);?
? ? ?}
? ? void lookHome() {
? ? ? ? ?System.out.println("看家");
? ? }
}
// 描述貓類,繼承動物類,重寫eat方法,增加catchMouse方法?
class Cat extends Animal {?
? ?void eat() {?
? ? ? ?System.out.println(“吃魚”);?
? ?}
? ?void catchMouse() {
? ? System.out.println("抓老鼠");
? ?}
}
public class Test {?
? ? ? ? ? ?public static void main(String[] args) {?
? ? ? ? ? ? ? ? ? ? Animal a = new Dog(); //多態形式,創建一個狗對象?
? ? ? ? ? ? ? ? ? ?a.eat(); // 調用對象中的方法,會執行狗類中的eat方法?
? ? ? ? ? ? ? ? ? ?// a.lookHome();//使用Dog類特有的方法,需要向下轉型,不能直接使用
? ? ? ? ? ? ? ? ? ?// 為了使用狗類的lookHome方法,需要向下轉型
? ? ? ? ? ? ? ? ? // 向下轉型過程中,可能會發生類型轉換的錯誤,即ClassCastException異常?
? ? ? ? ? ? ? ? ?// 那么,在轉之前需要做健壯性判斷?
? ? ? ? ? ? ? ? ?if( !a instanceof Dog){ // 判斷當前對象是否是Dog類型?
? ? ? ? ? ? ? ? ? ? ?System.out.println(“類型不匹配,不能轉換”);?
? ? ? ? ? ? ? ? ? ? ?return;?
? ? ? ? ? ? ? ?? ?}?
? ? ? ? ? ? ? ? ?Dog d = (Dog) a; //向下轉型?
? ? ? ? ? ? ? ? ?d.lookHome();//調用狗類的lookHome方法?
? ? ? ? ?}?
}
我們來總結一下:?
?什么時候使用向上轉型:?
當不需要面對子類類型時,通過提高擴展性,或者使用父類的功能就能完成相應的操作,這時就可以使用向上轉型。?
如:Animal a = new Dog();?
a.eat();?
?什么時候使用向下轉型?
當要使用子類特有功能時,就需要使用向下轉型。?
如:Dog d = (Dog) a; //向下轉型?
d.lookHome();//調用狗類的lookHome方法?
?向下轉型的好處:可以使用子類特有功能。?
?弊端是:需要面對具體的子類對象;在向下轉型時容易發生ClassCastException類型轉換異常。在轉換之前必須做類型判斷。?
如:if( !a instanceof Dog){…}
總結
- 上一篇: 日常生活 -- 嵌入式面试
- 下一篇: 年后,离职