Нормальный this
никогда не может быть null
в реальном коде Java 1 , и в вашем примере используется нормальный this
. См. Другие ответы для более подробной информации.
Квалифицированный 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)
показывает, что наша попытка создать Inner
со ссылкой null
на Outer
не удалась.
На самом деле, если вы застряли в конверте "Чистая Ява", вы не сможете сломать это.
Однако каждый экземпляр Inner
имеет скрытое синтетическое поле final
(называемое "this$0"
), которое содержит ссылку на Outer
. Если вы действительно хитры, можно использовать «не чистые» средства для присвоения null
полю.
- Вы можете использовать
Unsafe
, чтобы сделать это.
- Вы можете использовать нативный код (например, JNI) для этого.
- Вы можете сделать это, используя отражение.
В любом случае, в конечном итоге выражение Outer.this
будет иметь значение null
2 .
Короче говоря, возможно для квалифицированного this
быть null
. Но это невозможно , если ваша программа следует правилам "Чистой Java".
1 - Я обесцениваю уловки, такие как «написание» байт-кодов вручную и выдавая их за реальную Java, настройку байт-кодов с использованием BCEL или аналогичных, или переход в нативный код и использование сохраненных регистров ИМО, это НЕ ЯВА. Гипотетически, такие вещи могут также произойти в результате ошибки JVM ... но я не помню, чтобы каждый видел сообщения об ошибках.
2 - На самом деле, JLS не говорит, каково будет поведение, и это может зависеть от реализации ... среди прочего.