class Fu
{
int num=9;
Fu()
{
System.out.println("fu constructor run");
show();
}
void show()
{
System.out.println(num);
}
}
class Zi extends Fu
{
int num=8;
{
System.out.println(“constructor code…”+num);
}
Zi()
{
System.out.println("zi constructor..."+num);
}
void show()
{
System.out.println("zi show..."+num);
}
}
class Test
{
public static void main(String[] args)
{
new Zi ();
}
}
正如上边所写的,初始化过程是按着super-显示初始化-构造代码块初始化-构造函数初始化这样大体的过程。
上述例子中,过程如下:
定义子类对象new Zi,此时num默认初始化为0—-
找到Zi构造函数,第一行是隐藏的super();—–
到父类Fu,父类中同样有隐藏的super,指向Objecet,当然没什么影响—-
回到父类进行显示初始化num=9—-
构造代码块没有就进行父类的构造函数初始化即输出fu constructor run—
调用show(),因为子类中show方法对该方法进行了覆盖,就执行子类show,输出zi show…0(注意我就是在这蒙的,认为应该是num的值应该是9,后来才想到上边父类在int num=9时只是在栈内存中短暂出现并未改变对象中的num初始值,就算是父类那个时候接着调用,也是优先用栈内存中的num9,回到子类中,num=9就已经弹栈了)—-
然后是子类super结束后执行显示初始化num=8—-
构造代码块初始化输出constructor code…8—-
构造函数初始化输出zi constructor…8
最终输出的结果
fu constructor run
zi show…0
constructor code…8
zi constructor…8