Un normal this
nunca puede estar null
en 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 Inner
con una null
referencia a su Outer
ha fallado.
De hecho, si te quedas dentro del sobre de "Java puro", no podrás romperlo.
Sin embargo, cada Inner
instancia tiene un final
campo sintético oculto (llamado "this$0"
) que contiene la referencia al Outer
. Si es realmente complicado, es posible utilizar medios "no puros" para asignar null
al campo.
- Podrías usar
Unsafe
para 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.this
expresión se evaluará como null
2 .
En resumen, es posible que un calificado this
sea 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.