多態--方法重寫的三個要點

package com.zxp.java.duotai;

class A {
    public String show(D obj) {
        return ("A and D");
    }

    public String show(A obj) {
        return ("A and A");
    }
}

class B extends A {
    public String show(B obj) {
        return ("B and B");
    }

    public String show(A obj) {
        return ("B and A");
    }
    
    /*若是把B的對象賦值給父類A的變量a,
     * 則a只能看到A類的方法show(D obj),和重寫後的show(A obj),
     * a不能看到show(B obj),由於 show(B obj)是B纔有的方法
     * 這裏須要強調一點,B類只是重寫了 show(A obj)方法
     * 關於方法的重寫須要符合下面的三個要點
      1.「==」: 方法名、形參列表相同。
      2.「≤」:返回值類型和聲明異常類型,子類小於等於父類。
      3.「≥」: 訪問權限,子類大於等於父類。
      
     -------------下面是Class B實際的方法,-------------------------
     public String show(D obj) {
        return ("A and D");
    }

    public String show(B obj) {
        return ("B and B");
    }
    
    public String show(A obj) {
        return ("B and A");
    }
    ---------------------------------
    */
    
}

class C extends B {

}

class D extends B {

}

public class Test {
    public static void main(String[] args) {
        A a1 = new A();
        A a2 = new B();  //這是的a2能看到的方法有
        B b = new B();
        C c = new C();
        D d = new D();

        System.out.println("1--" + a1.show(b));
        System.out.println("2--" + a1.show(c));
        System.out.println("3--" + a1.show(d));
        System.out.println("4--" + a2.show(b));
        System.out.println("5--" + a2.show(c));
        System.out.println("6--" + a2.show(d));
        System.out.println("7--" + b.show(b));
        System.out.println("8--" + b.show(c));
        System.out.println("9--" + b.show(d));
        
        /*1--A and A
        2--A and A
        3--A and D
        4--B and A
        5--B and A
        6--A and D
        7--B and B
        8--B and B
        9--A and D*/  
    }
}java

 

當超類對象引用變量引用子類對象時,是被引用對象決定了要調的方法而不是引用的變量決定要調的方法,可是這個被調用的方法必須是在超類中定義過的,也就是說被子類覆蓋的方法,可是它仍然要根據繼承鏈中方法調用的優先級來確認方法,該優先級爲:this.show(O)、super.show(O)、this.show((super)O)、super.show((super)O)。this

 

順便提一下重載spa

重載:方法名要同樣,可是參數類型和個數不同,兩者必須最少居其一。返回值和訪問修飾符無關重載的區分,能夠同樣也能夠不同。對象

也就是說若是一個類中的方法名和參數徹底一致,而只是返回值或訪問修飾符不同的兩個方法會報錯,至關於方法重複。繼承關係的類之間的方法定爲這種狀況也報錯,由於自己就至關於在一個類中。繼承

相關文章
相關標籤/搜索