共计 1758 个字符,预计需要花费 5 分钟才能阅读完成。
何為多態性:
對象的多態性: 父類的援用指向子類的對象(或子類的對象賦給父類的援用)
Person p = new Man();
Object obj = new Date();
多態性的应用:虛擬办法調用
有了對象的多態性以後,我們在編譯期,只能調用父類中聲明的办法,但運行期,我們實際執行的是子類重寫父類的办法。
總結: 編譯看左邊; 運行看右邊。
多態性的应用前提:
1)類的繼承關係 2)办法的重寫
public class Test {public static void main(String[] args) {show(new Cat()); // 以 Cat 对象调用 show 办法
show(new Dog()); // 以 Dog 对象调用 show 办法
Animal a = new Cat(); // 向上转型
a.eat(); // 调用的是 Cat 的 eat
Cat c = (Cat)a; // 向下转型
c.work(); // 调用的是 Cat 的 work}
public static void show(Animal a) {a.eat();
// 类型判断
if (a instanceof Cat) { // 猫做的事件
Cat c = (Cat)a;
c.work();} else if (a instanceof Dog) { // 狗做的事件
Dog c = (Dog)a;
c.work();}
}
}
abstract class Animal {abstract void eat();
}
class Cat extends Animal {public void eat() {System.out.println("吃鱼");
}
public void work() {System.out.println("抓老鼠");
}
}
class Dog extends Animal {public void eat() {System.out.println("吃骨头");
}
public void work() {System.out.println("看家");
}
}
多態性应用的留神點:
對象的多態性,知識用於办法,不適用於屬性(編譯和運行都看左邊)
關於向上轉型和向下轉型(類比根本數據類型):
向上轉型: 多態
向下轉型: 為了調用子類特有的屬性和办法
説明:
由於對象有了多態性以後,內存實際上是加載了子類特有的屬性和办法,然而由於變量聲明為父類類型,導致編譯時,只能調用父類中聲明的屬性和办法。子類特有的屬性和办法不能調用。如何能力調用子類特有的屬性和办法呢?应用向下轉型
如何實現向下轉型?
应用強制類型轉換符:()
应用時候的留神點:
应用強轉時,可能出現 ClassCastException 的異常。
向下轉型時能够应用 instanceof 進行判斷,一旦返回 true 就能够向下轉型了,如果返回 false 就不可進行向下轉型
package com.gavinjoeng.java;
class Fruit{public void Name(){System.out.println("我叫水果!");
}
}
class Apple extends Fruit{
@Override
public void Name(){System.out.println("我叫蘋果!");
}
}
public class FruitTest{public static void main(String[] args) {Fruit apple = new Apple();// 向上轉型(多態)
apple.Name();
Apple apple1 = (Apple)apple;// 向下轉型
apple1.Name();// 向下轉型時調用的時子類的屬性}
}
輸出:
我叫蘋果!我叫蘋果!
以上為正確的向下轉型
因為 apple 指向子類對象,所以子類 apple1 也能够指向 apple,向下轉型後都是指向子類對象,所以調用的都是子類的办法
Fruit apple = new Apple();// 向上轉型(多態)
apple.Name();
Apple apple1 = (Apple)apple;// 向下轉型
apple1.Name();// 向下轉型時調用的時子類的屬性
以下為不平安的向下轉型
Fruit f = new Fruit();
Apple apple3 = (Apple)f;// 編譯通過但運行出錯
apple3.Name();
f 是父類對象,子類實例 apple3 不能指向父類。所以為了平安的類型轉換最好应用 if(A instanceof B)判斷一下。
正文完