2014-08-29 3 views
5

먼저 초기화하기 전에,이 문제는 앞으로 이러한 좋은 질문과 관련이 있습니다액세스는 모두의

1) Use of uninitialized final field - with/without 'this.' qualifier

2) Why isn't a qualified static final variable allowed in a static initialization block?

을하지만 난에 요청합니다 약간 다른 화각. 기억해야 할 점은 위에서 언급 한 질문에 this의 필드에 대한 액세스가 Java 7임을 묻는 것입니다.

제 질문에는 비슷한 점이 있지만 동일하지는 않습니다.

public class TestInit { 
    final int a; 
    { 
     // System.out.println(a); -- compile error 
     System.out.println(getA()); 
     // a = a;     -- compile error 
     a = getA(); 
     System.out.println(getA()); 
    } 
    private int getA() { 
     return a; 
    } 
    public static void main(String[] args) { 
     new TestInit(); 
    } 
} 

을 그리고 출력은 다음과 같습니다 : 음, 다음 코드를 고려

0 
0 

여기이 불분명 한 가지가있다 볼 수 있듯이 :

  1. 비에 액세스하는 또 다른 법적 방법이 있습니다 - 초기화 됨 final 필드 : getter를 사용합니다.
  2. 우리는의 할당은 a = getA(); 빈 마지막 필드과 그 법적 로 항상 JLS에 따라 비 final 필드에 대한 기본값처럼에 할당 할 것을 고려해야 하는가? 다른 말로 예상되는 행동으로 간주되어야 하는가?
+0

링크 된 질문에는 JLS에서 정한 규칙이 있습니다. 그들은 메소드 호출과 관련하여 아무 것도 말하지 않기 때문에 허용됩니다. –

답변

0

실제로 실행중인 것은 컴파일러의 추론 능력입니다. 첫 번째 컴파일러 오류에 대해 컴파일러에서 확실히 a가 할당되지 않았으므로 실패합니다. 두 번째 a = a와 동일합니다 (해당 시점에 할당되지 않았기 때문에 a에서 할당 할 수 없습니다). a = getA()가 작동하는 라인은 a의 첫 번째, 단일, 명확한 지정이므로 getA()의 구현은 중요하지 않으며이 시점에서 평가되지 않습니다).

getA() 메소드가 유효하고 인스턴스 초기화 프로그램이 a에 값을 할당했기 때문에 a를 리턴 할 수 있습니다.

인간이 보는 것은 당연하지만 컴파일러에 내장 된 추론은 아닙니다. 개별적으로 평가 된 각 블록은 유효합니다.

+0

"정적 이니셜 라이저"는 무엇입니까? 미안하지만 무슨 소리 야? – Andremoniy

+0

죄송합니다, 인스턴스 이니셜 라이저 (수정을 위해 수정했습니다). – user1676075