代碼:this
class A{ // 定義類A public void fun1(){ // 定義fun1()方法 System.out.println("A --> public void fun1(){}") ; } public void fun2(){ this.fun1() ; // 調用fun1()方法 } }; class B extends A{ public void fun1(){ // 此方法被子類覆寫了 System.out.println("B --> public void fun1(){}") ; } public void fun3(){ System.out.println("B --> public void fun3(){}") ; } }; public class PolDemo01{ public static void main(String asrgs[]){ B b = new B() ; // 實例化子類對象 A a = b ; // 向上轉型關係 a.fun1() ; // 此方法被子類覆寫過 //a.fun3() ;//報錯,類沒有這個方法 } }; 輸出的結果是:B --> public void fun1(){}
代碼:spa
class A{ // 定義類A public void fun1(){ // 定義fun1()方法 System.out.println("A --> public void fun1(){}") ; } public void fun2(){ this.fun1() ; // 調用fun1()方法 } }; class B extends A{ public void fun1(){ // 此方法被子類覆寫了 System.out.println("B --> public void fun1(){}") ; } public void fun3(){ System.out.println("B --> public void fun3(){}") ; } }; public class PolDemo02{ public static void main(String asrgs[]){ A a = new B() ; // 向上轉型關係 B b = (B)a ; // 發生了向下轉型關係 b.fun1() ; b.fun2() ; b.fun3() ; } };
輸出結果:code
B------>fun1()對象
B------>fun1()blog
B------>fun3()class
解釋:方法
A a=new B();總結
執行過程是先產生B的對象,在產生過程當中,fun1()方法已經被重寫了static
這個時候a便是A的實例,也是B的實例di
即 a instanceof A==a instanceof B==true
因此以後的fun1()方法都是B中的。
代碼:
class A{ // 定義類A public void fun1(){ // 定義fun1()方法 System.out.println("A --> public void fun1(){}") ; } public void fun2(){ this.fun1() ; // 調用fun1()方法 } }; class B extends A{ public void fun1(){ // 此方法被子類覆寫了 System.out.println("B --> public void fun1(){}") ; } public void fun3(){ System.out.println("B --> public void fun3(){}") ; } }; public class PolDemo03{ public static void main(String asrgs[]){ A a = new A() ; // 實例化了一個父類對象 B b = (B)a ; // 發生了向下轉型關係 b.fun1() ; b.fun2() ; b.fun3() ; } };
沒法執行,報錯,沒法從父類轉爲子類,由於子類中有父類沒有的東西。只能減小,不能增長。
總結,父類不能強制轉爲子類,可是子類能夠強制轉爲父類,在實現的過程當中,只要實例化了子類的對象,並且這個方法恰好被重寫的話,那麼輸出的一定是重寫事後的方法。