Класс A
вызывает открытый метод f()
в конструкторе. Класс B отменяет метод f()
с его собственной реализацией.Полиморфный метод в конструкторе (Java)
Предположим, вы intantiate объект B
.. метод f()
из объекта B
будет называться в Застройщиком объекта A
, хотя объект B
не полностью инициализирован.
Может ли кто-нибудь объяснить это поведение?
EDIT: Да, это не рекомендуется практика .. пока я не понимаю, почему Java не вызывая f()
реализацию базового класса A
вместо «охвата» в f()
реализации от производного класса B
.
Код:
class A {
A() {
System.out.println("A: constructor");
f();
}
public void f() {
System.out.println("A: f()");
}
}
class B extends A {
int x = 10;
B() {
System.out.println("B: constructor");
}
@Override
public void f() {
System.out.println("B: f()");
this.x++;
System.out.println("B: x = " + x);
}
}
public class PolyMethodConst {
public static void main(String[] args) {
new B();
}
}
Выход:
A: constructor
B: f()
B: x = 1
B: constructor
Что вы хотите объяснить? Вы выполнили 'B.f' перед [основной] конструктором' B' (C++ запускал 'A.f', несмотря на то, что он был переопределен). –
Сравнение с C++ довольно интересно. На «безопасном» управляемом языке было принято решение сделать эту операцию небезопасной (ну, программа не будет разбиваться, хотя NPE возможен, но результат непредсказуем и непредсказуем, так как зависит от производного класса). – vehsakul