Вы должны знать, что new
оператор отвечает за создание пустого экземпляра класса (например, с полями, которые будут иметь значения по умолчанию: числовой: 0
; булевы: false
, символ: '\0'
ссылка: null
). Код конструктора вызывается после того, как new
завершит свою работу и отвечает за правильное состояние для такого пустого объекта.
инициализации Теперь полей происходит в конструкторе, поэтому ваш код
class A {
int xyz = new B().show(); // prints c=0 and z=null
int c = -319;
B z = new B();
int lmn = z.show(); // prints c=-319
class B {
int show() {
System.out.println("c=" + c);
System.out.println("z=" + z);
return -555;
}
}
}
является такой же, как (значения по умолчанию уведомления)
class A {
int xyz = 0; //default values
int c = 0; //
B z = null; //
int lmn = 0; //
A(){
xyz = new B().show();
c = -319;
z = new B();
lmn = z.show();
}
class B {
int show() {
System.out.println("c=" + c);
System.out.println("z=" + z);
return -555;
}
}
}
Также
xyz = new B().show();
такой же, как
xyz = this.new B().show();
Созданный экземпляр B
будет иметь доступ к экземпляру A
, который инициализируется в текущем конструкторе A
. НО код, который инициализируется b
и z
int c = -319;
B z = new B();
происходят после первого show()
метода (который использует b
и z
), что означает, что их значение по умолчанию будет показано.
Эта проблема не существует в случае второго show()
lmn = z.show();
, потому что теперь b
и z
инициализируются.
Инициализация происходит в порядке, сверху вниз. Если вы избавитесь от класса 'A' и вставьте логику в метод' a() ', должно быть очевидно, что происходит. –
не должен это утверждение int xyz = new B(). Show() выдает ошибку «Незаконное обращение вперед», поскольку show() использует c, который еще не был выделен памятью? – paidedly
Почему? Это еще один класс. Если бы вы могли ссылаться только на классы, объявленные по порядку, Java был бы очень странным языком ... –