이유 최종 변수를 정적 변수에서 액세스 할 수 없습니다. 컴파일 시간에 그들은 단지 값이 으로 직접 대체 됨으로 정적 메소드에서도 사용할 수 있도록해야합니다.최종 변수 액세스 가능성
왜 이런 제한이 있습니까?
이유 최종 변수를 정적 변수에서 액세스 할 수 없습니다. 컴파일 시간에 그들은 단지 값이 으로 직접 대체 됨으로 정적 메소드에서도 사용할 수 있도록해야합니다.최종 변수 액세스 가능성
왜 이런 제한이 있습니까?
모두가 아님 final
변수가 컴파일시 상수입니다. static final
변수 만 컴파일 타임 상수로 컴파일러에서 대체 할 수 있습니다. 경우에 따라 final
한정자는 const-correctness을 보장하는 데에만 사용됩니다.
및 static
메서드는 같은 클래스의 다른 인스턴스에 대해 서로 다른 값을 가질 수 있으므로 비 정적 변수에 액세스 할 수 없습니다.
static
메서드가 final
인스턴스 변수에 액세스 할 수없는 이유를 묻는다면 ([최종] 멤버 변수가 항상 코드의 리터럴 또는 상수 값으로 설정된다는 가정하에) 클래스의 다른 인스턴스 동일한 final
인스턴스 변수 (예 : 생성자를 통해 설정할 수 있음)에 대해 서로 다른 값을 가질 수 있습니다. static
메서드는 클래스의 특정 인스턴스에 대한 지식이 없으므로 static final
개의 변수에만 액세스 할 수 있습니다.
static = 클래스에 있습니다.
final = 값을 변경하지 않습니다 (정적 인 경우 각 인스턴스에 적용됩니다).
examply함으로써 당신은 할 수 있습니다 :
public class Weird
{
private static long number = System.getTimeInMilis();
private final long created = System.getTimeInMilis();
}
때마다 사용자가 만든 것이 다른 값을 포함하는 이상한 개체를 만듭니다.
그러나 Weird.number의 값은 클래스가로드 된 시간입니다.
보다 실제적인 예 : "private final list = new ArrayList <...>"을 만들 수 있으며 목록에 대한 참조를 변경하지 않지만 목록에서 원하는 경우 개체를 추가 할 수 있습니다. – helios
... 지정 * 후에 값을 변경하지 않습니다. 이것은 jvm이 아닌 컴파일러가 시행합니다. –
예를 들어 주시겠습니까? –