當父類型引用指向子類型對象會導致程序存在編譯階段綁定和運行階段綁定兩個不同的狀態,這種機制可以成爲多態機制.
向上轉型:子類型-->父類型,又稱爲自動類型轉換.
向下轉型:父類型-->子類型,又稱爲強制類型轉換.
//Animal.java
package qw;
public class Animal {
public void move()
{
System.out.println("動物在移動");
}
public void eat() {
System.out.println("動物在吃");
}
}
//Bird.java
package qw;
public class Bird extends Animal{
public void fly()
{
System.out.println("小鳥在飛");
}
public void eat() {
System.out.println("小鳥在吃東西");
}
}
//Cat.java
package qw;
public class Cat extends Animal{
public void move()
{
System.out.println("貓在移動");
}
public void catchMouse()
{
System.out.println("貓在捉老鼠");
}
}
//Test.java
package qw;
public class Test {
public static void main(String[] args) {
Animal a1 = new Animal();
a1.move();
//向上轉型(子對象向父對象轉型),a2使用的是繼承的方法,可使用方法覆蓋父類繼承下來的方法.
//1,編譯階段編譯器檢查a2這個引用的數據類型爲Animal,由於Animal.class字節碼當中有move()方法
//所以編譯通過了,這個階段成爲靜態綁定
//2,在程序運行階段,由於JVM堆內存真實存在的對象是Cat對象,所以一定調用的是Cat對象的move()方法,這個過程
//稱爲動態綁定
//3.無論Cat類有沒有重寫方法,運行階段調用的一定是Cat類的move()方法,因爲JVM堆內存中真實存在的對象是Cat對象.
Animal a2 = new Cat();
a2.move();
a2.eat();
//如果想訪問子對象特有的方法,需強制換成子對象,即向下轉型(父對象向子對象轉型)
if(a2 instanceof Cat) {
Cat a3 = (Cat)a2;
a3.catchMouse();
}
else {
Bird a3 = (Bird) a2;
a3.fly();
}
}
}
運行結果:
特點:無論是向上轉型還是向下轉型,兩種類型之間一定要有繼承關係,且具有面向抽象編程的特性,.
多態作用:降低程序的耦合度,提高程序的拓展力.