Java에서 널 참조의 정적 필드
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()
.
- 기본 표현식이 평가되고 결과가 삭제됩니다 . [...]
- 필드가 공백이 아닌 최종 필드 인 경우 결과는 기본 표현식의 유형 인 클래스 또는 인터페이스에서 지정된 클래스 변수의 값입니다. [...]
앞에서 말했듯이 정적 필드는 인스턴스와 연결되어 있지 않기 때문입니다.
인스턴스 참조에서 정적 필드에 액세스하는 기능은 수행하는 것 (syntactic sugar) 일 뿐이며 추가 의미는 없습니다.
귀하의 코드는
main.getNull();
Main.value
컴파일 타임에 객체로 정적 변수 또는 메소드에 액세스 할 때마다 클래스 이름으로 변환됩니다. 예 :
Main main = null;
System.out.println(main.value);
컴파일시 정적 변수 값을 인쇄합니다.
System.out.println(Main.value);
증명:
디 컴파일러를 다운로드하고 .class 파일을 .java 파일로 디 컴파일하면 모든 정적 메소드 또는 변수 참조 오브젝트 이름이 클래스 이름으로 자동 대체되는 것을 볼 수 있습니다.
static
클래스 이름 으로 멤버에 액세스하는 것은 합법적이지만static
객체 참조 변수를 사용하여 멤버에 액세스 할 수 없도록 작성되지 않았습니다 . 여기에서 작동합니다.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
'IT story' 카테고리의 다른 글
Java 또는 C #의 예외 관리 모범 사례 (0) | 2020.07.19 |
---|---|
Git에서 현재 커밋 해시를 같은 커밋의 파일에 쓰는 방법 (0) | 2020.07.19 |
Cython 코드가 포함 된 Python 패키지를 어떻게 구성해야합니까 (0) | 2020.07.19 |
socket.io 서버를위한 Node.js 클라이언트 (0) | 2020.07.19 |
Express에서 app.configure 사용 (0) | 2020.07.19 |