求输出结果
希望大神能解释下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);
     }

解决方案 »

  1.   

    输出应该是:A
    —— 成员属性可没有“重写”的概念希望大神能解释下A b=new B(); 谢谢
    —— 需要解释啥?父类的变量自然可以引用子类的对象。
    —— 比如: Object obj = new String("123"); 这不是很正常的事情么?
      

  2.   

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

  3.   

    这个多态最主要的问题在于F s = new S();中s可以使用子类重写父类的方法,但是不用使用子类独有的属性和方法。这样就很清楚了!
      

  4.   

    B类构造的时候先调用超类的构造,因此问题就是创建对象的时候fields段的初始化和constructor谁先执行,你可以试下自己创建个新类代码这么写。
    String str="A";
    A(){
     this.str = "B"
    }
    最后打印下结果看是A还是B,就知道谁先执行谁被覆盖了。个人觉得这种类似八股文一点意思都没有。。谁会在fields段赋值后又在constructor中初始化不过谁能说说同一个对象中有一模一样的2个属性str这个不觉得很奇怪么。。即使超类按照封装的概念是原子单元但毕竟不是还在子类中么。编译的bytecode文件中有什么区分么。
      

  5.   

    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 class CAB
    {
      public static void main(String[] args)
    {
      A b=new B();
      System.out.println(b.str);
      }
    }
    运行后输出null,A
    A b=new B();这是多态,B继承了A,这就是多态问题,父类的引用指向子类的对象;
    方法可以重写,也可以重载, 但是属性不能重写, 在多态实例化的过程中,首先调用父类的构造方法,然后再调用子类的构造方法;
    在调用子类的构造方法时,通过super(),调用父类的属性,从而实现输出;
      

  6.   

    真正的运行顺序应该是:
     首先进入了A的构造方法,而A的构造方法调用的了init方法,
     这个init方法不是A自己的init方法,而是B继承了A之后重写了A的init方法(也就是说A构造方法里
     调用的init方法是B的init方法),所以B的这个init方法输出了null,这个null是A b = new B()
     的时候就已经输出的,下面的Sysoutprintln(b.str)输出A是,因为声明的对象是A,所以他调用的
     是A里的属性!
      

  7.   

    解释一下null的问题:
    在执行new B()时,先把成员变量敷默认值,B里的str为null.
    之后追溯其父类,到父类同样要把父类的成员变量赋默认值,A里的str为null,(一直到Object).
    再返回来,每到一级先给成员变量显式赋值, A里给str赋值'A'。再执行构造函数语句,init(). 这个init()被子类重写了,所以执行子类的init()方法,输出子类的str,这时子类的str是null.
    执行完父类的构造函数后,返回到子类继续初始化,这时才给str显式赋值'B'.再执行构造函数语句。输出b.str,因为b是父类引用,所以输出A.
    参考一下:
    http://wenwen.soso.com/z/q191435823.htm
      

  8.   

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