IT story

Java에서 널 참조의 정적 필드

hot-time 2020. 7. 19. 09:13
반응형

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().

  • 기본 표현식이 평가되고 결과가 삭제됩니다 . [...]
  • 필드가 공백이 아닌 최종 필드 인 경우 결과는 기본 표현식의 유형 인 클래스 또는 인터페이스에서 지정된 클래스 변수의 값입니다. [...]

앞에서 말했듯이 정적 필드는 인스턴스와 연결되어 있지 않기 때문입니다.

인스턴스 참조에서 정적 필드에 액세스하는 기능은 수행하는 것 (syntactic sugar) 일 뿐이며 추가 의미는 없습니다.
귀하의 코드는

main.getNull(); 
Main.value

컴파일 타임에 객체로 정적 변수 또는 메소드에 액세스 할 때마다 클래스 이름으로 변환됩니다. 예 :

Main main = null;
System.out.println(main.value);

컴파일시 정적 변수 값을 인쇄합니다.

System.out.println(Main.value);

증명:

디 컴파일러를 다운로드하고 .class 파일을 .java 파일로 디 컴파일하면 모든 정적 메소드 또는 변수 참조 오브젝트 이름이 클래스 이름으로 자동 대체되는 것을 볼 수 있습니다.


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

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


정적 변수와 메소드는 항상 클래스에 속합니다. 따라서 정적 변수가 아닌 객체 만 생성하면 메소드는 객체와 함께 힙으로 이동하지만 정적은 클래스가있는 메소드 영역에 있습니다. 그래서 정적 변수 또는 메소드에 액세스하려고 할 때 클래스 이름 점 변수 또는 메소드 이름으로 변환되었습니다.

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

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

참고 URL : https://stackoverflow.com/questions/11579953/static-fields-on-a-null-reference-in-java

반응형