답변:
클래스의 정적 초기화는 일반적으로 다음 이벤트 중 하나가 처음 발생하기 직전에 발생합니다.
JLS 12.4.1을 참조하십시오 .
Class.forName(fqn, true, classLoader)
또는 짧은 형식 을 사용하여 클래스를 강제로 초기화 할 수도 있습니다 (아직 초기화되지 않은 경우).Class.forName(fqn)
1-마지막 글 머리 기호는 Java 6에서 Java 8까지의 JLS에 있었지만 분명히 사양에있는 실수였습니다. Java 9 JLS에서 마침내 수정되었습니다 . 소스 참조 .
String
대체되며 참조되지 않습니다. class Other { public static final int VAL = 10; }
일부 클래스에서 를 참조 MyClass { private int = Other.VAL; }
하면 클래스 Other
가로드되지 않습니다. 대신 컴파일러는 컴파일 타임에 최종 필드를 간단히 대체합니다.
String
변수에 해당 되지 않으며 상수 표현식으로 초기화 된 변수 만 있습니다.
static
는 일반적인 경우 일 필요조차 없습니다 .
정적 필드는 정적 이니셜 라이저 및 정적 필드의 초기화를 포함하는 클래스 로딩 (로드, 링크 및 초기화) 의 초기화 "단계" 중에 초기화 됩니다. 정적 이니셜 라이저는 클래스에 정의 된 텍스트 순서로 실행됩니다.
예를 고려하십시오.
public class Test {
static String sayHello() {
return a;
}
static String b = sayHello(); // a static method is called to assign value to b.
// but its a has not been initialized yet.
static String a = "hello";
static String c = sayHello(); // assignes "hello" to variable c
public static void main(String[] arg) throws Throwable {
System.out.println(Test.b); // prints null
System.out.println(Test.sayHello()); // prints "hello"
}
}
정적 범위에서를 호출 null
했을 때 sayHello
정적 변수 a
가 초기화되지 않았기 때문에 Test.b가 인쇄 됩니다 .