NOTE
7.8 类初始化顺序
1. 什么时候会触发初始化 new一个实例或者main方法所在类 2. 初始化规则 如果父类没有初始化,那么首先初始化父类 3. 举例 3.1. 单个类的情况 - 结果 3.2. 继承的情况 - 结果 4. 参考 - Java类初始化顺序 \- code\-craft \- SegmentFault
这是历史学习笔记,可能存在过时或不完整的理解。
1. 什么时候会触发初始化
new一个实例或者main方法所在类
2. 初始化规则
如果父类没有初始化,那么首先初始化父类
3. 举例
3.1. 单个类的情况
public class InitialOrderTest
{
/* 静态变量 */
public static String staticField = "静态变量";
/* 变量 */
public String field = "变量";
/* 静态初始化块 */
static
{
System.out.println(staticField);
System.out.println("静态初始化块");
}
/* 初始化块 */
{
System.out.println(field);
System.out.println("初始化块");
}
/* 构造器 */
public InitialOrderTest()
{
System.out.println("构造器");
}
public static void main(String[] args)
{
new InitialOrderTest();
}
}
- 结果
静态变量
静态初始化块
变量
初始化块
构造器
3.2. 继承的情况
class Parent
{
/* 静态变量 */
public static String p_StaticField = "父类--静态变量";
/* 变量 */
public String p_Field = "父类--变量";
protected int i = 9;
protected int j = 0;
/* 静态初始化块 */
static
{
System.out.println(p_StaticField);
System.out.println("父类--静态初始化块");
}
/* 初始化块 */
{
System.out.println(p_Field);
System.out.println("父类--初始化块");
}
/* 构造器 */
public Parent()
{
System.out.println("父类--构造器");
System.out.println("i=" + i + ", j=" + j);
j = 20;
}
}
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()
{
System.out.println("子类--构造器");
System.out.println("i=" + i + ",j=" + j);
}
/* 程序入口 */
public static void main(String[] args)
{
System.out.println("子类main方法");
new SubClass();
}
}
- 结果
父类--静态变量
父类--静态初始化块
子类--静态变量
子类--静态初始化块
子类main方法
父类--变量
父类--初始化块
父类--构造器
i=9, j=0
子类--变量
子类--初始化块
子类--构造器
i=9,j=20