java繼承時多態方法與成員的訪問

 

class Father{
    String member = "father";
}
class Son extends Father{
    String member = "son";
    String member2 = "son2";
}
public class test{
    public static void main(String[] args){
        Father f = new Son();    //父類的引用指向子類的對象
        System.out.print(f.member);//輸出爲father,若想輸出子類的成員變量,則要((Son)f).member
       f.member2;//編譯不通過,因爲f引用指向的是Son對象,雖然Son有member2成員變量,但是編譯時系統並不知道,系統只能根據引用類型來判斷,引用類型沒有該成員就會編譯報錯。    
    }
}

引用只能調用其所在類具有的成員,不能調用子類特有的成員。 

但是,方法的調用與此相反,是按對象的類型調用,與引用類型無關,調用的是具體對象所在類中的方法。

靜態方法不能被重寫,可以被繼承。子類“重寫”父類的靜態方法時也只能寫成靜態的,其實質是將父類的靜態方法隱藏,而不是重寫。在這種情況下是根據引用類型來進行調用,與重寫不同(根據對象類型調用)

 

public class Test extends Parent {



    public static void main(String[] args) {
        Test t = new Test();
        t.t2(3);
        //這種情況下,區分重寫(覆蓋)的區別。覆蓋調用子類的方法,重載只調用父類的方法
        Parent t3 = (Parent) t;
        t3.t2(3);//即使子類有更匹配的t2(int),但是這裏只能調用父類自己的方法,沒有就會報錯        

    }

    public void t2(int a) {
        System.out.println("子類t2的int a==" + a);
    }

}

class Parent {
    

    public void t2(double a) {
        System.out.println("父類t2的double a==" + a);
    }
    public void t2(String s){
        System.out.println("父類t2的String s==" + s);
    }

}

輸出:

子類t2的int a==3
父類t2的double a==3.0

 

設Ia與Ib均爲接口,類A實現了Ia,

Ia a = new A();

Ib b = (Ib)a;

任何兩個接口都能相互強轉,編譯不會出錯;但是若類A沒有直接或間接實現Ib,運行時會出錯。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章