Иногда возникает необходимость определить элемент (член) класса так, чтобы появилась возможность пользоваться им независимо от какого-либо объекта этого класса.
Скачать исходники для статьи можно ниже
Обычно к элементам класса нужно обращаться только через объект этого класса. Однако можно создать элемент для использования без ссылки на определенный объект. Чтобы это сделать, укажите в начале его объявления ключевое слово static. Когда элемент объявляется как static, к нему можно обращаться до того, как создаются какие-либо объекты его класса, и без ссылки на какой-либо объект.
Переменные экземпляра, объявленные как static, это, по существу, глобальные переменные. Когда создаются объекты их класса, никакой копии static-переменной не делается. Вместо этого, все экземпляры класса совместно используют (разделяют) одну и ту же static-переменную.
Для организации вычислений с целью инициализировать статические переменные можно объявить статический блок, который выполняется только один раз, когда класс впервые загружается. Следующий пример демонстрирует класс, который имеет несколько переменных и блок инициализации:
// Демонстрирует статические переменные и блоки. class UseStatic { static int a = 3; static int b; static { System.out.println("static"); System.out.println("Статический блок инициализирован."); b = a * 4; } }
Bсe static-инструкции выполняются сразу же после загрузки класса UseStatic. Сначала, в а устанавливается 3, затем выполняется static-блок (печатая сообщения), и наконец, b инициализируется значением а * 4 или 12.
Вне класса, в котором они определены, статические переменные могут использоваться независимо от любого объекта. В этом случае для обращения к ним используются имена их класса и точечная операция. Например, если нужно вызвать static-переменную вне его класса, можно воспользоваться следующей общей формой вызова:
classname.a
Здесь classname — имя класса, в котором объявлена static-переменная а, и а — имя статической переменной. Так Java реализует управляемую версию глобальных переменных.
Например:
class StaticDemo { static int b = 99; } public class StaticByName { public static void main(String[] args) { System.out.println("b = " + StaticDemo.b); } }
Здесь внутри метода main() к статической переменной b обращаются вне их класса.
Вывод этой программы:
b = 99
Спецификатор final
Переменную можно объявить как final, предохраняя ее содержимое от изменения. Это означает, что нужно инициализировать final-переменную, когда она объявляется.
Например:
public class FinaDemol { public static void main(String[] args) { final int FILE_NEW = 1; final int FILE_OPEN = 2; final int FILE_SAVE = 3; final int FILE_SAVEAS = 4; final int FILE_QUIT = 5; //FILE_NEW = 8; // Выдает сообщение о невозможности назначить переменной значение } }
После таких объявлений последующие части программы могут использовать FILE_NEW и т. д., как константы, без опасения, что их значения были изменены.
Общее соглашение кодирования для final-переменных — выбирать все идентификаторы в верхнем регистре. Переменные, объявленные как final, не занимают память на “поэкземплярной” основе. Таким образом, final- переменная — по существу константа.