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

一个笔试题,求解答
求输出结果
希望大神能解释下A b=new B(); 谢谢

class A{
String str="A";
A(){
init();
}
public void init(){
System.out.println(str);
}
}
class B extends A{
String str="B";
B(){
super();
}
public void init(){
System.out.println(str);
}
}

  public static void main(String[] args){
  A b=new B();
  System.out.println(b.str);
  }



------解决方案--------------------
输出应该是:A
—— 成员属性可没有“重写”的概念

希望大神能解释下A b=new B(); 谢谢
—— 需要解释啥?父类的变量自然可以引用子类的对象。
—— 比如: Object obj = new String("123"); 这不是很正常的事情么?
------解决方案--------------------
new B();调用B(){}
B()调用父类的构造(super),
A()构造调用init,调用的是(new B()).init();
###########至此,B的init方法输出,完成构造
执行System.out,(A)b.str输出

执行结果:
null
A
------解决方案--------------------
这个多态最主要的问题在于F s = new S();中s可以使用子类重写父类的方法,但是不用使用子类独有的属性和方法。这样就很清楚了!
------解决方案--------------------
探讨

引用:

new B();调用B(){}
B()调用父类的构造(super),
A()构造调用init,调用的是(new B()).init();
###########至此,B的init方法输出,完成构造
执行System.out,(A)b.str输出

执行结果:
null
A
为什么输出NULL啊

------解决方案--------------------
我来说一说为什么是null的问题:
首先楼主要明白的一点是,当构造方法没有执行完毕时类的属性(除static的外)是被赋值为系统默认的值,所以String为null;
接下来实例化一个B即new B(),根据多态调用父类的构造函数A(),然后调用父类的init(),因为init()被子类覆写,所以调用B的init(),init中输出的是str,但此时B的构造函数还没执行完毕,所以父类中str=null;
综上所述输出为null;
总结:这个题目还是考查基础内容,对java初始化的理解,还是相当有深度的,不知这是哪个公司的笔试题?