Нормальний 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 або подібних, або перестрибувати в нативний код і перебирати зі збереженими регістрами. IMO, це НЕ Java. Гіпотетично подібні речі можуть траплятися і внаслідок помилки JVM ... але я не пригадую кожного звіту про помилки.
2 - Насправді JLS не говорить про те, якою буде поведінка, і це може бути залежним від впровадження ... серед іншого.