java多態部分理解

1. 重寫:子類對父類中某些方法進行重新定義,在調用這些方法時就會調用子類的方法。

2. 向上轉型

public class Wine {
    public void fun1(){
        System.out.println("Wine 的Fun.....");
        fun2();
    } 

    public void fun2(){
        System.out.println("Wine 的Fun2...");
    }
}

class JNC extends Wine{
    /**
     * @desc 子類重寫父類方法
     *        父類中不存在該方法,向上轉型後,父類是不能引用該方法的
     * @param a
     * @return void
     */
    public void fun1(String a){
        System.out.println("JNC 的 Fun1...");
        fun2();
    }

    /**
     * 子類重寫父類方法
     * 指向子類的父類引用調用fun2時,必定是調用該方法
     */
    public void fun2(){
        System.out.println("JNC 的Fun2...");
    }
}

class Test {
    public static void main(String[] args) {
        Wine a = new JNC();
        a.fun1();
    }
}

//====================================================================
結果:Wine 的Fun.....
     JNC 的Fun2...

分析:在這個程序中子類JNC重載了父類Wine的方法fun1(),重寫fun2(),而且重載後的fun1(String a)與 fun1()不是同一個方法,由於父類中沒有該方法,向上轉型後會丟失該方法,所以執行JNC的Wine類型引用是不能引用fun1(String a)方法。而子類JNC重寫了fun2() ,那麼指向JNC的Wine引用會調用JNC中fun2()方法。

public class Wine {
    public void fun1(){
        System.out.println("Wine 的Fun.....");
        fun2();
    }

    public void fun2(){
        System.out.println("Wine 的Fun2...");
    }
}

class JNC extends Wine{
    /**
     * @desc 子類重寫父類方法
     *        父類中不存在該方法,向上轉型後,父類是不能引用該方法的
     * @param 
     * @return void
     */
    public void fun1(){//改爲重寫,非重載
        System.out.println("JNC 的 Fun1...");
        fun2();
    }

    /**
     * 子類重寫父類方法
     * 指向子類的父類引用調用fun2時,必定是調用該方法
     */
    public void fun2(){
        System.out.println("JNC 的Fun2...");
    }
}

class Test {
    public static void main(String[] args) {
        Wine a = new JNC();
        a.fun1();
    }
}

//===============================================================================
輸出:JNC 的 Fun1...
	 JNC 的Fun2...

總結:指向子類的父類引用由於向上轉型了,它只能訪問父類中擁有的方法和屬性,而對於子類中存在而父類中不存在的方法,該引用是不能使用的,儘管是重載該方法。若子類重寫了父類中的某些方法,在調用該些方法的時候,必定是使用子類中定義的這些方法(動態連接、動態調用)。(子類中有的,父類沒有,無法使用。子類有,父類有,使用子類中的方法)

牢牢記住一句話:無論向上向下轉型,編譯看左邊,運行看右邊。
意思就是:編譯時候左邊的對象有沒有該方法(不嚴謹),運行時候看new的對象是誰,就調用誰的方法

文章借鑑點擊跳轉

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