Ключевое слово static в Java: переменные, методы и блоки — практические примеры
В Java ключевое слово static встречается в трех различных контекстах: статические переменные, статические методы и статические блоки. Каждый играет уникальную роль в жизненном цикле класса и его экземпляров.
Статические переменные в Java
Статическая переменная — это поле уровня класса, которое инициализируется только один раз при первой загрузке класса. В отличие от переменных экземпляра, единственная копия статической переменной совместно используется всеми объектами этого класса.
- Существует только одна копия, общая для всех экземпляров.
- Доступна напрямую через
ClassName.variableNameбез создания объекта. - Инициализируется до установки любых полей экземпляра.
Синтаксис:
public static int count;
Статические методы в Java
Статические методы принадлежат классу, а не конкретному экземпляру. Их можно вызывать без создания объекта, и они могут обращаться только к статическим данным.
- Могут вызывать другие статические методы, но не методы экземпляра.
- Вызываются через
ClassName.methodName(). - Не могут использовать
thisилиsuper, так как не привязаны к экземпляру.
Все методы main являются статическими, чтобы JVM мог запустить приложение до создания каких-либо объектов.
Практический пример: использование статических переменных и методов
Ниже приведена простая программа, демонстрирующая, как статический счетчик совместно используется несколькими объектами Student.
public class Demo {
public static void main(String[] args) {
Student s1 = new Student();
s1.showData();
Student s2 = new Student();
s2.showData();
// Student.b++; // раскомментируйте, чтобы изменить счетчик
// s1.showData();
}
}
class Student {
int a; // переменная экземпляра, по умолчанию 0
static int b; // статический счетчик, инициализируется 0 один раз
Student() {
b++; // увеличиваем счетчик при каждом создании Student
}
public void showData() {
System.out.println("Value of a = " + a);
System.out.println("Value of b = " + b);
}
}
Скомпилируйте и запустите с java Demo, чтобы увидеть следующий вывод:
На диаграмме ниже показано, как создаются ссылочные переменные и объекты, и как статическая переменная b совместно используется экземплярами.
Для доступа к статической переменной извне класса используйте ClassName.variableName:
Student.b++; // увеличивает общий счетчик
s1.showData(); // покажет обновленное значение b
Попытка обратиться к переменной экземпляра из статического контекста приводит к ошибке компиляции:
error: non-static variable a cannot be referenced from a static context
a++;
Это происходит потому, что статические методы не могут напрямую взаимодействовать с полями экземпляра.
Статические блоки в Java
Статический блок — это специальный блок кода, который выполняется один раз при первой загрузке класса в JVM. Он идеален для инициализации статических полей, требующих более сложной логики, чем простое присваивание.
class Test {
static int a;
static int b;
static {
a = 10;
b = 20;
}
}
Запуск следующей программы демонстрирует вывод статического блока:
public class Demo {
static int a;
static int b;
static {
a = 10;
b = 20;
}
public static void main(String[] args) {
System.out.println("Value of a = " + a);
System.out.println("Value of b = " + b);
}
}
Вывод:
Value of a = 10 Value of b = 20
java
- Ключевое слово final в Java: переменные, методы и классы
- Оператор instanceof в Java: полное руководство с примерами
- Статические вложенные классы в Java: использование, отличия и примеры
- Анонимные внутренние классы в Java: определение, синтаксис и практические примеры
- Паттерн Singleton в Java: как реализовать и безопасно использовать
- Рефлексия в Java: инспекция классов, методов и полей во время выполнения
- Обработка исключений в Java: try, catch, finally, throw и throws
- Освоение Java ObjectOutputStream: сериализация, методы и практические примеры
- Освоение Java Generics: создание переиспользуемого, типобезопасного кода
- Мастерство файловых операций в Java с java.io: создание, чтение, запись и удаление