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