Un normal thisnunca puede estar nullen el código 1 de Java real , y su ejemplo usa un normal this. Vea otras las otras respuestas para más detalles.
Un calificado nunca this debería serlo null, pero es posible romper esto. Considera lo siguiente:
public class Outer {
public Outer() {}
public class Inner {
public Inner() {}
public String toString() {
return "outer is " + Outer.this; // Qualified this!!
}
}
}
Cuando queremos crear una instancia de Inner, necesitamos hacer esto:
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
}
La salida es:
outer is Outer@2a139a55
Exception in thread "main" java.lang.NullPointerException
at Outer.main(Outer.java:19)
mostrando que nuestro intento de crear un Innercon una nullreferencia a su Outerha fallado.
De hecho, si te quedas dentro del sobre de "Java puro", no podrás romperlo.
Sin embargo, cada Innerinstancia tiene un finalcampo sintético oculto (llamado "this$0") que contiene la referencia al Outer. Si es realmente complicado, es posible utilizar medios "no puros" para asignar nullal campo.
- Podrías usar
Unsafepara hacerlo.
- Puede usar código nativo (por ejemplo, JNI) para hacerlo.
- Podrías hacerlo usando la reflexión.
De cualquier manera que lo haga, el resultado final es que la Outer.thisexpresión se evaluará como null2 .
En resumen, es posible que un calificado thissea null. Pero es imposible si su programa sigue las reglas de "Java puro".
1 - Descarto trucos como "escribir" los códigos de bytes a mano y pasarlos como Java real, ajustar los códigos de bytes usando BCEL o similar, o saltar al código nativo y jugar con los registros guardados. En mi opinión, eso NO es Java. Hipotéticamente, estas cosas también podrían suceder como resultado de un error de JVM ... pero no recuerdo todos los informes de errores que vi.
2 - En realidad, el JLS no dice cuál será el comportamiento, y podría depender de la implementación ... entre otras cosas.