package test;
public class test{
public static void main(String[] args) {
A a1 = new A();
A a2 = new B();
B b = new B();
C c = new C();
D d = new D();
System.out.println(a1.show(b));
System.out.println(a1.show(c));
System.out.println(a1.show(d));
System.out.println(a2.show(b));
System.out.println(a2.show(c));
System.out.println(a2.show(d));
System.out.println(b.show(b));
System.out.println(b.show(c));
System.out.println(b.show(d));
}
}
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");
}
}
class C extends B{}
class D extends B{}
System.out.println(a1.show(b));
a1是A類型A對象
所以看參數
打印A and A
System.out.println(a1.show(c));
a1是A類型A對象
所以看參數
打印A and A
System.out.println(a1.show(d));
a1是A類型A對象
所以看參數
打印A and D
System.out.println(a2.show(b));
a2是A類型B對象
所以a2.show(b)是調用A類的方法,但是B類重寫了這個方法
所以調用的是B類的方法
public String show(A obj){
return ("B and A");
}
打印B and A
System.out.println(a2.show(c));
a2是A類型B對象
所以a2.show(b)是調用A類的方法,但是B類重寫了這個方法
所以調用的是B類的方法
public String show(A obj){
return ("B and A");
}
打印B and A
System.out.println(a2.show(d));
a2是A類型B對象
所以a2.show(b)是調用A類的方法,
B類沒有重寫該方法
打印A and D
System.out.println(b.show(b));
b是B類型B對象
調用B方法看參數
參數遵循就近原則
打印B and B
System.out.println(b.show(c));
b是B類型B對象
調用B方法看參數
參數遵循就近原則
打印B and B
System.out.println(b.show(d));
b是B類型B對象
調用B方法看參數
D繼承A
調用父類的方法
打印A and D