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
그 전에 아우터 this
null
…
아니요. 클래스의 인스턴스의 메서드를 호출하려면 인스턴스가 존재해야 합니다.됩니다.이 파라미터는 메서드에 됩니다.this
.this
null
어떤 방법이라고 부를만한 인스턴스가 없었겠죠.
언어가 강요하는 것만으로는 충분하지 않습니다.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.
요컨대, 자격요건자라면 가능하다.this
null
그러나 프로그램이 "순수 자바" 규칙을 따른다면 불가능합니다.
1 - 바이트 코드를 손으로 "쓰기"하여 실제 Java로 전달하거나 BCEL 등을 사용하여 바이트 코드를 조정하거나 네이티브 코드로 건너뛰어 저장된 레지스터를 조작하는 등의 트릭을 할인합니다.IMO는 Java가 아닙니다.JVM의 버그로 인해 이러한 현상이 발생할 수 있지만 버그 보고서를 모두 본 것은 아닙니다.
2 - 실제로 JLS는 동작에 대해 언급하지 않으며 특히 구현에 의존할 수 있습니다.
에서는, 「」를 참조해 .this
이므로 정의되어 않다this
는 클래스가 아닌 인스턴스와 관련되어 있습니다.가 사용하려고 가 발생할 수 있습니다.this
키워드를 지정합니다.
메서드를 호출하는 경우null
참조,NullPointerException
Java VM에서 느려집니다.이는 사양에 따른 것이므로 Java VM이 사양을 엄격하게 준수하는 경우this
결코 그렇지 않을 것이다null
.
방법이 정적인 경우,this
. 메서드가 가상인 경우this
메서드를 호출하려면 런타임에서 vtable을 사용하여 참조해야 하기 때문에 null일 수 없습니다.this
포인터이 메서드가 가상이 아닌 경우, 네, 다음과 같은 가능성이 있습니다.this
manageda 입니다.
및 C방식이 에서는 모든 에 C#은 C++로 Java로 되어 있습니다.this
무효로 하다
tl;dr, "this"는 비정적 메서드에서만 호출할 수 있으며, 비정적 메서드는 null일 수 없는 일종의 객체에서 호출된다는 것을 모두 알고 있습니다.
언급URL : https://stackoverflow.com/questions/3789528/can-this-ever-be-null-in-java
'source' 카테고리의 다른 글
ERROR 1130 (HY000):호스트 "는 이 MySQL 서버에 연결할 수 없습니다. (0) | 2022.11.14 |
---|---|
고유한 쌍 SQL 덮어쓰기 (0) | 2022.11.14 |
jQuery로 포커스 요소를 얻는 방법 (0) | 2022.11.14 |
마리아에서 하위 문자열 또는 단어 검색DB (0) | 2022.11.14 |
복합 인덱스는 언제 사용해야 합니까? (0) | 2022.11.14 |