Классовые переменные и методы
Введено| English | Значение |
|---|---|
| static variable/ˈstætɪk ˈveərɪəbl/ | Статическая переменная |
| static method/ˈstætɪk ˈmeθəd/ | статический метод |
Два объекта, один счетчик создания
- У Ады и Бо раздельные баллы, но создание любого из этих студентов увеличивает ту же самую статическую переменную,
Student.count. После двух созданий счетчик равен 2; изменение балла Ады не меняет балл Бо. - Сравните, что описывает каждое значение: балл описывает одного студента, в то время как этот счетчик описывает создание классов. Скопированная ссылка на Аду не создает новый объект и не увеличивает счетчик.
Разместите каждое поле на правильном уровне
- Поле экземпляра имеет отдельное место хранения в каждом объекте. Статическое поле имеет одно место хранения для загруженного класса, еще до того, как были созданы какие-либо объекты;
privateконтролирует доступ, а не количество копий. - В этом небольшом однопоточном примере конструктор увеличивает
countодин раз при каждом создании. Он подсчитывает созданные объекты, а не живые: потеря ссылки автоматически не уменьшает счетчик.
class Student {
private int score;
private static int count = 0;
public Student(int initialScore) {
score = initialScore;
count++;
}
public int getScore() { return score; }
public void setScore(int newScore) { score = newScore; }
public static int getCount() { return count; }
public static int readScore(Student s) { return s.score; }
}
Одна общая статическая переменная count
count — это общее значение, принадлежащее классу.
Статическая (классовая) переменная — это...
Сложность 1/5 · 100 монет + небольшой бонус за первое выполнение сегодня
static означает один общий экземпляр, принадлежащий классу.
Если конструктор выполняет count++ и count изначально равен 0, чему будет равно count после создания 3 объектов?
Сложность 2/5 · 140 монет + небольшой бонус за первое выполнение сегодня
Каждая конструкция увеличивает общую переменную count → 3.
Статический метод не имеет получателя
- Статический метод не имеет неявного текущего объекта, поэтому он не может использовать
thisили некачественное поле экземпляра, например,score.getCount()может читатьcount, потому что это поле принадлежит классу. - Статический контекст не запрещает работу с объектами.
readScore(Student s)получает явную ссылку на объект и читает полеs.score; оно находится внутри методаStudent, где доступ к этому приватному полю разрешен. Здесьsдолжно быть ненулевым.
return score; внутри статического метода является ошибкой компиляции в этом классе. return s.score; внутри показанного статического метода допустим: ссылка определяет, чей результат студента нужно прочитать.
Внутри показанного класса Student статический метод может использовать return score; без указания какого-либо объекта Student.
Сложность 1/5 · 100 монет + небольшой бонус за первое выполнение сегодня
Ложь: score — это поле экземпляра, а этот статический метод не имеет неявного получателя. При наличии параметра non-null Student s, return s.score; допустим внутри класса Student.
Внутри класса Student какой статический метод может прочитать оценку параметра s (non-null)?
Сложность 1/5 · 100 монет + небольшой бонус за первое выполнение сегодня
Явная ссылка s идентифицирует объект; сам класс Student может получить доступ к своему приватному полю score.
Отслеживание вызовов класса и объектов
- После выполнения кодов в блоках
Student a = new Student(50);иStudent b = new Student(75);, переменнаяStudent.getCount()становится равна 2,a.getScore()становится равна 50, аb.getScore()становится равна 75. Изменение в блокеa.setScore(60)влияет только на счет Ады. Student.readScore(a)затем возвращает 60 без создания нового студента. Метод является статическим, однако его явный параметр указывает на существующий объект, состояние которого он читает.
Инстансный метод, такой как getScore(), вызывается на...
Сложность 1/5 · 100 монет + небольшой бонус за первое выполнение сегодня
Инстансные члены работают с конкретным объектом.
Разделяйте легальный синтаксис и понятный стиль
- Предпочитайте
Student.getCount(), чтобы показать, что метод принадлежит классу. Java также допускаетa.getCount()для этого статического метода; такой синтаксис не делает счетчик специфичным именно для Ады. a.getScore()— это вызов экземпляра с Адой в качестве получателя.Student.getScore()здесь недопустим, так как метод требует объект и не является статическим; выбирайте поля и методы согласно их обязанностям.
Какой вызов лучше всего демонстрирует, что getCount() является статическим методом класса Student?
Сложность 1/5 · 100 монет + небольшой бонус за первое выполнение сегодня
Student.getCount() явно называет класс. Java также допускает student.getCount() для статического метода, но такое написание скрывает его принадлежность к уровню класса.
Предсказывание копирования ссылки
- Начиная с двух созданных студентов,
Student alias = a;оставляет счетчик создания на уровне 2.alias.setScore(90)изменяет существующий объект Ады, поэтомуa.getScore()равно 90, а результат Бо остается равным 75. - Подсчитайте количество выполнения
new Student(...), затем отдельно отследите состояние каждого объекта. Ни вызов аксессора, ни присваивание ссылки не создают студента, а статический метод все еще может читать явно переданный объект.
Статические поля хранят состояние класса; поля экземпляра хранят состояние объекта. Статические методы не имеют this, но могут использовать явные ссылки на объекты. Предпочитайте вызовы статических методов с квалификацией класса и различайте счетчики создания и счетчики живых объектов.
Два студента были созданы, поэтому count равен 2. Затем выполняется Student alias = a; и alias.setScore(90);. Чему равно значение Student.getCount()?
Сложность 2/5 · 140 монет + небольшой бонус за первое выполнение сегодня
Ни присвоение ссылки, ни изменение оценки не вызывают конструктор. Значение count остается 2.
Этот счетчик конструкторов автоматически уменьшается, когда теряется ссылка на студента.
Сложность 1/5 · 100 монет + небольшой бонус за первое выполнение сегодня
Только код, изменяющий count, меняет его. Этот пример подсчитывает создание объектов и не предоставляет декремента.