javase多態

Father father=new Son()  父類引用指向子類對象實現多態(動態綁定)

"編譯看左運行看右"

public class Father {

    public void doing() {
        talking();
    }

    public void talking() {
        System.out.println("father is talking!");
    }
}

public class Son extends Father {

    @Override
    public void talking() {
        System.out.println("Son is talking!");
    }

    public static void main(String[] args) {
        Father father = new Son();
        father.doing();
       //輸出結果爲   Son is talking!
    }
}

編譯看左運行看右(但是成員變量除外,父類引用指向子類對象時)

class Fu {
    int value=100;
}
 class Zi extends Fu{
    int value=999;
}

public class Demo04 {
    public static void main(String[] args) {
        Fu fu=new Zi();
        System.out.println(fu.value);
        //輸出結果爲100成員變量無法實現多態,但成員方法可以
    }
}

向上轉型絕對安全,向下轉型有可能會拋出ClassCastException異常

class Useful {
    public void f() {
    }
    public void g() {
    }
}
class MoreUseful extends Useful {
    @Override
    public void f() {
    }
    @Override
    public void g() {
    }
    public void u() {
    }
    public void v() {
    }
    public void w() {
    }
}
public class RTTI_Test {
    public static void main(String[] args) {
        Useful[] usefuls={
                new Useful(),
                new MoreUseful(),
        };
        usefuls[0].f();
        usefuls[1].f();
        ((MoreUseful)usefuls[0]).v(); //向下轉型錯誤,拋出ClassCastException異常
        ((MoreUseful)usefuls[1]).v();
    }
}

父類構造方法儘量避免使用public修飾的方法.

可使用final或private修飾的方法,因爲父類構造器調用被重寫的方法後,可能子類方法中的子類成員變量還未被初始化.

 

 

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