/*
*
* All Rights Reserved.
*/
package com.thinkInJava.chapter05;
public class Father {
public Father() {
System.out.println("Father");
}
static {
System.out.println("I am Father class");
}
{
System.out.println("Father Class");
}
}
子类:
package com.thinkInJava.chapter05;
public class Sun extends Father{
public Sun(){
System.out.println("Sun");
}
static{
System.out.println("I am sun class");
}
{
System.out.println("sun class");
}
public static void main(String[] args) {
new Sun();
}
}
运行结果:
I am Father class
I am sun class
Father Class
Father
sun class
Sun
当类在进行初始化时一定是先初始化父类中的静态的内容,父类静态的内容出事完毕后,会初始化子类中的静态内容,然后会再次查看父类中是否存在非静态的内容,如果有则进行初始化,然后回到子类中查找是否存在非静态的内同需要初始化,如果有则进行初始化。最后执行父类中的构造方法,父类构造方法执行完后执行子类的构造方法。
总结:
父类的静态语句块---》子类的静态语句块---》父类的构造语句块---》子类的构造语句块---》父类的构造方法---》子类的构造方法。
在进一步改进一下子类中main方法结果会是怎样呢?
public static void main(String[] args) {
new Sun();
System.out.println("===================");
new Sun();
}
运行结果:
I am Father class
I am sun class
Father Class
Father
sun class
Sun
===================
Father Class
Father
sun class
Sun
从运行结果看到红色变大的字体部分属于父类和子类中的静态内同:运行顺序依然是:父类的静态语句块---》子类的静态语句块---》父类的构造语句块---》子类的构造语句块---》父类的构造方法---》子类的构造方法。
但是我们在main方法中创建了两个子类对象,但是静态内同值初始化一次,而构造语句块每次都会初始化,这也是构造语句块和静态语句块的区别。
再次修改子类中的main方法
public static void main(String[] args) {
System.out.println("main start");
new Sun();
System.out.println("===================");
new Sun();
System.out.println("main end");
}
运行结果如下:
I am Father class
I am sun class
main start
Father Class
Father
sun class
Sun
===================
Father Class
Father
sun class
Sun
main end
通过运行结果可以看到完整的执行顺序为:父类的静态语句块---》子类的静态语句块---》main方法---》父类的构造语句块---》子类的构造语句块---》父类的构造方法---》子类的构造方法。