package com.mytest;class Base{

private int i = 2;

public Base () {

this.display();
}
public  void display(){

System.out.println(i);
}

}class Derived  extends Base {

private int i =22;

public Derived (){

i = 222;
}

public void display(){

System.out.println(i);
}}public class TestDemoDerived{

public static void main(String args[]){

new Derived();
}

}

解决方案 »

  1.   

    0.
    因为Base的构造方法调了Derived.display()
      

  2.   

    考察的是创建对象时,代码块的执行顺序
    在调用Derived类的display方法的时候,起i值尚未初始化,所以只能打印其默认值0
      

  3.   

    在Base的构造房里里调用Derived的display方法,而此时Derived的i属性还没有初始化,所以打印的是其默认值。
    程序的执行顺序是:调用Base的构造方法->初始化Base的i->然后调用Derived的display方法(这就是Java中的多态性)->初始化Derived的i->...
      

  4.   

    过程:
    父类成员初始化i为2,调父类构建器,this.display()被调用,因子类覆盖了该方法,
    所以调用了子类的display,显示子类的成员变量i,尚未初始化,输出0
    然后子类中成员变量初始化为22,构建函数重新赋值为222,但已和屏幕输出无关。
      

  5.   

    当初始化某个类的子类时(某个类的初始化时,要求他的超类已经初始化)
      所以在超类初始化时 运行Derived 中的display方法
      但是 i 变脸没有被初始化。 就是默认值 0
      这个机制是JAVA 虚拟机里面的 所有的类在加载的时候 分为装载, 链接 初始化。。
       只有初始化的时候 在赋值我们赋值的变量 其他的时候 是默认值。。