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
重載:方法名要同樣,可是參數類型和個數不同,兩者必須最少居其一。返回值和訪問修飾符無關重載的區分,能夠同樣也能夠不同。對象
也就是說若是一個類中的方法名和參數徹底一致,而只是返回值或訪問修飾符不同的兩個方法會報錯,至關於方法重複。繼承關係的類之間的方法定爲這種狀況也報錯,由於自己就至關於在一個類中。繼承