子类B的方法覆盖父类A的方法,结果是:BBB
                                  Bvar=2222
                                  Avar=1111
吗?

解决方案 »

  1.   

    I give you my idea:
    (1)in the function main, new B() first call A(),so we can see "AAA". 
    (2)because the method of dosomething is replaced by this same function in the B class(because we get the pointer of B),so we can get Bvar=0;other results can understand clearly. I donot say more.If you have some problem,you can talk with me directly.
      

  2.   

    我是这样认为的
    首先实例化B()
    B是从A继承过来的,那么和合成不同
    就会先调用A的method&constructor
    要调用class A中的各种方法和实例化构建器
    首先要实例化constructor A()
    而在A()中,会调用方法dosomthing但是由于
    子类B中的方法dosomething 会覆盖A中的同名方法
    所以调用B.doSomething()
    要注意的事,在此时,因为还没有
    执行public int Bvar = 2222;
    所以,Bvar还是一个null
    完成A()之后,再继续调用B里头的方法和实例化构建器
    这个时候,是先将数据成员初始化
    所以Bvar有了值2222而程序自始至终没有调用A.doSomething
    所以Avar始终是null这个是我的看法,如果错了,请指正
    如果对了,请给点分,谢谢
      

  3.   

    结果如Jory所所说,这里我补充一下 构造器的执行顺序,以利于理解执行结果
    new B() 的执行过程如下
    之前处始化 Bavr=0;
    1 隐含调用super() 即A();
    2 处始化 Bavr=2222;
    3 执行B() 中的其他语句;
          System.out.println("BBB");
          doSomething();
          System.out.println("Avar=" + Avar);
      
      

  4.   

    int 型的成员变量一定被初始化为0,不会为null
      

  5.   

    ...严格说来,int开始没有值,必定是空
    只是在java中,编译器力求让所有的值
    正确的初始化,所以自动给int加上一个0
    我觉得有必要说清楚...
      

  6.   

    答案是:
        AAA
        Bvar=0
        BBB
        Bvar=2222
        Avar=0
    原因是:
        由于B是从A继承来的所以会首先初始化A,使得Avar=0,调用A的构造函数,所以输出AAA,在调用doSomething时,由于多态调用B的doSomething,所以输出Bvar=0,再初始化B的成员变量,然后调用B的构造函数,所以输出BBB和Bvar=2222,Avar=0
      

  7.   

    正确答案为
    AAA
    Bvar=0
    BBB
    Bvar=2222
    Avar=0 
      

  8.   

    多谢各位!其实关键问题就是在于class A的doSomething并未执行,而是被B类的方法覆盖,能否给出一个更深入的理解?多谢!
    另有一问题,还是以上代码,若将两个类中的doSomething()方法都声明为static,则结果又不同,又该如何解释?
      

  9.   

    多谢各位!其实关键问题就是在于class A的doSomething并未执行,而是被B类的方法覆盖,能否给出一个更深入的理解?多谢!就是这样的,这个解释已经很深入了:-)
    另有一问题,还是以上代码,若将两个类中的doSomething()方法都声明为static,则结果又不同,又该如何解释? 对于static方法,多态/override不起作用:这时是hide
      

  10.   

    如果两个类中的doSomething()方法都声明为static,那么Avar和Bvar也必须声明成static,这样的话将不会产生多态,这时将会调用A的doSomething,结果是:
    AAA
    A.doSomething()
    BBB
    Bvar=2222
    Avar=1111