Campos estáticos em uma referência nula em Java

static membros static (campos static ou methods static ) em Java são associados a suas respectivas classs, e não aos objects dessa class. O código a seguir tenta acessar um campo estático em uma referência 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); } } 

Embora main.getNull() retorne null , ele funciona e exibe value = 10 . Como esse código funciona?

Esse comportamento é especificado na especificação da linguagem Java :

Uma referência nula pode ser usada para acessar uma variável de class (estática) sem causar uma exceção.

Em mais detalhes, uma avaliação de campo estático , como Primary.staticField funciona da seguinte maneira (ênfase minha) – no seu caso, Primary = main.getNull() :

  • A expressão primária é avaliada e o resultado é descartado . […]
  • Se o campo for um campo final não em branco, o resultado será o valor da variável de class especificada na class ou interface que é o tipo da expressão Primária. […]

Porque, como você disse, os campos estáticos não estão associados a uma instância.

A capacidade de acessar campos estáticos a partir de uma referência de instância (como você está fazendo) é meramente um açúcar sintático e não tem significado adicional.
Seu código é compilado para

 main.getNull(); Main.value 

Sempre que você acessar uma variável ou método estático com objects em tempo de compilation, ele será convertido em Nome da class. por exemplo:

 Main main = null; System.out.println(main.value); 

Ele irá imprimir o valor do valor da variável estática porque em tempo de compilation Ele será convertido para

 System.out.println(Main.value); 

Prova:

baixe o decompilador e decompile o seu arquivo .class para o arquivo .java e você poderá ver que todos os methods estáticos ou nome do object de referência variável são automaticamente substituídos pelo nome da class.

  1. Acessar um membro static com o nome da class é legal, mas não foram escritos que não é possível acessar o membro static usando a variável de referência do object. Então funciona aqui.

  2. Uma variável de referência de object null tem permissão para acessar uma variável de class static sem gerar uma exceção na compilation ou no tempo de execução.

Variável estática e método sempre pertencem à class. Portanto, sempre que criarmos qualquer object, apenas variables ​​não estáticas e methods serão acumulados junto com o object, mas a estática residirá na área do método com a class. É por isso que sempre que tentamos acessar uma variável estática ou método, ela é convertida em variável de ponto de nome de class ou nome de método.

Por favor, consulte o link abaixo para mais detalhes.

http://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html