java 中类中静态成员和实例成员的初始化顺序遵循严格的规则:先执行静态部分,再执行实例部分。具体而言,当类被加载时,静态变量按声明顺序初始化,随后执行静态代码块;当创建对象时,实例变量按声明顺序初始化,接着执行构造代码块,最后执行构造函数。

静态成员与实例成员的初始化时机有何不同
静态成员属于类,在类加载阶段完成初始化,而实例成员属于对象,在对象创建阶段完成初始化。这意味着静态成员的初始化早于任何实例成员的初始化,且只执行一次。

public class StaticVsInstance {
static int staticVar = printAndReturn("Static Var Init");
int instanceVar = printAndReturn("Instance Var Init");
static {
printAndReturn("Static Block");
}
{
printAndReturn("Instance Block");
}
public StaticVsInstance() {
printAndReturn("Constructor");
}
private static String printAndReturn(String msg) {
System.out.println(msg);
return 0;
}
public static void main(String[] args) {
new StaticVsInstance();
new StaticVsInstance();
}
}运行上述代码将输出:
Static Var Init
Static Block
Instance Var Init
Instance Block
Constructor
Instance Var Init
Instance Block
Constructor
立即学习“Java免费学习笔记(深入)”;
继承体系下父子类的初始化顺序是怎样的
在继承体系中,初始化顺序依然遵循“先父后子、先静后实”的原则。即先初始化父类的静态成员,再初始化子类的静态成员,然后初始化父类的实例成员,最后初始化子类的实例成员。

class Parent {
static int pStatic = printAndReturn("Parent Static");
int pInstance = printAndReturn("Parent Instance");
static {
printAndReturn("Parent Static Block");
}
{
printAndReturn("Parent Instance Block");
}
public Parent() {
printAndReturn("Parent Constructor");
}
private static String printAndReturn(String msg) {
System.out.println(msg);
return 0;
}
}
public class Child extends Parent {
static int cStatic = printAndReturn("Child Static");
int cInstance = printAndReturn("Child Instance");
static {
printAndReturn("Child Static Block");
}
{
printAndReturn("Child Instance Block");
}
public Child() {
printAndReturn("Child Constructor");
}
public static void main(String[] args) {
new Child();
}
}运行上述代码将输出:
Parent Static
Parent Static Block
Child Static
Child Static Block
Parent Instance
Parent Instance Block
Parent Constructor
Child Instance
Child Instance Block
Child Constructor
如果静态变量依赖另一个静态变量,初始化顺序如何确定
如果静态变量之间存在依赖关系,初始化顺序严格按照它们在类中声明的先后顺序进行。若前面的静态变量未初始化或为 null,后面的静态变量在访问时会得到相应的默认值或引发空指针异常。
public class StaticDependency {
static int a = getB();
static int b = 10;
private static int getB() {
System.out.println("getB returns: " + b);
return b;
}
public static void main(String[] args) {
System.out.println("a: " + a + ", b: " + b);
}
}运行上述代码将输出:
getB returns: 0
a: 0, b: 10


















