Подтвердить что ты не робот

Вызов метода Java без имени

Я смотрю на код ниже и нашел что-то странное:

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 { } вызывается перед конструктором последовательности?

4b9b3361

Ответ 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 блоков, а затем метода, который на самом деле является вашей целью.