На этом шаге мы поговорим про статические поля и методы
При объявлении метода main() во всех рассматривавшихся ранее примерах программ мы использовали модификатор static. Рассмотрим назначение этого модификатора доступа.
Поле с модификатором доступа static существует в одном экземпляре для всего класса. Но если поле не статическое, то каждый объект содержит его копию. Допустим, требуется присвоить уникальный идентификационный номер каждому сотруднику. Для этого достаточно добавить в класс Employee поле id и статическое поле nextId, как показано ниже.
class Employee { ... private int id; private static int nextId = 1; public void setId() { id = nextId++; } }
Теперь у каждого объекта типа Employee имеется свое поле id, а также поле nextId, которое одновременно принадлежит всем экземплярам данного класса. Иными словами, если существует тысяча объектов типа Employee, то в них есть тысяча полей id: по одному на каждый объект. В то же время существует только один экземпляр статического поля nextId. Даже если не создано ни одного объекта типа Employee, статическое поле nextId все равно существует. Оно принадлежит классу, а не конкретному объекту.
Статические переменные используются довольно редко. В то же время статические константы (то есть полями, объявленными с ключевым словом final) применяются намного чаще. Примером такой константы служит число π, определенное в классе Math. Как уже упоминалось не раз, делать поля открытыми в коде не рекомендуется, поскольку любой объект сможет изменить их значения. Но открытыми константами можно пользоваться смело.
Статическими называются методы, которые не оперируют объектами. Примером такого метода является метод pow(x, a) из класса Math (результатом метода является выражение xa). При выполнении этого метода не используется ни один из экземпляров класса Math. Иными словами, у него нет неявного параметра this. Это означает, что в статических методах не используется текущий объект по ссылке this.
В связи с тем что статические методы не оперируют объектами, из них нельзя получить доступ к полям экземпляра. Но статические методы имеют доступ к статическим полям класса. Ниже приведен пример статического метода.
public static int getNextId() { return nextId; }
Чтобы вызвать этот метод, нужно указать имя класса следующим образом:
int n = Employee.getNextId();
Статические методы следует применять в двух случаях:
На следующем шаге мы поговорим про параметры методов