多態:某一類事物的多種存在形態java
如:動物中的貓和狗
貓對象對象的類型是貓類型,即 cat c1= new cat()
但同時貓也是動物中的一種,也能夠把貓成爲動物,即 animal c1= new cat()函數
多態提現:父類的引用指向了本身子類對象。
父類的引用也能夠接受本身的子類對象。設計
多態前提:1.必須是雷和類以前有關係,要麼繼承,要麼實現。
2.存在複寫對象
多態好處:大大提升了程序的擴展性blog
多態弊端:只能使用父類的引用訪問父類的成員繼承
abstract class animal { abstract void eat();
} class cat extends animal { void eat() { System.out.println("cat eat"); } void say() { System.out.println("miu,miu"); } } class dog extends animal { void eat() { System.out.println("dog eat"); } void say() { System.out.println("wang,wang"); } } class DuoDemo1 { public static void main(String[] args) { fuc(new cat()); fuc(new dog()); } static void fuc(animal a)// 多態的表現animal a=new cat();模板設計思想,把不肯定的暴露出來 { a.eat(); } }
向上轉型和向下轉型:編譯
abstract class animal { abstract void eat(); } class animal { void eat(){}; } class cat extends animal { void eat() { System.out.println("cat eat"); } void say() { System.out.println("miu,miu"); } } class dog extends animal { void eat() { System.out.println("dog eat"); } void say() { System.out.println("wang,wang"); } } class DuoDemo1 { public static void main(String[] args) { animal a1=new cat();//多態表現,也是向上轉型 //animal a2=new animal() 當animal爲非抽象類,不能強制向下轉型 /*千萬不要出現把父類對象轉換成子類類型。*/ a1.eat(); cat cl=(cat)a1;//若是子類想調用本身的特有方法,須要強制將父類的引用轉換爲子類類型。也叫向下轉型。 cl.say(); } }
多態中成員特色:模板
1) 在多態中成員函數的特色:
在編譯時期:參閱引用型變量所屬的類中是否有調用的方法。若是有,編譯經過,若是沒有編譯失敗。
在運行時期:參閱對象所屬的類中是否有調用的方法。
簡單總結就是:成員函數在多態調用時,編譯看左邊,運行看右邊。class
2)在多態中,成員變量的特色:
不管編譯和運行,都參考左邊(引用型變量所屬的類)。變量
3)在多態中,靜態成員函數的特色:
不管編譯和運行,都參考作左邊。
class Fu { static int num = 6; void method1() { System.out.println("fu method_1"); } void method2() { System.out.println("fu method_2"); } static void method4() { System.out.println("fu method_4"); } } class Zi extends Fu { static int num = 8; void method1() { System.out.println("zi method_1"); } void method3() { System.out.println("zi method_3"); } static void method4() { System.out.println("zi method_4"); } } class DuoTaiDemo4 { public static void main(String[] args) { Fu f = new Zi(); System.out.println(f.num); f.method1(); f.method2();//多態中的成員函數運行時看右邊,儘管子類沒有method2方法,可是他繼承了父類的method2方法,所以能夠運行 //f.method3();//編譯時後報錯,由於多態中的成員函數編譯時看左邊,也就是看父類,父類沒有method3方法,所以會報錯 f.method4(); Zi z = new Zi(); z.method4(); } }