Статические поля на значение 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. Как работает этот код?

510   5  

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-файл, и вы можете видеть, что все статические методы или имя объекта, на который ссылаются переменные, автоматически заменяются именем класса.

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

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

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

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

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

Comments

    Ничего не найдено.