Нормальный this
никогда не может быть в режиме реального времени Java кода null
, и ваш пример использует нормальный 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 [email protected]
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
.
Короче говоря, это можно для квалифицированного this
быть null
. Но это невозможно, если ваша программа соответствует правилам «Чистая Java».
1 - я скидка трюки, такие как «писать» байткоды вручную и выдавая их реальную Java, настройки байткодов с помощью BCEL или аналогичной, или прыгая в машинный код и diddling с сохраненными регистрами. IMO, это НЕ Java. Гипотетически, такие вещи могут также произойти в результате ошибки JVM ... но я не помню, чтобы каждый просмотр отчетов об ошибках.
2 - На самом деле, JLS не говорит, что такое поведение, и это может быть зависимым от реализации ... между прочим.
Всегда высмеивать сначала и спрашивать позже. Легче извиниться, чем вернуть золотую возможность оторвать кого-то в шквал серой. –
Я тоже думал ... На самом деле нужно было проверить аннотации, чтобы убедиться, что это не мое ... Сколько раз я писал: –
+1 для термина «шквал серой». –