package core;
/**
* @author 关注微信公众号:Java学习交流社区
* (更多技术干货、原创文章、面试资料,群聊吹水一应俱全)
*/
public class InitOrderClass {
public static void main(String[] args) {
System.out.println("主函数");
new Child();
}
}
class Parent {
static {
System.out.println("Parent的static代码块...");
}
public String s1 = print("Parent的成员变量...");
public static String s2 = print("Parent的static变量...");
protected Parent() {
System.out.println("Parent的构造函数...");
}
{
System.out.println("Parent的代码块");
}
public static String print(String str) {
System.out.println(str);
return null;
}
}
class Child extends Parent {
public String s1 = print("Child的成员变量...");
public static String s2 = print("Child的static变量...");
public Child() {
System.out.println("Child的构造函数...");
}
private static Parent parent = new Parent();
static {
System.out.println("Child的static代码块...");
}
{
System.out.println("Child的代码块...");
}
}
返回结果如下:
主函数 Parent的static代码块... Parent的static变量... Child的static变量... Parent的成员变量... Parent的代码块 Parent的构造函数... Child的static代码块... Parent的成员变量... Parent的代码块 Parent的构造函数... Child的成员变量... Child的代码块... Child的构造函数...
可以看出,类实例化的顺序是:当创建类对象时,,然后是非静态变量和非静态代码块,然后是构造器。由于静态成员只会被初始化一次,所以如果静态成员已经被初始化过,将不会被再次初始化。
- 第一梯队:父类的静态变量和静态块(与书写顺序有关,在前面的先实例化)
- 第二梯队:子类的静态变量和静态块(与书写顺序有关,在前面的先实例化)
- 第三梯队:父类的成员变量和块(与书写顺序有关,在前面的先实例化)
- 第四梯队:子类的成员变量和块(与书写顺序有关,在前面的先实例化)
同时在例子可以看出,静态变量和静态块,在执行过一次之后就不再执行。

扫码关注微信公众号《Java学习交流社区》,即可获取原创《Java并发编程与高并发解决方案》+《Redis》思维导图
作者:Java学习交流社区
地址:https://www.jvscc.cn/articles/2019/09/02/1567406392256.html
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于