이 특정 사례를 언급하는 특정 SO 게시물을 찾을 수 없으므로 예 / 아니오 질문이라고 생각하는 것이 무엇인지 묻고 싶습니다.
다음은 JLS §12.4.2 (Java SE 8), 목록 6-7입니다.
- [...] 그런 다음 상수 변수 인 C의 static 필드를 초기화합니다 (§4.12.4, §8.3.2, §9.3.1).
- 다음으로, C가 인터페이스가 아닌 클래스이고 해당 수퍼 클래스가 아직 초기화되지 않은 경우 SC를 수퍼 클래스로 설정합니다 [...] 목록의 각 S에 대해 [SC, SI1, ..., SIn], S에 대해이 전체 절차를 반복적으로 수행합니다. 필요한 경우 S를 먼저 확인하고 준비합니다. [...]
내 질문 : 하위 클래스의 최종 정적 변수가 수퍼 클래스의 정적 초기화 전에 초기화된다는 의미입니까 (최종 정적이 선언의 일부로 초기화된다고 가정)?
대답은 그럴 수도 있다는 것입니다. 핵심 부분은 상수 단어 의미입니다.
이 코드를 고려하십시오
class Foo {
public static final int FOO_VALUE = 1000;
static {
System.err.println("FOO Bar.BAR_VALUE=" + Bar.BAR_VALUE);
}
}
class Bar extends Foo {
public static final int BAR_VALUE = 2000;
static {
System.err.println("BAR Foo.FOO_VALUE=" + Foo.FOO_VALUE);
}
}
이 프로그램의 출력은 다음과 같습니다.
FOO Bar.BAR_VALUE=2000
BAR Foo.FOO_VALUE=1000
이 경우 Bar
정적 최종 변수는 Foo
정적 초기화 전에 초기화됩니다. 둘 다 FOO_VALUE
하고 BAR_VALUE
있습니다 상수를 때문에 javac
이 필드를 인라인 할 수 있습니다.
그러나 이런 식으로 최종 변수가 상수가 아닌 척하여 컴파일러를 속일 수 있습니다.
class Foo {
public static final int FOO_VALUE = Integer.valueOf(1000).intValue();
static {
System.err.println("FOO " + Bar.BAR_VALUE);
}
}
class Bar extends Foo {
public static final int BAR_VALUE = Integer.valueOf(2000).intValue();
static {
System.err.println("BAR " + Foo.FOO_VALUE);
}
}
그리고 출력은
FOO Bar.BAR_VALUE=0
BAR Foo.FOO_VALUE=1000
따라서 Foo
static final Bar.BAR_VALUE
이 초기화 되기 전에 static initializer가 완료 됩니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다