Статические поля в нулевой ссылке в Java

static members (static fields или static methods) в Java связаны с их соответствующим классом, а не с объектами этого класса. Следующий код пытается получить доступ к статическому полю в справочнике 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);
    }
}

Хотя main.getNull() возвращает null, он работает и отображает value = 10. Как работает этот код?

Ответ 1

Это поведение указано в Спецификации языка Java:

нулевая ссылка может использоваться для доступа к переменной класса (статической) без возникновения исключения.

Более подробно оценка статического поля, такая как Primary.staticField работает следующим образом (выделение мое) - в вашем случае Primary = main.getNull():

  • Первичное выражение оценивается, и результат отбрасывается. [...]
  • Если поле является непустым конечным полем, то результатом будет значение указанной переменной класса в классе или интерфейсе, являющемся типом первичного выражения. [...]

Ответ 2

Поскольку, как вы сказали, статические поля не связаны с экземпляром.

Возможность доступа к статическим полям из ссылки экземпляра (как вы это делаете) является просто синтаксическим сахаром и не имеет никакого дополнительного значения.
Ваш код компилируется в

main.getNull(); 
Main.value

Ответ 3

  • Доступ к члену static с именем класса является законным, но его нет были написаны, что нельзя получить доступ к элементу static, используя переменная объекта. Итак, он работает здесь.

  • Объектная ссылочная переменная A null имеет доступ к классу static переменная без исключения исключения при компиляции или запуске время.

Ответ 4

Когда вы получаете доступ к статической переменной или методу с объектами во время компиляции, она преобразуется в имя класса. например:

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

Он выведет значение статической переменной, потому что во время компиляции он будет преобразован в

System.out.println(Main.value);

Доказательство:

скачать декомпилятор и декомпилировать ваш .class файл в .java файл, и вы можете увидеть, что все статические методы или имя, присвоенное переменной, автоматически заменяется именем класса.

Ответ 5

Статическая переменная и метод всегда относятся к классу. Поэтому, когда мы создаем какой-либо объект, только статическая переменная и методы переходят в кучу вместе с объектом, но статические объекты находятся в области метода с классом. Поэтому, когда мы пытаемся получить доступ к статической переменной или методу, она преобразуется в переменную класса или имя метода.

Подробнее см. ссылку ниже.

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