Статическая переменная с нулевой ссылкой - PullRequest
1 голос
/ 11 мая 2019

Когда я запускаю этот код, он печатает дважды 0, но я не понимаю, почему после того, как повлияет на объект k, чтобы обнулить значение счетчика, по-прежнему печатается 0, но когда я удаляю static до счетчика и выполняю эту программу, он печатает сначала 0, а затемЯ печатаю исключение Исключение в потоке "main" java.lang.NullPointerException.Пожалуйста, вы можете решить эту проблему.

public class Test{
    public static int count=0;
    public static void main(String[] args){
        Test t = new Test();
        System.out.println(t.count); // 0
        t=null;
        System.out.println(t.count); // 0
    }
}

Ответы [ 2 ]

1 голос
/ 11 мая 2019

static переменные в Java определены на уровне класса, и вам не нужен объект этого класса для ссылки на статическую переменную. И даже если вы напишите t.count, вместо этого JVM выполнит обычный Test.count (он заменит имя переменной на имя ее класса).

и ниже выдержка из JLS: https://docs.oracle.com/javase/specs/jls/se11/html/jls-15.html#jls-15.11.1

Пример 15.11.1-2. Переменная приемника не имеет значения для статического поля Доступ

Следующая программа демонстрирует, что может использоваться нулевая ссылка получить доступ к переменной класса (статической) без исключения:

класс Test3 { статическая Струнная гора = "Chocorua"; статический Test3 любимый () { System.out.print («Монтировать»); вернуть ноль; } public static void main (String [] args) { System.out.println (. Любимый () гора); }} Он компилирует, выполняет и печатает:

Гора Чокоруа Несмотря на то, что результат избранное () равно нулю NullPointerException не выбрасывается. Это "гора" печатается демонстрирует, что первичное выражение действительно полностью оценивается в время выполнения, несмотря на то, что используется только его тип, а не его значение определить, к какому полю обращаться (потому что поле статический).

1 голос
/ 11 мая 2019

Полагаю, вы имели в виду t=null; вместо k=null;.

Статические переменные всегда присутствуют во всей программе только один раз, они не сгибаются с объектами.Все экземпляры Test всегда имеют одинаковое количество.Если вы установите его на что-то другое, оно изменится для всех экземпляров.Следовательно, вы также можете прочитать значение из нуля.В качестве альтернативы вы можете использовать System.out.println(Test::count), который также будет печатать 0, без необходимости какого-либо объекта класса Test.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...