Java конструктор без имени? - PullRequest
       6

Java конструктор без имени?

1 голос
/ 19 апреля 2011

Когда я запускаю приведенный ниже код, я получаю вывод в виде:

static block
TEst block
main block

Как печатается строка "TEst block"? Это считается конструктором?

public class TestBlk {

static {
    System.out.println("static block");
}

{
    System.out.println("TEst block");
}


public static void main(String args[]){
    TestBlk blk=new TestBlk();
    System.out.println("main block");

}
}

Ответы [ 4 ]

12 голосов
/ 19 апреля 2011

Это инициализатор экземпляра вместе с конструктором по умолчанию.

Классу без явного конструктора предоставляется синтетический общедоступный конструктор без аргументов.

Конструкторам без вызова this() или super() (возможно, с аргументами) дается неявный вызов super() (без аргументов, возможно, что-то странное происходит с внутренними классами).

Сразу после неявногоили явный вызов super(), весь код в инициализаторах полей и инициализаторах экземпляров вставляется в том порядке, в котором он указан в исходном коде.

Так что после того, как javac завершил работу с вашим кодом, он будет выглядеть примерно так:

public class TestBlk {

    static {
        System.out.println("static block");
    }

    public TestBlk() {
        // Call constructor of java.lang.Object.
        super();

        // From instance (and field)initialiser.
        System.out.println("TEst block");

        // Rest of constructor:
    }


    public static void main(String args[]){
        TestBlk blk = new TestBlk();
        System.out.println("main block");
    }
}
2 голосов
/ 19 апреля 2011

То, что у вас здесь есть, называется: блок инициализации.

Блок инициализации - это блок кода между фигурными скобками, который выполняется перед созданием объекта класса.

Существует два типа блоков инициализации:

  1. Нестатический блок инициализации.

    { System.out.println("TEst block"); }

  2. Статический блок инициализации.

    static { System.out.println("static block"); }

Более конкретно, мне нравится объяснение от здесь :

Обратите внимание, что любой блок инициализации, присутствующий в классе , выполняется перед конструктором .

Так что теперь возникает вопрос, почемунам нужны конструкторы , если у нас есть блоки инициализации .Ответ в том, что нам не нужен конструктор по умолчанию, но блок инициализации не может быть параметризован , и поэтому у вас не может быть объектов, принимающих значения извне, и поэтому блок инициализации не заменяет конструктор.*

0 голосов
/ 19 апреля 2011
{
    System.out.println("TEst block");
}

Это блок инициализации. Смотрите мой ответ на этот другой вопрос .

0 голосов
/ 19 апреля 2011

Он вызывается как часть конструкции объекта при вызове new TestBlk().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...