Статические поля на значение null в Java
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. Как работает этот код?
5 ответов:
это поведение указано в Спецификация Языка Java:
нулевая ссылка может использоваться для доступа к переменной класса (статической), не вызывая исключения.
более подробно, a оценка статического поля, например
Primary.staticFieldработает следующим образом (акцент мой) - в вашем случае,Primary = main.getNull():
- первичное выражение вычисляется, и результат отбрасывается. [...]
- если поле является непустым конечным полем, то результатом является значение указанной переменной класса в класс или интерфейс, который является типом основного выражения. [...]
потому что, как вы сказали, статические поля не связан с экземпляром.
возможность доступа к статическим полям из ссылки на экземпляр (как вы делаете) является просто синтаксическим сахаром и не имеет дополнительного значения.
Ваш код компилируется вmain.getNull(); Main.value
когда вы получаете доступ к статической переменной или метода с объектами во время компиляции, он преобразуется в имя класса. например:
Main main = null; System.out.println(main.value);он будет печатать значение статической переменной value, потому что во время компиляции он будет преобразован в
System.out.println(Main.value);доказательство:
скачать декомпилятор и декомпилировать ваш .файл класса .java-файл, и вы можете видеть, что все статические методы или имя объекта, на который ссылаются переменные, автоматически заменяются именем класса.
к
staticчлен с именем класса является законным, но его нет были написаны, что нельзя получить доступ кstaticчлен с помощью переменная ссылки на объект. Так что это работает здесь.A
nullобъектная ссылочная переменная имеет доступ кstaticкласс переменная без создания исключения либо при компиляции, либо при запуске время.
статическая переменная и метод всегда принадлежат классу. Поэтому, когда мы создаем какой-либо объект, только нестатическая переменная и методы идут в кучу вместе с объектом, но статика находится в области метода с классом. Вот почему, когда мы пытаемся получить доступ к статической переменной или методу, он преобразуется в имя класса dot variable или method name.
пожалуйста, обратитесь к ссылке ниже для более подробной информации.
http://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html
Comments