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

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

 

非常感谢大家的点评和指正,运行结果没有问题,只是顺序写错了。

你可能感兴趣的:(java,构造器,静态语句块)