#java #inheritance #constructor #super
#java #наследование #конструктор #супер
Вопрос:
Мне трудно понять, почему конструктор класса A выводит 41, конструктор класса B выводит 40 в данном случае ниже
class AK {
AK(int i) {
System.out.println("Cstr of A " i);
}
AK(){
System.out.println("Cstr of A()");
}
}
class BK extends AK {
BK(int i) {
super(i 1);
System.out.println("Cstr of B " i);
}
BK(){
System.out.println("Cstr of B()");
}
}
class CK extends BK {
CK(int i) {
super(2 * i);
System.out.println("Cstr of C " i);
}
}
class Main {
public static void main (String args[]) {
new CK(20);
}
}
вывод:
Cstr из 41
Cstr из B 40
Cstr из C 20
Ответ №1:
В main()
вы создаете объект CK с целым числом 20 в качестве параметра. Конструктор CK вызывает свой суперконструктор BK с параметром 2 * (= 40). Конструктор BK также вызывает свой суперконструктор с параметром 1 ( = 41).
И каждый конструктор печатает свое значение целочисленного параметра. Конструктор печатает свой результат первым, потому что это первый конструктор, который завершается, поскольку другие конструкторы вызывают его.
вызов конструктора CK с параметром 20 => i = 20
вызов конструктора BK с i * 2 => i = 40
вызов конструктора AK с i 1 => i = 41
Также i никогда не переназначается, поэтому его значение остается в другом конструкторе таким, какое оно есть.
Ответ №2:
В main()
методе, когда вы создаете объект CK, jre вызывает цепочку конструкторов, которая вызовет main() -> CK(20) -> BK(40)-> AK(41).
Когда вы вызываете конструктор CK(20), он вызывает конструктор super(2 i)=BK(int i)=BK(40) со значением 2 i=2 *20. Когда конструктор BK(int i) вызывается со значением 40, он вызывает super(i 1)=AK(int i)=AK(41) со значением i 1=40 1.
Поскольку вы печатаете значение i в BK(), а не i 1, оно выводит 40 вместо 41.