source

Java에서는 "this"가 null이 될 수 있습니까?

manysource 2022. 11. 14. 21:47

Java에서는 "this"가 null이 될 수 있습니까?

수업시간에 이 대사를 보았고, 나의 첫 반응은 그것을 쓴 개발자를 조롱하는 것이었다.하지만 그 때, 내가 먼저 옳았는지 확인해야겠다고 생각했어요.

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

그 행이 거짓으로 평가될까?

아, 아, 아, 아, 아, 아, 아, 아, 아.★★★★★★★★★를 사용하고 있는 경우는this에 있기 때문에, 「」라고 하는 것은 「 this

JLS에는 다음과 같이 표시됩니다.

프라이머리 표현으로 사용하는 경우, 이 키워드는 인스턴스 메서드가 호출된 오브젝트('15.12) 또는 구축 중인 오브젝트를 참조하는 값을 나타냅니다.

하거나 메서드가 .NullPointerException수 )this그안안)


자원:

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★」★★★★★★★★★★★★★★★★★★★★★★★★★★ this 일 수

아니요, 키워드 'this' 자체는 해당 클래스의 범위 내에 있는 해당 클래스의 현재 활성 인스턴스(개체)를 나타냅니다.이것에 의해, 모든 필드 및 멤버(컨스트럭터 포함)와 부모 클래스의 표시 가능한 클래스에 액세스 할 수 있습니다.

그리고, 보다 흥미로운 것은, 이것을 설정해 보세요.

this = null;

생각해 보실래요?어떻게 그럴 수가 있지, 지금 앉아 있는 나뭇가지를 자르는 거 아니야?키워드 'this'는 클래스 범위 내에서 사용할 수 있으므로 이 = null이라고 말하면 클래스 내 어디에서나 사용할 수 있으므로 기본적으로 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 있을 수 없다null이 예에서는 일반 Java 코드를1 사용하고 있습니다.this자세한 내용은 기타 답변을 참조하십시오.

이 있는 A.this 절대로 그래서는 안 된다null이치노

public class Outer {
   public Outer() {}

   public class Inner {
       public Inner() {}

       public String toString() {
           return "outer is " + Outer.this;  // Qualified this!!
       }
   }
}

「」의 를 .Inner

public static void main(String[] args) {
    Outer outer = new Outer();
    Inner inner = outer.new Inner();
    System.out.println(inner);

    outer = null;
    inner = outer.new Inner();  // FAIL ... throws an NPE
}

출력은 다음과 같습니다.

outer is Outer@2a139a55
Exception in thread "main" java.lang.NullPointerException
        at Outer.main(Outer.java:19)

「Create 」를 있는 .Inner a null 「」의 .Outer을 사용하다

사실, "순수한 자바" 봉투 안에만 있으면 이것을 깨뜨릴 수 없다.

단, 각 ' ', '는Inner ""가 .final필드(「」라고 불립니다)"this$0"Outer '라는 뜻의 '비순수'를 '비순수'를 붙일 수도 null필드로 이동합니다.

  • 하면 .Unsafe아, 아, 아, 아, 아, 아, 아, 아, 아.
  • 네이티브 코드(예: JNI)를 사용하여 실행할 수 있습니다.
  • 반사를 통해서 할 수 있어요.

는 「」, 「」입니다.Outer.this하겠습니다.null를 클릭합니다2.

요컨대, 자격요건자라면 가능하다.thisnull그러나 프로그램이 "순수 자바" 규칙을 따른다면 불가능합니다.


1 - 바이트 코드를 손으로 "쓰기"하여 실제 Java로 전달하거나 BCEL 등을 사용하여 바이트 코드를 조정하거나 네이티브 코드로 건너뛰어 저장된 레지스터를 조작하는 등의 트릭을 할인합니다.IMO는 Java가 아닙니다.JVM의 버그로 인해 이러한 현상이 발생할 수 있지만 버그 보고서를 모두 본 것은 아닙니다.

2 - 실제로 JLS는 동작에 대해 언급하지 않으며 특히 구현에 의존할 수 있습니다.

에서는, 「」를 참조해 .this이므로 정의되어 않다this는 클래스가 아닌 인스턴스와 관련되어 있습니다.가 사용하려고 가 발생할 수 있습니다.this키워드를 지정합니다.

메서드를 호출하는 경우null참조,NullPointerExceptionJava VM에서 느려집니다.이는 사양에 따른 것이므로 Java VM이 사양을 엄격하게 준수하는 경우this결코 그렇지 않을 것이다null.

방법이 정적인 경우,this. 메서드가 가상인 경우this메서드를 호출하려면 런타임에서 vtable을 사용하여 참조해야 하기 때문에 null일 수 없습니다.this포인터메서드가 가상이 아닌 경우, 네, 다음과 같은 가능성이 있습니다.thismanageda 입니다.

및 C방식이 에서는 모든 에 C#은 C++로 Java로 되어 있습니다.this무효로 하다

tl;dr, "this"는 비정적 메서드에서만 호출할 수 있으며, 비정적 메서드는 null일 수 없는 일종의 객체에서 호출된다는 것을 모두 알고 있습니다.

언급URL : https://stackoverflow.com/questions/3789528/can-this-ever-be-null-in-java