java---静态语句块、构造语句块、构造器的初始化顺序

时间:2020-12-15 19:31:34

/*
*
* 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方法---》父类的构造语句块---》子类的构造语句块---》父类的构造方法---》子类的构造方法。