[java] Java에서 “this”가 null 일 수 있습니까?

클래스 메서드에서이 줄을 봤고 첫 번째 반응은이 코드를 작성한 개발자를 조롱하는 것이 었습니다.하지만 저는 먼저 제가 옳은지 확인해야한다고 생각했습니다.

public void dataViewActivated(DataViewEvent e) {
    if (this != null)
        // Do some work
}

그 라인이 거짓으로 평가 될까요?



답변

아니요. 을 사용 this하는 경우 인스턴스에 있으므로 thisnull이 아닙니다.

JLS는 말한다 :

기본 식으로 사용되는 경우 this 키워드는 인스턴스 메서드가 호출 된 개체 (§15.12) 또는 생성중인 개체에 대한 참조 인 값을 나타냅니다.

객체에서 메소드를 호출하면 객체가 존재하거나 이전이있을 것입니다 NullPointerException(또는 정적 메소드이지만 사용할 수 없습니다 this).


자원 :


답변

마치 “내가 살아 있나?”라고 스스로에게 묻는 것과 같습니다. thisnull 일 수 없습니다.


답변

아니 절대 , 키워드 ‘this’자체는 해당 클래스의 범위 내에서 해당 클래스의 현재 살아있는 인스턴스 (객체)를 나타내며,이를 사용하여 모든 필드와 멤버 (생성자 포함) 및 부모 클래스의 보이는 항목에 액세스 할 수 있습니다.

그리고 더 흥미롭게도 설정해보세요.

this = null;

그것에 대해 생각해? 당신이 앉아있는 가지를 자르는 것과 같지 않을까요? 키워드 ‘this’는 클래스 범위 내에서 사용할 수 있으므로 this = null이라고 말하자마자 사용할 수 있습니다. 클래스 내 어느 곳에서나 기본적으로 JVM이 해당 작업을 마친 후 안전하게 돌아와야하기 때문에 JVM이 발생하도록 허용 할 수없는 일부 작업 중간에 해당 객체에 할당 된 메모리를 해제하도록 JVM에 요청합니다.

또한 시도 this = null;하면 컴파일러 오류가 발생합니다. 이유는 매우 간단합니다. Java (또는 모든 언어)의 키워드에는 값을 할당 할 수 없습니다. 즉, 키워드는 할당 작업의 왼쪽 값이 될 수 없습니다.

다른 예는 다음과 같이 말할 수 없습니다.

true = new Boolean(true);
true = false;


답변

-target 1.3또는 이전 버전으로 컴파일하는 경우 외부 thisnull. 아니면 적어도 예전에는 …


답변

아니요. 클래스 인스턴스의 메서드를 호출하려면 인스턴스가 있어야합니다. 인스턴스는에서 참조하는 메서드에 매개 변수로 암시 적으로 전달됩니다 this. 만약이 thisnull다음의 메소드를 호출 할 인스턴스가 없었을 것입니다.


답변

언어가 그것을 강요하는 것만으로는 충분하지 않습니다. VM은이를 시행해야합니다. VM이이를 강제하지 않는 한 Java로 작성된 메소드를 호출하기 전에 널 검사를 강제하지 않는 컴파일러를 작성할 수 있습니다. 인스턴스 메소드 호출을위한 opcode에는 스택에이 참조를로드하는 것이 포함됩니다. http://java.sun.com/docs/books/jvms/second_edition/html/Compiling.doc.html#14787을 참조하십시오 . 이것을 null ref로 대체하면 실제로 테스트가 거짓이됩니다.


답변

정적 클래스 메서드에서는 클래스 this가 아닌 this인스턴스와 연결되어 있으므로 정의 되지 않습니다. this정적 컨텍스트에서 키워드 를 사용하려고 시도하면 컴파일러 오류가 발생할 것이라고 생각합니다 .