Вопрос по java, static – Статические поля на нулевой ссылке в Java

116

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. Marko Topolnik
Это напоминает мне оnew Thread[]{}[-1].sleep(10); где sleep () - статический метод. Раньше это было успешно на некоторых старых версиях Java. hertzsprung
Может быть, этот вопрос поможет вам понять это:How come invoking a (static) method on a null reference doesn't throw NullPointerException? Jan Gerlinger

Ваш Ответ

5   ответов
3

о время компиляции, они преобразуются в имя класса. например:

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

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

System.out.println(Main.value);

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

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

92

Спецификация языка Java:

a null reference may be used to access a class (static) variable without causing an exception.

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

The Primary expression is evaluated, and the result is discarded. [...] If the field is a non-blank final field, then the result is the value of the specified class variable in the class or interface that is the type of the Primary expression. [...]
@Falanwe Это разрешено, но в Eclipse выдается предупреждение: & quot; Статическое поле Main.value должно быть доступно статическим способом & quot ;. По крайней мере, те из нас, кто придирчив к предупреждениям (как и я), избежали бы такого кода.
Если у кого-то есть информация оwhy этот выбор был сделан, что было бы интересно.
@JonofAllTrades: реальный вопрос заключается в том, почему был сделан выбор, позволяющий вызывать статические элементы в качестве экземпляра ... Мне кажется, это приводит только к путанице и менее читаемому коду.
@Falanwe: Согласен, и это конструкция, в которой я не нуждался, хотя я в основном работаю в .NET, где это не разрешено. Я предполагаю, что вы можете вызвать соответствующий статический метод подкласса, когда вам дается ссылка на родительский класс.
@JonofAllTrades Я думаю, что это очевидно: разумно не генерировать никаких исключений при вызове нулевой ссылки, потому что это не имеет значения, поскольку метод является статическим.
19

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

main.getNull(); 
Main.value
Я бы назвал это синтаксическим сахаром, больше похожим на синтаксические опилки;)
3

Accessing a static member with the class name is legal, but its no were written that one cannot access the static member using the object reference variable. So it works over here.

A null object reference variable is allowed to access a static class variable without throwing an exception either at compile or run time.

2

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

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

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

Похожие вопросы