JLS의 섹션은 §12.4.2 에서 찾을 수 있습니다 .
자세한 초기화 절차 :
9. 다음으로, 클래스의 클래스 변수 이니셜 라이저와 정적 이니셜 라이저 또는 인터페이스의 필드 이니셜 라이저를 텍스트 순서 로 실행합니다. 단, 최종 클래스 변수와 값이 컴파일되는 인터페이스의 필드는 예외입니다. -시간 상수가 먼저 초기화됩니다.
따라서 세 개의 정적 변수는 텍스트 순서로 하나씩 초기화됩니다.
그래서
static A obj = new A();
//num1 = 1, num2 = 1;
static int num1;
//this is initilized first, see below.
static int num2=0;
//num1 = 1, num2 = 0;
주문을 다음과 같이 변경하는 경우 :
static int num1;
static int num2=0;
static A obj = new A();
결과는입니다 1,1
.
(가) 있습니다 static int num1;
때문에 초기화 변수가되지 않습니다 ( §8.3.2 ) :
필드 선언자에 변수 이니셜 라이저가 포함 된 경우 선언 된 변수에 대한 할당 (§15.26)의 의미를 가지며 선언자가 클래스 변수 (즉, 정적 필드)를위한 것이라면 변수 이니셜 라이저는 다음과 같습니다. 클래스가 초기화 될 때 평가되고 할당이 정확히 한 번 수행됨
그리고이 클래스 변수는 클래스가 생성 될 때 초기화됩니다. 이것은 먼저 발생합니다 ( §4.12.5 ).
프로그램의 모든 변수에는 값이 사용되기 전에 값이 있어야합니다. 각 클래스 변수, 인스턴스 변수 또는 배열 구성 요소는 생성 될 때 기본값으로 초기화됩니다 (§15.9, §15.10) : 유형 바이트의 경우 기본값 즉, (byte) 0의 값입니다. short 유형의 경우 기본값은 0, 즉 (short) 0의 값입니다. int 유형의 경우 기본값은 0, 즉 0입니다. long 유형의 경우 기본값은 0, 즉 0L입니다. float 유형의 경우 기본값은 양수 0, 즉 0.0f입니다. double 유형의 경우 기본값은 양수 0, 즉 0.0d입니다. char 유형의 경우 기본값은 널 문자, 즉 '\ u0000'입니다. 부울 유형의 경우 기본값은 false입니다. 모든 참조 유형 (§4.3)의 경우 기본값은 null입니다.