面试题答案
一键面试初始化顺序
- 加载类:当Java虚拟机首次尝试使用某个类时,会加载该类。
- 分配内存空间:为类的静态变量分配内存空间,并初始化为默认值(如
int
为0,boolean
为false
,引用类型为null
等)。 - 执行静态变量初始化:按照声明顺序依次执行静态变量的初始化语句。
- 执行静态代码块:按照出现顺序执行静态代码块中的代码。
在上述过程中,由于静态变量先于静态代码块初始化,所以在静态代码块调用静态方法访问静态变量时,静态变量已经被初始化。
可能遇到的问题及解决方法
- 问题:如果在静态代码块中调用静态方法访问静态变量,而静态变量还未初始化,会导致访问到默认值,而不是期望的初始化后的值。例如,静态变量的初始化依赖于其他复杂的逻辑,而在静态代码块中过早调用访问该变量的静态方法。
- 解决方法:确保静态变量在被访问前已经正确初始化。可以将静态变量的初始化逻辑提前,或者避免在静态代码块中过早调用访问该变量的静态方法。
Java类示例
public class StaticInitializationExample {
// 静态变量
private static int staticVariable;
// 静态代码块
static {
System.out.println("Static block is executed.");
// 调用静态方法访问静态变量
accessStaticVariable();
}
// 静态方法
public static void accessStaticVariable() {
System.out.println("Static variable value: " + staticVariable);
}
// 静态变量初始化
static {
staticVariable = 10;
System.out.println("Static variable is initialized to: " + staticVariable);
}
public static void main(String[] args) {
System.out.println("Main method is executed.");
}
}
在上述示例中,staticVariable
先被分配内存并初始化为0,然后静态代码块执行,调用accessStaticVariable
方法输出0
。之后,staticVariable
被赋值为10并输出。如果希望输出的是10,可以将staticVariable
的初始化逻辑提前到第一个静态代码块之前:
public class StaticInitializationExample {
// 静态变量初始化提前
private static int staticVariable = 10;
// 静态代码块
static {
System.out.println("Static block is executed.");
// 调用静态方法访问静态变量
accessStaticVariable();
}
// 静态方法
public static void accessStaticVariable() {
System.out.println("Static variable value: " + staticVariable);
}
public static void main(String[] args) {
System.out.println("Main method is executed.");
}
}
这样在静态代码块调用accessStaticVariable
方法时,staticVariable
已经是10。