[java] Java의 널 참조에 대한 정적 필드

staticJava의 멤버 ( 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하면 모든 정적 메소드 또는 변수 참조 객체 이름이 자동으로 클래스 이름으로 대체되는 것을 볼 수 있습니다.


답변

  1. static클래스 이름 으로 멤버에 액세스하는 것은 합법적이지만 static개체 참조 변수를 사용하여 멤버에 액세스 할 수 없다는 내용이 작성되지 않았습니다 . 여기에서 작동합니다.

  2. null객체 참조 변수는 액세스 할 수 있습니다 static컴파일 또는 런타임에 예외 중 하나를 throw하지 않고 클래스 변수를.


답변

정적 변수와 메서드는 항상 클래스에 속합니다. 그래서 우리가 어떤 객체를 만들 때마다 비 정적 변수와 메소드는 객체와 함께 힙으로 이동하지만 정적은 클래스와 함께 메소드 영역에 상주합니다. 그렇기 때문에 정적 변수 또는 메서드에 액세스하려고 할 때마다 클래스 이름 도트 변수 또는 메서드 이름으로 변환되었습니다.

자세한 내용은 아래 링크를 참조하십시오.

http://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html


답변