다음 코드에서 readSide()
은 SIDE
을 나타내며 다른 정적 변수를 초기화하기 위해 호출 할 때 SIDE
의 선언에 할당 된 값이 아닌 0의 값을 갖는 것으로 나타납니다.Java가 컴파일러 또는 런타임 오류없이 초기화되지 않은 최종 정적 변수를 읽는시기와 이유는 무엇입니까?
import java.util.Random;
public class StaticTest {
private final static float SIDE_FROM_METHOD = readSide();
private final static float SIDE = 100.0f * new Random().nextFloat();
private static float readSide() {
System.out.println("In readSide(): SIDE=" + SIDE);
return SIDE;
}
public static void main(String[] args) {
System.out.println("In main(): SIDE_FROM_METHOD=" + SIDE_FROM_METHOD);
System.out.println("In main(): SIDE=" + SIDE);
System.out.println("In main(): readSide() return=" + readSide());
}
}
샘플 출력 : SIDE
따라서 비록
In readSide(): SIDE=0.0
In main(): SIDE_FROM_METHOD=0.0
In main(): SIDE=85.84305
In readSide(): SIDE=85.84305
In main(): readSide() return=85.84305
는 일정한 것으로 가정하고, 자바는 이루어되는 예외를 발생하거나 초기화 순서를 보장하거나보다 런타임에 값을 변경할 수 있도록 의존성 순서.
"최종 정적"개체를 정의하는 순서가 문제가되는 동작의 원인이라고 생각합니다.하지만 그 대신에 예외가 발생하지 않는 이유는 무엇입니까?
SIDE
경우 오히려 계산 된 값보다 리터럴로 초기화된다
private final static float SIDE=100.0f;
...이 후 출력 걸쳐
100.0
이다.
In readSide(): SIDE=100.0
In main(): SIDE_FROM_METHOD=100.0
In main(): SIDE=100.0
In readSide(): SIDE=100.0
In main(): readSide() return=100.0
왜 이것이 다른가요?
이상한 행동이 의미하는 것을 포함시킬 수 있습니까? – corriganjc
왜 오류가 있습니까? –
@corriganjc 샘플 출력이 질문에 추가되었습니다. – user2999069