Статические поля в нулевой ссылке в 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