2012-04-21 4 views
11

일단 최종 변수에 값이 할당되면 변경할 수 없습니다. 그러나 난 그냥이에 대한 몇 가지 질문이있다 : 나는 필드가 때, 클래스 외부 static final JButton button; 말을하고 main 방법, 그것을 button = new JButton("OK");을 값을 할당하려고자바 최종 변수

  • , 오류가 발생합니다 최종 수정자를 제거하라는 메시지가 나옵니까? 그러나 원래 button 변수가 아직 객체를 참조하지 않았으므로 한 번 할당 할 수있는 노출이 있었습니까?

  • 둘째, button에 대한 참조를 완전히 제거 했으므로 클래스 외부에 static final JButton button;이 있다는 것을 알았습니다. "내 마지막 비어있는 필드 버튼이 초기화되지 않았을 수 있습니다." 즉, 모든 최종 필드가 이어야하며을 초기화해야합니까? 그렇다면 나중에 초기화 할 수 없으므로 초기화해야합니다.

  • 또한 바보 같은 질문이지만, 최종 변수가 인스턴스 또는 데이터 유형을 참조 할 때 다른 것으로 할당 될 수 없다고 가정 할 때 올바른지 맞습니까?

이 코드는 완전하지 않지만 내 지점 설명하기 위해 제공됩니다 클래스 범위에서

public class FinalVarTester { 

    static final JButton button; 

    public static void main(String[] args) { 
     JFrame frame = new JFrame(); 
     Container container = frame.getContentPane(); 
     container.setLayout(new BorderLayout()); 
     button = new JButton("OK"); 
     container.add(button, BorderLayout.SOUTH); 
    } 

} 

답변

18

정적 최종 변수를 정적 초기화 프로그램에서 초기화하거나 직접 초기화해야합니다. 그러니

static final JButton button = new JButton(); 

또는

static final JButton button; 

static { 
    button = new JButton(); 
} 

Java 언어 사양은 그것에 대해 좀 더 문서를 가지고 다음에 대한

It is a compile-time error if a final variable is assigned to unless it is definitely unassigned (§16) immediately prior to the assignment.

chapter 16 회담 : 당신은 컴파일 오류가 왜 section about final variables가 지정 명확한 과제

+0

그것을 선언시 최종 변수를 초기화 할 의무 아닌가? –

0

최종 변수는 선언 내에서 또는 생성자에서 초기화해야합니다. main 함수에서 선언되지 않은 한 main 함수의 최종 변수에 대입 할 수 없습니다. 모든 마지막 필드는 초기화되어야합니다. 모든 변수는 사용 전에 초기화해야합니다.

3

final 필드는 실제로 프로그램의 나머지 부분에 대한 값이므로 초기화해야합니다.

예외적으로, final 변수가 생성자에서 초기화 될 수 있습니다. 정적 필드는 인스턴스에 속하지 않으므로 직접 초기화 (생성자가 없음) 또는 정적 초기화 블록이 옵션을 수행해야합니다.

지난 질문에 대해서는 그렇습니다. 이것이 이유라고합니다.

0

문제는 위트입니다. 클래스 내부의 메소드에서 최종 변수를 초기화합니다 (기본 메소드도 메소드입니다 :). 자바에서 "final"은 상수와 같으며 단지 한 번만 초기화 될 수 있습니다. 집계 대신 구성으로 처리하십시오.중 사용자가 제공하는 값 또는 디폴트 값 (NULL, 0, 거짓)로 -

public class FinalVarTester { 

    static final JButton button = new JButton("OK"); 

    public static void main(String[] args) { 
     JFrame frame = new JFrame(); 
     Container container = frame.getContentPane(); 
     container.setLayout(new BorderLayout()); 
     container.add(button, BorderLayout.SOUTH); 
    } 
} 
0

정답은 static final var에 항상 클래스의 초기화시에 초기화 된 것입니다.

0

최종 변수는 초기화 프로그램이나 할당 문을 통해서만 한 번 초기화 할 수 있습니다. 선언 시점에서 초기화 할 필요가 없습니다.이를 "공백 최종"변수라고합니다.

최종 변수

유형

1) INSTANCE 최종 변수를

클래스의 빈 최종 인스턴스 변수가 확실히 선언 된 클래스의 모든 생성자의 마지막에 할당해야합니다; 그렇지 않으면 컴파일 타임 오류가 발생

2) STATIC 최종 VARIABLE

빈 최종 정적 변수가 확실히 선언 된 클래스의 정적 초기화에 할당해야합니다; 그렇지 않으면 컴파일 타임 오류가 발생합니다.

두 경우 모두 최종 변수를 초기화하기 전에 사용하지 않는 것이 좋습니다.

따라서 귀하의 경우 클래스가로드 될 때 초기화되는 정적 초기화 프로그램 블록을 통해 초기화되어야합니다.

참조 : http://en.wikipedia.org/wiki/Final_(Java)

0

더 나은 좋은 codding 방법 :

public class FinalVarTester 
{  
    static final JButton button; 
    public FinalVarTester() 
    {  
     JFrame frame = new JFrame(); 
     Container container = frame.getContentPane(); 
     container.setLayout(new BorderLayout()); 
     container.add(button, BorderLayout.SOUTH); 
     button = new JButton("OK"); 
    } 
    public static void main(String[] args)  
    { 
     FinalVarTester vTester = new FinalVarTester();  
    } 
}