Java多態
多態性
可以理解爲事物存在的多種體現形態。
abstract class Animal {
public abstract void eat();
}
class Cat extends Animal {
public void eat() {
System.out.println("fish");
}
public void catchMouse() {
System.out.println("Catch Mouse");
}
}
class Dog extends Animal {
public void eat() {
System.out.println("bone");
}
public void kanJia() {
System.out.println("KAanJia");
}
}
class DuotaiDemo {
public static void man(String[] args) {
Animal c = new Cat(); // 多態的體現
Animal d = new Dog(); // 多態的體現
fun(new Cat()); // 多態的出現大大提高了程序的擴展性
}
public static void fun(Animal a) // 提高了代碼的複用性
{
a.eat();
}
}
-
多態的體現
父類的引用指向自己的子類對象,父類的引用也可以接收自己的子類對象
父類父類引用 = new 子類實例(Animal c = new Cat())
-
多態的前提
必須是類與類之間必須有關係,要麼繼承,要麼實現,並且存在覆
-
多態的轉型
-
向上轉型(自動完成) 父類 父類引用 = new子類實例(Animal c= new Cat())
向下轉型(強制轉換) 子類 子類引用 = (子類)父類引用(Cat c1 = (cat)c)
能夠進行向下轉型的只能是子類進行向上轉型的父類應用轉換成原來的子類
*instanceof關鍵字
Instanceof是Java中的二運運算符,也是Java中的保留關鍵字,作用是測試左邊的對象是否是右邊類的實例
Cat c= new Cat();
If(cinstanceof Cat)
System.out.println(“c是Cat的實例”);
*多態中非靜態成員函數的特點:
在編譯時期:參閱父類中是否有調用的方法,如果有則編譯通過,否則編譯失敗
在運行時期:運行子類的方法
*多態中成員變量的特點
無論編譯還是運行,都參考左邊(引用變量所屬的類)
class Fu {
int x = 5;
public static void method() {
System.out.println("Fu method");
}
}
class Zi extends Fu {
int x = 8;
public static void method() {
System.out.println("Zi method");
}
public static void main(String[] args) {
Fu z = new Zi();
System.out.println(z.x); // 結果爲5
Zi z1 = new Zi();
System.out.println(z.x); // 結果爲8
}
}
*多態中靜態成員函數的特點
無論編譯還是運行,都參考左邊(引用變量所屬的類)
Fu zi = new Zi();
zi.method(); //結果是Fu method
Zi zi1 = new Zi();
zi1.method(); //結果是Zi method
-
多態的好處
多態的出現大大的提高了程序的擴展性。
-
多態的弊端
只能使用父類的引用訪問父類中的成員,而不能訪問子類所特有的成員。