Example.java
public class Example {
static final int i = 10;
static int j = 20;
static {
System.out.println("Example class loaded and initialized");
}
}
Use.java
import java.util.Scanner;
public class Use {
public static void main(String args[]){
Scanner sc = new Scanner(System.in);
int ch = 1;
while(ch != 0) {
System.out.print("Enter choice: ");
ch = sc.nextInt();
if (ch == 1) {
System.out.println("Example's i = " + Example.i);
} else if(ch == 2){
System.out.println("Example's j = " + Example.j);
}
}
}
}
当我使用
java -verbose:class Use
运行时,输入1
,则输出为10
,即常量i
的值。但是Example
类尚未加载。
然而,当我输入2
时,仅在此时 Example
类才会被加载到JVM中,正如verbose输出所显示的那样,然后在Example内部执行静态块,并初始化并打印出j
的值。
我的问题是: 如果在另一个类Use
中请求了一个类Example
的静态final(常量)值,但直到那时类Example
尚未加载到JVM中,那么该常量值是从哪里获取的?
何时以及如何初始化并存储静态final i
到JVM内存中?
javap -v -p path/to/Use.class
命令来检查一下。 - PiRocks