[html] view plain copy
public class A {
public void print(A a){
System.out.println("A and A");
}
public void print(D d){
System.out.println("A and D");
}
}
[html] view plain copy
public class B extends A{
public void print(B b){
System.out.println("B and B");
}
public void print(A a){
System.out.println("B and A");
}
/*//继承的
public void print(D d){
System.out.println("A and D");
}*/
}
[html] view plain copy
public class C extends B{
public void print(C c){
System.out.println("C and C");
}
public void print(A a){
System.out.println("C and A");
}
/*//继承的
public void print(D d){
System.out.println("A and D");
}
public void print(B b){
System.out.println("B and B");
}*/
}
[html] view plain copy
public class D extends B{
public void print(D a){
System.out.println("D and D");
}
public void print(A a){
System.out.println("D and A");
}
/*//继承的
public void print(B b){
System.out.println("B and B");
}*/
}
题目如下:
[html] view plain copy
public class Main {
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();
a1.print(b);//(1)A and A
a1.print(c);//(2)A and A
a1.print(d);//(3)A and D
a2.print(c);//(4)B and A
a2.print(c);//(5)B and A
a2.print(d);//(6)A and D
b.print(b);//(7)B and B
b.print(c);//(8)B and B
b.print(d);//(9)A and D
d.print(b);//(10)B and B
d.print(c);//(11)B and B
d.print(d);//(12)D and D
}
}
(1)属于this.show(O)的情形。a1是A类型的对象,优先调用A类中的println方法,此外,a1同时又是A类的一个实例,不存在方法的重写,b是B类的一个实例,同时b属于B类,也属于A类,故a1.print(b)调用的是A类中的public void print (A a)方法。
(3)a1是A类型的一个对象,优先调用A类中的println方法,此外,a1同时又是A类的一个实例,不存在方法的重写,d是D类的一个实例,故调用public void print(D d)方法。
(4)a2.show(c)中,a2是A类型的对象,c属于C类的实例,也属于A类的实例,优先调用A类中的print(A,a)方法,但是a2是B类的一个实例,B类中将print(A,a)方法进行了重写,故调用重写后的print(A,a)方法。
解题技巧:
首先对对象类型进行判断,优先调用父类中的方法,如果子类对父类的方法存在重写,调用重写后的方法。如果没有重写方法,则子类重载了父类的方法,则载入父类的方法