public class A{
{
System.out.println("hi i am IIB");
}
public A(){
System.out.println("hi i am constructor");
}
public static void main(String... args){
A objA=new A();
}
}
ответ
IIb получит запускаемую перед конструктор вызывается
Нет, это не то, что происходит. Код, записанный в блоки инициализатора экземпляра, является частью конструктора только во время выполнения. Во время компиляции компилятор перемещает код инициализатора экземпляра блоков всем конструкторам вашего класса. Таким образом, во время выполнения, конструктор эффективно эквивалентно:
public A() {
super();
System.out.println("hi i am IIB");
System.out.println("hi i am constructor");
}
Таким образом, оператор в блоке инициализации экземпляра перемещается в конструкторе перед оператором уже есть.
Вот что конструктор выглядит на самом деле (Вывод javap
команды):
public A();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
7: ldc #3 // String hi i am IIB
9: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
12: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
15: ldc #5 // String hi i am constructor
17: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
20: return
спасибо rohit –
никто не будет явно ссылаться на IIB, а МИБ будет скопирована в конструкторе (сразу после в неявной super()
ваш дело). Рассмотрите возможность добавления второй конструктор следующим образом,
public A(int arg){
super();
// Here is where the IIB will be copied.
System.out.println("hi i am constructor 2");
}
public static void main(String... args) {
A obj = new A();
A objA = new A(2); // call the second constructor.
}
, которые будут выводить -
hi i am IIB
hi i am constructor
hi i am IIB
hi i am constructor 2
Java Language Specification определяет, что выполняется, когда вызывается конструктор:
Назначают аргументы для конструктор для вновь созданных переменных параметра для этого вызова конструктора.
Если этот конструктор начинается с явного вызова конструктора (§8.8.7.1) другого конструктора в том же классе (с использованием этого), затем оценивайте аргументы и обрабатывайте вызов конструктора рекурсивно, используя эти пять шагов. Если вызов конструктора завершается внезапно, то эта процедура завершается внезапно по той же причине; в противном случае перейдите к шагу 5.
Этот конструктор не начинается с явного вызова конструктора другого конструктора в том же классе (с использованием этого). Если этот конструктор относится к классу, отличному от Object, то этот конструктор начнет с явного или неявного вызова конструктора суперкласса (используя super). Оцените аргументы и обработайте вызов конструктора суперкласса рекурсивно, используя эти пять шагов. Если вызов конструктора завершается внезапно, то эта процедура завершается внезапно по той же причине. В противном случае перейдите к шагу 4.
Выполните инициализаторы экземпляра и инициализаторы переменных экземпляра для этого класса, назначив значения инициализаторов переменных экземпляра соответствующим переменным экземпляра в порядке слева направо, в котором они отображаются по тексту в исходном коде для класса. Если выполнение любого из этих инициализаторов приводит к исключению, то никакие новые инициализаторы не обрабатываются, и эта процедура завершается внезапно с тем же исключением. В противном случае перейдите к шагу 5.
Выполнение остальной части тела этого конструктора. Если это выполнение завершается внезапно, то эта процедура завершается внезапно по той же причине.В противном случае эта процедура завершится нормально.
В чем Ваш вопрос? –
Когда я создаю объект, iib будет выполняться до вызова конструктора, поэтому кто будет вызывать iib –
plz, добавьте свой комментарий к своему вопросу, например, «когда я создаю объект, iib получит выполнение до вызова конструктора, поэтому кто будет ссылаться на iib ", так это будет более ясно. хороший пример кода btw – bresleveloper