2010-01-13 9 views
0

이유 최종 변수를 정적 변수에서 액세스 할 수 없습니다. 컴파일 시간에 그들은 단지 값이 으로 직접 대체 됨으로 정적 메소드에서도 사용할 수 있도록해야합니다.최종 변수 액세스 가능성

왜 이런 제한이 있습니까?

+1

예를 들어 주시겠습니까? –

답변

2

모두가 아님 final 변수가 컴파일시 상수입니다. static final 변수 만 컴파일 타임 상수로 컴파일러에서 대체 할 수 있습니다. 경우에 따라 final 한정자는 const-correctness을 보장하는 데에만 사용됩니다.

static 메서드는 같은 클래스의 다른 인스턴스에 대해 서로 다른 값을 가질 수 있으므로 비 정적 변수에 액세스 할 수 없습니다.

1

static 메서드가 final 인스턴스 변수에 액세스 할 수없는 이유를 묻는다면 ([최종] 멤버 변수가 항상 코드의 리터럴 또는 상수 값으로 설정된다는 가정하에) 클래스의 다른 인스턴스 동일한 final 인스턴스 변수 (예 : 생성자를 통해 설정할 수 있음)에 대해 서로 다른 값을 가질 수 있습니다. static 메서드는 클래스의 특정 인스턴스에 대한 지식이 없으므로 static final 개의 변수에만 액세스 할 수 있습니다.

3

static = 클래스에 있습니다.

final = 값을 변경하지 않습니다 (정적 인 경우 각 인스턴스에 적용됩니다).

examply함으로써 당신은 할 수 있습니다 :

public class Weird 
{ 
private static long number = System.getTimeInMilis(); 
private final long created = System.getTimeInMilis(); 
} 

때마다 사용자가 만든 것이 다른 값을 포함하는 이상한 개체를 만듭니다.

그러나 Weird.number의 값은 클래스가로드 된 시간입니다.

+0

보다 실제적인 예 : "private final list = new ArrayList <...>"을 만들 수 있으며 목록에 대한 참조를 변경하지 않지만 목록에서 원하는 경우 개체를 추가 할 수 있습니다. – helios

+1

... 지정 * 후에 값을 변경하지 않습니다. 이것은 jvm이 아닌 컴파일러가 시행합니다. –

관련 문제