простой конструктор excersise Java

#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.