public class Father{
private String name="FATHER";
public Father(){
whoAmI();
tellName(name);
}
public void whoAmI(){
System.out.println("Father says, I am " + name);
}
public void tellName(String name){
System.out.println("Father's name is " + name);
}
}
public class Son extends Father{
private String name="SON";
public Son(){
whoAmI();
tellName(name);
}
public void whoAmI(){
System.out.println("Son says, I am " + name);
}
public void tellName(String name){
System.out.println("Son's name is " + name);
}
}问题:当执行 Father who = new Son(); 时,会输出什么?

解决方案 »

  1.   


    类Father 的方法whoAmI()和tellName(String name)都被子类Son重载了,所以父类的这两个方法在执行(Father who = new Son(); )语句时不会执行了。2 在执行子类构造函数之前,先为子类的变量name分配空间,并赋默认值null,即子类的name=null.3 上溯父类,执行个父类的构造函数前,同样为父类(Father)的成员变量name分配空间,并赋值null.4 再上溯到Object,之后返回到父类初始化,先把成员变量显式赋值 name="FATHER".5 执行父类构造函数,执行whoAmI()这个方法,第1条说了,都执行子类的方法。所以执行子类的whoAmI(),输出:
    Son says, I am null.  //这是因为子类的成员变量还没显式赋值,其值是null。这个可能最不好理解。6  执行tellName(name),也是执行的子类的方法,但这时是有实参的,实参是 name(FATHER).所以输出:
    Son's name is FATHER.7 父类的构造方法执行完了,回到子类继续,先给name赋值"SON",执行两个方法,这就好理解了。最后输出:
    Son Says, I am SON.
    Son's name is SON.
      

  2.   

    楼主可参考一下:
    http://wenwen.soso.com/z/q191435823.htm