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