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

java static

7628 просмотра

5 ответа

staticчлены ( staticполя или staticметоды) в 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. Как работает этот код?

Автор: Tiny Источник Размещён: 12.11.2019 09:27

Ответы (5)


92 плюса

Решение

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

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

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

  • Первичное выражение оценивается, а результат отбрасывается . [...]
  • Если поле является непустым конечным полем, то результатом является значение указанной переменной класса в классе или интерфейсе, который является типом основного выражения. [...]
Автор: assylias Размещён: 20.07.2012 01:06

19 плюса

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

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

main.getNull(); 
Main.value
Автор: SLaks Размещён: 20.07.2012 01:05

3 плюса

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

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

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

System.out.println(Main.value);

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

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

Автор: Rais Alam Размещён: 20.12.2012 09:52

3 плюса

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

  2. nullСсылка на объект переменной разрешен доступ к staticпеременной класса без бросать исключения либо во время компиляции или во время выполнения.

Автор: Kumar Vivek Mitra Размещён: 20.07.2012 01:10

2 плюса

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

Пожалуйста, обратитесь к ссылке ниже для более подробной информации.

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

Автор: user1930050 Размещён: 26.12.2012 02:39
Вопросы из категории :
32x32