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, как видно из подробного вывода, а затем выполняется статический блок внутри примера, а также Значение j
инициализировано и затем распечатано.
Мой запрос: Если для ввода 1
, т.е. когда статическое конечное (постоянное) значение класса Example
запрашивается в другом классе Use
, то откуда берется это постоянное значение, если класс Example
никогда не был загружен в JVM до тех пор? Когда и как статический final i
был инициализирован и сохранен в памяти JVM?
javap -v -p path/to/Use.class
- person PiRocks   schedule 22.08.2020