老王學java之多態

代碼: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() ;
    }
};

沒法執行,報錯,沒法從父類轉爲子類,由於子類中有父類沒有的東西。只能減小,不能增長。

 

 

總結,父類不能強制轉爲子類,可是子類能夠強制轉爲父類,在實現的過程當中,只要實例化了子類的對象,並且這個方法恰好被重寫的話,那麼輸出的一定是重寫事後的方法。

相關文章
相關標籤/搜索