Вызов / доступ к статическим переменным или методам - PullRequest
0 голосов
/ 17 марта 2019

Я учусь на ОСА, и этот код был в книге, которую я использую.

 public class Koala {
       public **static** int count = 0;
       public **static** void main(String[] args) {
          System.out.println(count);
       }
    }

    Koala k = new Koala();
    System.out.println(k.count); //prints 0
    k = null;
    System.out.println(k.count); //prints 0

Я понимаю, что когда статическая переменная изменяется в одном объекте, она изменяется во всех них.Почему этот последний println не печатает "null"?!

1 Ответ

0 голосов
/ 17 марта 2019

Я понимаю, что когда статическая переменная изменяется в одном объекте, она изменяется во всех них

Вы понимаете неправильно.То есть, вы не можете думать о статической переменной как о "в одном объекте" во-первых.

Статическая переменная не является членом экземпляра класса ввсе.В некоторых языках (например, Java, который вы здесь используете), вы можете получить доступ к статическим членам через переменные, имеющие один и тот же тип класса.Но в этом случае вы не обращаетесь к экземпляру класса.Вы по-прежнему обращаетесь к переменной shared , которая на самом деле является частью типа класса, а не к какому-либо отдельному экземпляру этого класса.

Идиоматически, можно было бына самом деле напишите Koala.count, чтобы получить доступ к полю count в вашем примере.

Когда вы пишете, например, в своем коде что-то вроде k.count, значение k вообще не имеет значения.Это особенность языка, который компилятор интерпретирует как выражение целиком, ссылаясь на тот же элемент, на который ссылается выражение Koala.count.Т.е. поскольку нет необходимости разыменовывать ссылку на экземпляр для доступа к члену count, считается допустимым делать это через любую переменную, имеющую тип Koala, даже если текущее значение этой переменной равно null.null игнорируется, поскольку для доступа к статическому члену count.

вообще не требуется никакой ссылки на какой-либо экземпляр, поскольку значение переменной k игнорируется, вы получите тот же результат, независимо от того,он присваивается фактическому экземпляру класса Koala или просто null.

...