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...{}
(二)问题:以下输出结果是什么?
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)); ⑨
a2.show(c):
先得明确a2的类型是A(声明类型是A)。所以a2只能调用A中的方法和A子类B中重写的方法,就两个
public String show(D obj)...{
return ("A and D");
}
public String show(A obj)...{
return ("B and A");
}
a2.show(c),c的类型为C,是A的extend类,故5调用的是
public String show(A obj)...{
return ("B and A");
}
输出结果 B and A作者: 刘军亭 时间: 2013-1-25 08:19
A a2=new B(); 创建了A类型B的对象,在内存中是有一个A类型的引用,指向了B类型的一个对象。
System.out.println(a2.show(b)); ④ //B and A
System.out.println(a2.show(c)); ⑤ //B and A
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(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...{}
(二)问题:以下输出结果是什么?
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)); ① //这里就去A类找去...发现没 B 类型 所以会向上转型为A 所以就是结果 A and A
System.out.println(a1.show(c)); ② //这里就去A类找去...发现没 C 类型 所以会向上转型为A 所以就是结果 A and A
System.out.println(a1.show(d)); ③ //这里就去A类找去...发现 D 类型 所以就是结果 A and D
System.out.println(a2.show(b)); ④ //这里是多态B类找...发现没 A父类B 类型的 所以会向上转型为A 但是B类复写了这方法所以就是结果 B and A
System.out.println(a2.show(c)); ⑤ //这里是多态B类找..发现没 A父类C 类型 所以会向上转型为A 但是B类复写了这方法所以就是结果 B and A
System.out.println(a2.show(d)); ⑥ //这里是多态B类找..发现继承了A的 D类型 所以呢 就是A and D
System.out.println(b.show(b)); ⑦ //这里就直接找B类型 结果就是B and B
System.out.println(b.show(c)); ⑧ //这里找B类型 发现没C 类型 C是继承B的 所以会向上转型为B就是 B and B
System.out.println(b.show(d)); ⑨ //这里找B类型 发现继承了A的 D类型 所以呢 就是A and D