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();
}
}
因为Base的构造方法调了Derived.display()
在调用Derived类的display方法的时候,起i值尚未初始化,所以只能打印其默认值0
程序的执行顺序是:调用Base的构造方法->初始化Base的i->然后调用Derived的display方法(这就是Java中的多态性)->初始化Derived的i->...
父类成员初始化i为2,调父类构建器,this.display()被调用,因子类覆盖了该方法,
所以调用了子类的display,显示子类的成员变量i,尚未初始化,输出0
然后子类中成员变量初始化为22,构建函数重新赋值为222,但已和屏幕输出无关。
所以在超类初始化时 运行Derived 中的display方法
但是 i 变脸没有被初始化。 就是默认值 0
这个机制是JAVA 虚拟机里面的 所有的类在加载的时候 分为装载, 链接 初始化。。
只有初始化的时候 在赋值我们赋值的变量 其他的时候 是默认值。。