Мой вопрос об одном конкретном использовании статического ключевого слова. Можно использовать static
ключевое слово для покрытия блока кода внутри класса, который не принадлежит ни одной функции. Например, следующий код компилируется:
public class Test {
private static final int a;
static {
a = 5;
doSomething(a);
}
private static int doSomething(int x) {
return (x+5);
}
}
Если удалить static
ключевое слово он жалуется , потому что переменная a
есть final
. Однако можно удалить final
и static
ключевые слова, и сделать их компиляцией.
Это смущает меня в обоих направлениях. Как я должен иметь раздел кода, который не принадлежит ни одному методу? Как это можно вызвать? Вообще, какова цель этого использования? Или лучше, где я могу найти документацию по этому поводу?
источник
public static void staticMethod(){}
, если вы выполняетеTestStatic.class.getMethod("staticMethod");
. Статический инициализатор не будет вызван. Более подробная информация здесь docs.oracle.com/javase/specs/jvms/se10/html/…Уфф! что такое статический инициализатор?
Статический инициализатор - это
static {}
блок кода внутри java-класса, который запускается только один раз перед вызовом конструктора или метода main.ХОРОШО! Расскажи больше ...
static { ... }
внутри любого Java-класса. и выполняется виртуальной машиной при вызове класса.return
заявления не поддерживаются.this
илиsuper
поддерживаются.Хм, где я могу использовать это?
Может быть использован везде, где вы чувствуете себя хорошо :) это просто. Но я вижу, что большую часть времени он используется при подключении к базе данных, инициализации API, ведении журнала и т. Д.
Не просто лаять! где пример?
Вывод???
Надеюсь это поможет!
источник
afterPropertiesSet()
изInitializingBean
?static
Блок является «статическим инициализатором».Он автоматически вызывается при загрузке класса, и нет другого способа вызвать его (даже через Reflection).
Я лично использовал его только когда писал код JNI:
источник
Method
экземпляром, а вызывается только виртуальной машиной Java.Это прямо с http://www.programcreek.com/2011/10/java-class-instance-initializers/
1. Выполнение заказа
Посмотрите на следующий класс, знаете ли вы, какой из них выполняется первым?
Вывод:
2. Как работает инициализатор экземпляра Java?
Приведенный выше инициализатор экземпляра содержит оператор println. Чтобы понять , как это работает, мы можем рассматривать его как оператор присваивания переменной, например,
b = 0
. Это может сделать это более очевидным для понимания.Вместо
int b = 0
Вы могли бы написатьСледовательно, инициализаторы экземпляров и инициализаторы переменных экземпляров практически одинаковы.
3. Когда инициализаторы экземпляра полезны?
Использование инициализаторов экземпляров встречается редко, но все же это может быть полезной альтернативой инициализаторам переменных экземпляров, если:
Конечно, такой код может быть написан в конструкторах. Но если бы в классе было несколько конструкторов, вам пришлось бы повторять код в каждом конструкторе.
С инициализатором экземпляра вы можете просто написать код один раз, и он будет выполняться независимо от того, какой конструктор используется для создания объекта. (Я думаю, это просто концепция, и она не часто используется.)
Другой случай, когда инициализаторы экземпляров полезны, это анонимные внутренние классы, которые вообще не могут объявлять никаких конструкторов. (Будет ли это хорошим местом для размещения функции регистрации?)
Благодаря Derhein.
Также обратите внимание, что у анонимных классов, которые реализуют интерфейсы [1], нет конструкторов. Поэтому инициализаторы экземпляров необходимы для выполнения любых видов выражений во время построения.
источник
«final» гарантирует, что переменная должна быть инициализирована до завершения кода инициализатора объекта. Аналогично, «static final» гарантирует, что переменная будет инициализирована в конце кода инициализации класса. Отсутствие «статического» кода инициализации превращает его в код инициализации объекта; таким образом, ваша переменная больше не удовлетворяет своим гарантиям.
источник
Вы не будете писать код в статический блок, который нужно вызывать где-либо в вашей программе. Если нужно вызвать код, то вы должны поместить его в метод.
Вы можете написать статические блоки инициализатора для инициализации статических переменных, когда класс загружен, но этот код может быть более сложным.
Статический блок инициализатора выглядит как метод без имени, без аргументов и без возвращаемого типа. Поскольку вы никогда не называете это, ему не нужно имя. Единственный раз, когда он вызывается, это когда виртуальная машина загружает класс.
источник
когда разработчик использует блок инициализатора, компилятор Java копирует инициализатор в каждый конструктор текущего класса.
Пример:
следующий код:
эквивалентно:
Надеюсь, мой пример понятен разработчикам.
источник
Блок статического кода может использоваться для создания или инициализации переменных класса (в отличие от переменных объекта). Таким образом, объявление статического «a» означает, что только один объект является общим для всех объектов Test, и блок статического кода инициализирует «a» только один раз, когда класс Test загружается впервые, независимо от того, сколько объектов Test создано.
источник