本帖最后由 ZONGYUTONG91 于 2016-4-21 00:32 编辑
分析以下程序的打印结果,并思考原因:
class {
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{}
分析:① a1是A对象的引用,a1.show(b)调用本类的show方法,传入参数是B对象的引用,B继承A,所以结果是A and A。
② a1.show(c)调用本类的show方法,传入参数是C对象的引用,C继承B间接的继承A,所以结果是A and A。
③ a1.show(d)调用本类的show方法,传入参数是D对象的引用,所以结果是A and D
④ a2父类引用指向子类对象,a2.show(b)编译看左运行看右,因为B继承A所以参数传b不会报错,编译时看A类中参数传A类型的show方法,运行看B类类中参数传A类型的show方法,结果是B and A
⑤ a2父类引用指向子类对象,a2.show(c)编译看左运行看右,因为C继承B间接的继承A所以参数传c不会报错,编译时看A类中参数传A类型的show方法,运行看B类类中参数传A类型的show方法,结果是B and A
⑥ a2父类引用指向子类对象,a2.show(d)编译看左运行看右,编译时看A类中参数传D类型的show方法,又因为B类中没有该方法,所以运行时调用A的show方法,结果是A and D
⑦ b是B对象的引用,b.show(b)直接调用本类的show方法,传入参数是b,结果是B and B
⑧ b是B对象的引用,b.show(c)直接调用本类的show方法,传入参数是c,本类中没有传入C类型参数的show方法,从父类中也没有继承,但是C继承B,所以结果是B and B
⑨ 直接调用本类的show方法,传入参数是d,本类中没有传入d类型参数的show方法,但从父类中有继承,结果是A and D
|
|