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
. Как работает этот код?
Main main = null; main.getNull().value
.new Thread[]{}[-1].sleep(10);
sleep () - статический метод. Раньше это было успешным в некоторых старых версиях Java.Ответы:
Такое поведение указано в Спецификации языка Java :
Более подробно, статическая оценка поля , например,
Primary.staticField
работает следующим образом (выделено мной) - в вашем случаеPrimary = main.getNull()
:источник
Потому что, как вы сказали, статические поля не связаны с экземпляром.
Возможность доступа к статическим полям из ссылки на экземпляр (как вы это делаете) - это просто синтаксический сахар и не имеет дополнительного значения.
Ваш код компилируется в
источник
Когда вы обращаетесь к статической переменной или методу с объектами во время компиляции, они преобразуются в имя класса. например:
Он напечатает значение статической переменной, потому что во время компиляции оно будет преобразовано в
Доказательство:
загрузите декомпилятор и декомпилируйте файл .class в файл .java, и вы увидите, что все статические методы или имя объекта, на которое ссылается переменная, автоматически заменяются именем класса.
источник
Доступ к
static
члену с именем класса разрешен, но не было написано, что нельзя получить доступ кstatic
члену с помощью переменной ссылки на объект. Так что здесь работает.null
Ссылка на объект переменной разрешен доступ кstatic
переменной класса без бросать исключения либо во время компиляции или во время выполнения.источник
Статическая переменная и метод всегда принадлежат классу. Поэтому, когда мы когда-либо создаем какой-либо объект, только нестатическая переменная и методы отправляются в кучу вместе с объектом, но статические находятся в области методов с классом. Вот почему, когда мы пытаемся получить доступ к статической переменной или методу, она преобразуется в точечную переменную имени класса или имя метода.
Пожалуйста, обратитесь к ссылке ниже для получения более подробной информации.
http://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html
источник