Я выполняю приведенный ниже код и не получаю порядок инициализации, основанный на полученном выводе.
import java.util.Random;
class SuperClass{
private int abc = this.getAnInt();
{
System.out.println("\nSuperClass: Inside block initializer");
System.out.println("\tSuperClass: block Abc value: "+this.abc);
abc = this.getAnInt();
System.out.println("\tSuperClass: block Abc value: "+this.abc);
}
public SuperClass(){
System.out.println("\nSuperClass: Inside Constructor");
this.abc = 414;
System.out.println("\tSuperClass: constructor Abc value: "+this.abc);
}
int getAnInt() {
System.out.println("\nSuperClass: Inside getAnInt");
System.out.println("\tSuperClass: getAnInt Abc value: "+this.abc);
int randomInt = new Random().nextInt(21);
System.out.println("SuperClass: getAnInt Random Int is : "+randomInt);
return randomInt;
}
}
class SubClass extends SuperClass{
private int def = this.getAnInt();
{
System.out.println("\nSubClass: Inside block initializer");
System.out.println("\tSubClass: block def value: "+this.def);
def = this.getAnInt();
System.out.println("\tSubClass: block def value: "+this.def);
}
public SubClass(){
System.out.println("\nSubClass: Inside Constructor");
this.def = 424;
System.out.println("\tSubClass: constructor def value: "+this.def);
}
@Override
int getAnInt() {
System.out.println("\nSubClass: Inside getAnInt");
System.out.println("\tSubClass: getAnInt def value: "+this.def);
int randomInt = new Random().nextInt(21);
System.out.println("SubClass: getAnInt Random Int is : "+randomInt);
return randomInt;
}
}
public class ChainingConstructor {
public static void main(String[] args) {
SubClass subclass = new SubClass();
System.out.println(subclass);
}
}
вывод -----
SubClass: Inside getAnInt
SubClass: getAnInt def value: 0
SubClass: getAnInt Random Int is : 10
SuperClass: Inside block initializer
SuperClass: block Abc value: 10
SubClass: Inside getAnInt
SubClass: getAnInt def value: 0
SubClass: getAnInt Random Int is : 15
SuperClass: block Abc value: 15
SuperClass: Inside Constructor
SuperClass: constructor Abc value: 414
SubClass: Inside getAnInt
SubClass: getAnInt def value: 0
SubClass: getAnInt Random Int is : 6
SubClass: Inside block initializer
SubClass: block def value: 6
SubClass: Inside getAnInt
SubClass: getAnInt def value: 6
SubClass: getAnInt Random Int is : 18
SubClass: block def value: 18
SubClass: Inside Constructor
SubClass: constructor def value: 424
thinkingInJava.SubClass@368239c8
Когда я изменяю доступ getAnInt () в SuperClass на private (также удаляя аннотацию @Override), он, кажется, работает как я ожидаю.
- статические переменные и статические инициализаторы в порядке
- переменные экземпляра и инициализаторы экземпляра в порядке
- конструкторы
т.е. я получаю следующий вывод с частным getAnInt () в SuperClass
SuperClass: Inside getAnInt
SuperClass: getAnInt Abc value: 0
SuperClass: getAnInt Random Int is : 1
SuperClass: Inside block initializer
SuperClass: block Abc value: 1
SuperClass: Inside getAnInt
SuperClass: getAnInt Abc value: 1
SuperClass: getAnInt Random Int is : 14
SuperClass: block Abc value: 14
SuperClass: Inside Constructor
SuperClass: constructor Abc value: 414
SubClass: Inside getAnInt
SubClass: getAnInt def value: 0
SubClass: getAnInt Random Int is : 14
SubClass: Inside block initializer
SubClass: block def value: 14
SubClass: Inside getAnInt
SubClass: getAnInt def value: 14
SubClass: getAnInt Random Int is : 8
SubClass: block def value: 8
SubClass: Inside Constructor
SubClass: constructor def value: 424
thinkingInJava.SubClass@368239c8
Мой вопрос заключается в том, что заставляет мое первое выполнение вызывать метод SubClass getAnInt () вместо вызова SuperClass getAnInt ()?