http://heipark.iteye.com/blog/1439114  这篇文章真不错

解决方案 »

  1.   

    我只知道要是这样写,我的IDE会直接出警告
      

  2.   

    楼主。我运行后发现,A类中的show方法没有调用,两次调用的都是B类中的show方法?
    第一次直接运行A中构造函数,然后new B();再执行B?
      

  3.   

    看一眼是10 20,后来发现被骗了。。
    类B继承A重写了show方法,所以初始化父类A的时候调用的show应该是重写后的show
    个人理解不知道对不对
      

  4.   

        new B()后,会先给父类的变量赋值,即a=10,然后调用父类的构造方法A(),A()里面调用子类B的show()方法,因为B重写了show()方法而且实际对象是B嘛(如果new A()的话,才是调用A的show()方法),A()里面调用子类B的show()方法的时候,还没轮到B的属性赋值,只有加载B的时候赋了a初值0,所以这时打印0了;接下来就是对B类的属性赋值,即这时B类的a的值会是20了,调用B的构造方法B(),然后show(),这时就会打印出20了。不明白的同学可以先去百度一下“类的执行顺序”
      

  5.   

    构造方法执行:
    1:super();
    2:构造函数中代码;
    3:字段的初始化表达式。
      

  6.   

    我先说一下 加载顺序吧
    1>函数从  main 方法执行
    2>加载 class文件,加载的同时,还会初始化 静态成员变量(这个题目中没有)
    3>从main方法的 ,第一条语句执行
         new B();    B有父类A,执行A的构造函数( 执行构造函数之前,会先初始化 A中的 非静态 成员变量,静态成员变量已经在加载class文件的时候初始化过了),之后,执行B的构造函数( 执行构造函数之前,会先初始化 A中的 非静态 成员变量,静态成员变量已经在加载class文件的时候初始化过了),所以,正常来讲 ,打印出来的应该是  10   20。
    但是实际情况确实  0   20
    原因是 父类中的  show()方法被子类覆盖,父类构造方法中调用的  show()方法不再是父类中的show()方法,而是子类中的show()方法,此时子类中的成员变量a还没有初始化,所以打印的是 0。之后再执行子类的构造函数,调用 子类自身的show, 打印的值是20(这个时候 子类的 a 已经初始化过了)