programacion - Campos estáticos en una referencia nula en Java
manual de programacion android pdf (5)
El acceso a un miembro
static
con el nombre de clase es legal, pero no se escribió que no se puede acceder al miembrostatic
utilizando la variable de referencia del objeto. Entonces funciona aquí.Se permite que una variable de referencia de objeto
null
acceda a una variable de clasestatic
sin lanzar una excepción en compilación o en tiempo de ejecución.
static
miembros static
(campos static
o métodos static
) en Java están asociados con su clase respectiva en lugar de los objetos de esta clase. El siguiente código intenta acceder a un campo estático en una referencia null
.
public class Main
{
private static final int value = 10;
public Main getNull()
{
return null;
}
public static void main(String[] args)
{
Main main=new Main();
System.out.println("value = "+main.getNull().value);
}
}
Aunque main.getNull()
devuelve null
, funciona y muestra value = 10
. ¿Cómo funciona este código?
Ese comportamiento se especifica en la Especificación del lenguaje Java :
una referencia nula se puede usar para acceder a una variable de clase (estática) sin causar una excepción.
En más detalles, una evaluación de campo estática , como Primary.staticField
funciona de la siguiente manera (énfasis mío) - en su caso, Primary = main.getNull()
:
- La expresión primaria se evalúa y el resultado se descarta . [...]
- Si el campo es un campo final no vacío, el resultado es el valor de la variable de clase especificada en la clase o interfaz que es el tipo de expresión principal. [...]
La variable estática y el método siempre pertenecen a la clase. Así que, cuando creamos cualquier objeto, solo la variable no estática y los métodos van al montón junto con el objeto, pero la estática reside en el área del método con la clase. Es por eso que, cuando intentamos acceder a una variable o método estático, se convierte en nombre de clase variable de punto o nombre de método.
Consulte el enlace a continuación para obtener más detalles.
http://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html
Porque, como dijiste, los campos estáticos no están asociados con una instancia.
La capacidad de acceder a campos estáticos desde una referencia de instancia (como lo está haciendo) no es más que un azúcar sintáctico y no tiene ningún significado adicional.
Tu código se compila para
main.getNull();
Main.value
Siempre que acceda a una variable estática o método con objetos en tiempo de compilación, se convertirá en nombre de clase. p.ej:
Main main = null;
System.out.println(main.value);
Imprimirá el valor del valor de la variable estática porque en tiempo de compilación se convertirá en
System.out.println(Main.value);
Prueba:
descargue el descompilador y descomprima su archivo .class en el archivo .java y podrá ver todos los métodos estáticos o el nombre variable del objeto referido se reemplaza automáticamente por el nombre de la clase.