Я смотрю на код ниже и нашел что-то странное:
public class Sequence {
Sequence() {
System.out.print("c ");
}
{
System.out.print("y ");
}
public static void main(String[] args) {
new Sequence().go();
}
void go() {
System.out.print("g ");
}
static {
System.out.print("x ");
}
}
Я бы ожидал, что это даст ошибку компиляции, поскольку System.out
с "y" не относится к объявлению метода только a { }
. Почему это действительно? Я не вижу, как этот код будет или должен быть вызван.
При запуске this он также создает x y c g
, почему вызов static { }
вызывается перед конструктором последовательности?
Ответ 1
Это:
static {
System.out.print("x ");
}
представляет собой статический блок инициализации и вызывается при загрузке класса. Вы можете иметь столько из них в своем классе, сколько захотите, и они будут исполняться в порядке их появления (сверху вниз).
Это:
{
System.out.print("y ");
}
- это блок инициализации, а код копируется в начало каждого конструктора класса. Поэтому, если у вас есть много конструкторов вашего класса, и все они должны сделать что-то общее в начале, вам нужно только один раз написать код и поместить его в блок инициализации, подобный этому.
Следовательно, ваш вывод имеет смысл.
Как Stanley, см. ниже, см. раздел в учебнике Oracle, описывающий блоки initializaiton для получения дополнительной информации.
Ответ 2
Это не метод, а блок инициализации.
{
System.out.print("y ");
}
Он будет выполнен перед вызовом конструктора.
Пока
static {
System.out.print("x ");
}
статический блок инициализации, который выполняется, когда класс загружается загрузчиком классов.
Итак, когда вы запускаете свой код
1. Класс загружается загрузчиком классов, поэтому выполняется статический блок инициализации
Выход: x печатается
2. Объект создается так, что выполняется блок инициализации, а затем constuctor вызывается
Выход: y печатается, а затем c
3. Вызывается основной метод, который в свою очередь вызывает метод go
Выход: g напечатан
Конечный результат: x y c g
Это может помочь http://blog.sanaulla.info/2008/06/30/initialization-blocks-in-java/
Ответ 3
Это блок инициализации экземпляра, за которым следует статический блок инициализации.
{
System.out.print("y ");
}
вызывается при создании экземпляра класса.
static {
System.out.print("x ");
}
вызывается, когда класс загружается загрузчиком класса. Поэтому, когда вы делаете
new Sequence().go();
класс загружается, поэтому он выполняет static {}
, затем он выполняет блок инициализации экземпляра {}
, после чего вызывается тело конструктора, а затем метод во вновь созданном экземпляре. Ergo выход x y c g
.
Ответ 4
static {
System.out.print("x ");
}
Является статическим блоком и вызывается во время загрузки класса
{
System.out.print("y ");
}
Является блоком инициализации
У вас может быть несколько блоков инициализации в классе, в этом случае они выполняются в последовательности, в которой они отображаются в классе.
Обратите внимание, что любой блок инициализации, присутствующий в классе, выполняется перед конструктором.
Ответ 5
static {
System.out.print("x ");
}
- это блок инициализации, разделяемый классом (как указано static
), который выполняется первым.
{
System.out.print("y ");
}
- это блок инициализации, разделяемый всеми объектами (конструкторами) класса, который следующий.
Sequence() {
System.out.print("c ");
}
является конкретным конструктором для класса, который выполняется третьим. Блок инициализации экземпляра вызывается сначала каждый раз, когда выполняется конструктор. Вот почему "y" приходит непосредственно перед "c".
void go() {
System.out.print("g ");
}
- это всего лишь метод экземпляра, связанный с объектами, построенными с использованием вышеприведенного конструктора. Это последнее.
Ответ 6
{
System.out.print("y ");
}
Эти типы блоков называются initializer block
. Он выполняется каждый раз, когда вы создаете экземпляр class
.
Во время компиляции этот код перемещается в каждый конструктор вашего класса.
Где как в случае static initializer
: -
static {
System.out.println("x ");
}
выполняется один раз при загрузке класса.
Обычно мы используем блок инициализации static
, когда инициализация поля static
требует нескольких шагов.
Ответ 7
Он используется как блок инициализации и запускается после любого статического объявления . Его можно использовать для обеспечения того, чтобы никто другой не мог создать экземпляр класса (таким же образом вы бы использовали частный конструктор), как и с шаблоном проектирования Singleton.
Ответ 8
static {
System.out.print("x ");
}
Static blocks
выполняются только один раз, когда класс загружается и инициализируется JRE.
И блок non-static
будет вызывать каждый раз, когда вы создаете новый экземпляр, и он будет вызываться непосредственно перед конструктором.
Как здесь вы создали только 1 экземпляр Sequence
, построенный таким образом был вызван после non-static
блоков, а затем метода, который на самом деле является вашей целью.