Из См. Методы статических переменных Java :
- Это переменная, которая принадлежит классу, а не объекту (экземпляру)
- Статические переменные инициализируются только один раз, в начале выполнения. Эти переменные будут инициализированы первыми, перед инициализацией любых переменных экземпляра.
- Единая копия для всех экземпляров класса
- Доступ к статической переменной можно получить напрямую по имени класса и не требует никаких объектов.
Переменные экземпляра и класса (статические) автоматически инициализируются стандартными значениями по умолчанию, если вы не можете преднамеренно инициализировать их. Хотя локальные переменные не инициализируются автоматически, вы не можете скомпилировать программу, которая не может инициализировать локальную переменную или присвоить значение этой локальной переменной до ее использования.
На самом деле компилятор создает внутреннюю процедуру инициализации одного класса, которая объединяет все инициализаторы статических переменных и все блоки кода статического инициализатора в том порядке, в котором они указаны в объявлении класса. Эта единственная процедура инициализации запускается автоматически, только один раз, при первой загрузке класса.
В случае внутренних классов у них не может быть статических полей
Внутренний класс является вложенным классом , который не явно или неявно объявляется static
.
...
Внутренние классы не могут объявлять статические инициализаторы (§8.7) или интерфейсы-члены ...
Внутренние классы не могут объявлять статические члены, если они не являются постоянными переменными ...
См. JLS 8.1.3 Внутренние классы и закрывающие экземпляры
final
Поля в Java могут быть инициализированы отдельно от места их объявления, однако это не может быть применимо к static final
полям. См. Пример ниже.
final class Demo
{
private final int x;
private static final int z;
static
{
z = 10;
}
public Demo(int x)
{
this.x=x;
}
}
Это происходит потому , что есть только одна копия из static
переменных , связанных с типом, а не один , связанным с каждым экземпляром типа , как с переменным экземпляром и если мы попытаемся инициализировать z
тип static final
в конструкторе, он будет пытаться повторно инициализировать static final
поле типа z
потому что конструктор запускается при каждой реализации класса, что не должно происходить со статическими final
полями.