阅读量:117
在Java中,static关键字用于声明静态成员(包括静态变量和静态代码块)。类的初始化顺序主要受到以下因素影响:
- 静态变量和静态代码块的执行顺序:静态代码块在类加载时自动执行,且仅执行一次。静态变量在类加载时初始化。在静态代码块中可以对静态变量进行赋值操作。因此,静态代码块的执行顺序通常决定了静态变量的初始化顺序。
例如:
public class MyClass {
static int a;
static {
a = 1;
System.out.println("Static block 1");
}
static int b;
static {
b = 2;
System.out.println("Static block 2");
}
}
输出顺序为:
Static block 1
Static block 2
- 非静态成员变量的初始化顺序:在类的构造函数执行之前,非静态成员变量会按照它们在类中出现的顺序进行初始化。
例如:
public class MyClass {
static int a;
int b;
static {
a = 1;
System.out.println("Static block");
}
public MyClass() {
b = 2;
System.out.println("Constructor");
}
}
输出顺序为:
Static block
Constructor
- 继承关系中的初始化顺序:如果一个类继承了另一个类,那么父类的静态变量和静态代码块会在子类之前初始化。在子类的构造函数执行之前,子类的非静态成员变量会按照它们在类中出现的顺序进行初始化。
例如:
public class ParentClass {
static int a;
static {
a = 1;
System.out.println("Parent static block");
}
}
public class ChildClass extends ParentClass {
static int b;
int c;
static {
b = 2;
System.out.println("Child static block");
}
public ChildClass() {
c = 3;
System.out.println("Child constructor");
}
}
输出顺序为:
Parent static block
Child static block
Child constructor
总之,Java中类的初始化顺序主要受到静态成员和非静态成员的声明顺序以及继承关系的影响。静态代码块的执行顺序通常决定了静态变量的初始化顺序,而非静态成员变量的初始化顺序遵循它们在类中出现的顺序。