public class Solution {
public static void main(String[] args) {
new B(6);
}
public static class A {
private int f1 = 7;
public A(int f1) {
this.f1 = f1;
System.out.println("Вызывается конструктор А");
initialize();
}
protected void initialize() {
System.out.println(f1);
System.out.println("Вызывается initialize для А");
}
}
public static class B extends A {
protected int f1 = 3;
public B(int f1) {
super(f1);
System.out.println("Далее конструктор Б");
this.f1 += f1;
initialize();
}
protected void initialize() {
System.out.println(f1);
System.out.println("вызывается initialize для Б");
}
}
}
результат:
Вызывается конструктор А
0
вызывается initialize для Б
Далее конструктор Б
9
вызывается initialize для Б
если изменить модификатор доступ для initialize из А:
public class Solution {
public static void main(String[] args) {
new B(6);
}
public static class A {
private int f1 = 7;
public A(int f1) {
this.f1 = f1;
System.out.println("Вызывается конструктор А");
initialize();
}
private void initialize() {
System.out.println(f1);
System.out.println("Вызывается initialize для А");
}
}
public static class B extends A {
protected int f1 = 3;
public B(int f1) {
super(f1);
System.out.println("Далее конструктор Б");
this.f1 += f1;
initialize();
}
protected void initialize() {
System.out.println(f1);
System.out.println("вызывается initialize для Б");
}
}
}
результат:
Вызывается конструктор А
6
Вызывается initialize для А
Далее конструктор Б
9
вызывается initialize для Б
думал, что в первом случае так, потому что выбор реализации метода зависит от типа вызывающего объекта. т.е. вызывает потомок- метод потомка, однако во втором случае был вызван метод из super-класса