中国电力出版社《 Head First Java(中文版)》 P192页 有如下习题:
给出程序,问输出是什么。
class A{
int ivar=7;
void m1(){
System.out.print("A's m1,");
}
void m2(){
System.out.print("A's m2,");
}
void m3(){
System.out.print("A's m3,");
}
}
class B extends A{
void m1(){
System.out.print("B's m1,");
}
}
class C extends B{
void m3(){
System.out.print("C's m3,"+(ivar+6));
}
}
public class Mix{
public static void main(String[] args){
A a = new A();
B b = new B();
C c = new C();
A a2 = new C();
b.m1();
c.m2();
a.m3();
System.out.println("");
System.out.println("");
c.m1();
c.m2();
c.m3();
System.out.println("");
System.out.println("");
a.m1();
b.m2();
c.m3();
System.out.println("");
System.out.println("");
a2.m1();
a2.m2();
a2.m3();
System.out.println("");
System.out.println("");
}//end of main()
}
书中P195页给答案的是:
B's m1,A's m2,A's m3,
B's m1,A's m2,C's m3,13
A's m1,A's m2,C's m3,13
B's m1,C's m2,A's m3,
发现最后一组有问题,但还不确定。主要是因为自己对 A a2 = new C(); 的理解叫不准。
做实验,发现结果和自己的想法相同,如下:
总结:
A a2 = new C();
是生成了一个C类的对象,对象引用变量为a2, a2指向新生成的对象。
书中P185中说:“在多态下,引用与对象可以是不同类型,如:Animal myDog = new Dog(); 。两者的类型不相同。引用变量的类型被声明为Animal,但对象是Dog”。读了这句话,就明白了,对象是Dog!!
所以,此题中,a2是引用对象,指向C类的对象,而非A类的对象。
P.S. 虽然书中有错误,但《Head First Java》这本书还是不错的。
|