static
Java의 멤버 ( static
필드 또는 static
메서드)는이 클래스의 개체가 아닌 해당 클래스와 연결됩니다. 다음 코드는 null
참조 의 정적 필드에 액세스를 시도합니다 .
public class Main
{
private static final int value = 10;
public Main getNull()
{
return null;
}
public static void main(String[] args)
{
Main main=new Main();
System.out.println("value = "+main.getNull().value);
}
}
main.getNull()
반환 하지만 null
작동하고 표시합니다 value = 10
. 이 코드는 어떻게 작동합니까?
답변
해당 동작은 Java 언어 사양에 지정되어 있습니다 .
null 참조를 사용하여 예외를 발생시키지 않고 클래스 (정적) 변수에 액세스 할 수 있습니다.
자세한 내용 은 다음 과 같이 작동 하는 정적 필드 평가입니다Primary.staticField
(강조 내)-귀하의 경우 Primary = main.getNull()
:
- Primary식이 평가되고 결과가 삭제됩니다 . […]
- 필드가 공백이 아닌 최종 필드 인 경우 결과는 기본 표현식의 유형 인 클래스 또는 인터페이스에 지정된 클래스 변수의 값입니다. […]
답변
말했듯이 정적 필드는 인스턴스와 연결되지 않기 때문입니다.
인스턴스 참조에서 정적 필드에 액세스하는 기능 (현재 수행중인 작업)은 단지 구문상의 설탕이며 추가 의미가 없습니다.
코드가 다음과 같이 컴파일됩니다.
main.getNull();
Main.value
답변
컴파일 타임에 객체가있는 정적 변수 또는 메서드에 액세스 할 때마다 클래스 이름으로 변환됩니다. 예 :
Main main = null;
System.out.println(main.value);
컴파일시 정적 변수 값의 값을 출력합니다.
System.out.println(Main.value);
증명:
decompiler를 다운로드하고 .class 파일을 .java 파일로 Decompile하면 모든 정적 메소드 또는 변수 참조 객체 이름이 자동으로 클래스 이름으로 대체되는 것을 볼 수 있습니다.
답변
-
static
클래스 이름 으로 멤버에 액세스하는 것은 합법적이지만static
개체 참조 변수를 사용하여 멤버에 액세스 할 수 없다는 내용이 작성되지 않았습니다 . 여기에서 작동합니다. -
null
객체 참조 변수는 액세스 할 수 있습니다static
컴파일 또는 런타임에 예외 중 하나를 throw하지 않고 클래스 변수를.
답변
정적 변수와 메서드는 항상 클래스에 속합니다. 그래서 우리가 어떤 객체를 만들 때마다 비 정적 변수와 메소드는 객체와 함께 힙으로 이동하지만 정적은 클래스와 함께 메소드 영역에 상주합니다. 그렇기 때문에 정적 변수 또는 메서드에 액세스하려고 할 때마다 클래스 이름 도트 변수 또는 메서드 이름으로 변환되었습니다.
자세한 내용은 아래 링크를 참조하십시오.
http://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html