背景试题
case 1
public class JavaLoading {
private static int NUM = 3;
private static JavaLoading INSTANCE = new JavaLoading();
private JavaLoading() {
NUM++;
}
public static void main(String[] args) {
System.out.println(INSTANCE.NUM);
}
}
case 2
public class JavaLoading {
private static JavaLoading INSTANCE = new JavaLoading();
private static int NUM = 3;
private JavaLoading() {
NUM++;
}
public static void main(String[] args) {
System.out.println(INSTANCE.NUM);
}
}
思考三秒钟……
case 1的输出是:4
case 2的输出是:3
根据java虚拟机规范,一个class被加载进内存后,需要进行链接(linking)与初始化(initialization)两步,
其中链接又分:验证(verification)、准备(preparation)、解析(resolution)三小步