java 静态资源,非静态资源,父类子类,构造方法之间的初始化循序

Posted 那家伙真懒

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 静态资源,非静态资源,父类子类,构造方法之间的初始化循序相关的知识,希望对你有一定的参考价值。

java面试经常被问静态资源,非静态资源,父类子类,构造方法之间的执行顺序。下面添加两个类做个测试

class Parent {
    // 静态变量
    public static String p_StaticField = "父类--静态变量";
    // 变量(其实这用对象更好能体同这一点,如专门写一个类的实例)

    //如果这个变量放在初始化块的后面,是会报错的,因为你根本没有被初始化
    public String p_Field = "父类--变量";
    // 静态初始化块
    static {
        System.out.println(p_StaticField);
        System.out.println("父类--静态初始化块");
    }
    // 初始化块
    {
        System.out.println(p_Field);
        System.out.println("父类--初始化块");
    }

    // 构造器
    public Parent() {
        System.out.println("父类--构造器");
    }
}
public class SubClass extends Parent {
    // 静态变量
    public static String s_StaticField = "子类--静态变量";
    // 变量
    public String s_Field = "子类--变量";
    // 静态初始化块
    static {
        System.out.println(s_StaticField);
        System.out.println("子类--静态初始化块");
    }
    // 初始化块
    {
        System.out.println(s_Field);
        System.out.println("子类--初始化块");
    }

    // 构造器
    public SubClass() {
        //super();
        System.out.println("子类--构造器");
    }

}
 // 程序入口
    public static void main(String[] args) {
        System.out.println("*************in main***************");
        new SubClass();
        System.out.println("*************second subClass***************");
        new SubClass();
    }

两次初始化子类SubClass结果如下,验证了类的初始化循序的同时可以得出静态资源只会在类的第一次初始化加载的结论。

Connected to the target VM, address: ‘127.0.0.1:11839‘, transport: ‘socket‘
父类--静态变量
父类--静态初始化块
子类--静态变量
子类--静态初始化块
*************in main***************
父类--变量
父类--初始化块
父类--构造器
子类--变量
子类--初始化块
子类--构造器
*************second subClass***************
父类--变量
父类--初始化块
父类--构造器
子类--变量
子类--初始化块
子类--构造器
Disconnected from the target VM, address: ‘127.0.0.1:11839‘, transport: ‘socket‘

 

以上是关于java 静态资源,非静态资源,父类子类,构造方法之间的初始化循序的主要内容,如果未能解决你的问题,请参考以下文章

Java子父类间静态代码块非静态代码块构造方法的执行顺序

java类的加载顺序,静态块 非静态块 构造器属性方法等

java中成员变量代码块构造函数运行顺序

java对象的初始化过程和创建对象的几种方式

java类及实例初始化顺序

简述(非)静态代码块和构造方法的执行顺序