本帖最后由 yaoxz123 于 2012-12-12 00:04:21 编辑

解决方案 »

  1.   

    深层次的继承还真没接触过,不过个人感觉是不是因为你的类A里面的str变量的声明不对?例如增加static?等待高手解答!
      

  2.   

    你把class  A里的函数名换个名就正确了  至于为什么  本人菜鸟 不清楚。。
      

  3.   

    对象初始化顺序决定的.
    楼主看看:
    http://bbs.csdn.net/topics/390255335
      

  4.   


      public B()
      {
       fun();
      }
      问题就在这个地方了,执行时包含public A(),但是A()的执行过程中没有得到参数str的值,所以是null 
    static。
      

  5.   

    当用 new B()时,
    先初始化基类 所以先调用new A(),
    但是由于A中的fun()以及str被子类覆盖了,此时调用的是子类的fun(),
    而子类的str还没被初始化,所以第一个是null至于第二个就好理解了,子类实例变量初始化了才进行构造,运行 fun()
    lz需复习下java继承的初始化顺序的有关知识,此类问题在笔试题中经常出现
      

  6.   

    子类初始化时会先递归调用父类的构造器。
    在父类构造器中调用子类重写过的方法时会调用子类的方法,因此A构造器中的fun()为子类的fun(),其中的str为子类的str,这时候还没初始化,因此首先输出null;
    父类构造器初始化完成后,则调用子类的构造器。子类str的赋值实际上是在子类构造器中优先完成的,子类fun()调用时,str已经完成了初始化,输出B。
      

  7.   

    楼上正解。
    把你的程序调试起来,F5、F6、F7一路按下去,就能看到现象了。
      

  8.   

    其实这个问题很简单。
    A和B的两个方法都叫fun()
    Java会以为B里的fun()重写了A里的fun()
    当程序执行A构造方法时,执行到fun()
    会直接执行到B里的fun()
    因为当时B还没赋值
    所以是空。
    这个就像是接口和实现类差不多。
    是指向问题。
    多写点程序就知道了。
    同意楼上的。
    写完Source自己调试一下。
    可以帮助你快速成长起来哦。
      

  9.   

    楼上说的对,应为你A和B类变量str和方法fun都是同命,所以B类继承A类的时候就把这些相当于覆盖了A类的变量str和方法fun,当执行A的构造方法时,B类的str变量还没有初始化,而此时执行fun方法就输出null,lz以后遇到不懂得时候就多加几个输出语句或者用调试看看程序是怎么执行的,知道了程序的执行顺序你的问题差不多就解决了