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