Campos estáticos en una referencia nula en Java

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. […]

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 comstack para

 main.getNull(); Main.value 

Siempre que acceda a una variable estática o método con objetos en tiempo de comstackció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 comstackción se convertirá en

 System.out.println(Main.value); 

Prueba:

descargue el descomstackdor 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.

  1. El acceso a un miembro static con el nombre de clase es legal, pero no se escribió que no se puede acceder al miembro static utilizando la variable de referencia del objeto. Entonces funciona aquí.

  2. Se permite que una variable de referencia de objeto null acceda a una variable de clase static sin lanzar una excepción en comstackción o en tiempo de ejecución.

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