日期:2014-05-20  浏览次数:20742 次

java输出很不明白~~~~求指点
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(); 时,会输出什么?

------解决方案--------------------

类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.