Допустим, у меня есть эта простая java-подобная программа:
class B {
int x;
B() {
x = 42;
}
void f() {
print(x);
}
};
class D extends B {
int x;
D() {
x = 17;
}
void f() {
print(x);
}
}
void main() {
B b = new B();
b.f();
B c = new D();
c.f();
D d = new D();
d.f();
}
То, что я хотел бы сделать, это увидеть результаты, когда я использую динамическую и статическую диспетчеризацию. Мое понимание таково:При статической диспетчеризации тип этих 3 объектов определяется во время компиляции, и поэтому они равны 1)type B 2)type B 3) type D
. Поэтому результат должен быть 42 42 17
. При динамической диспетчеризации тип этих объектов определяется во время выполнения, и поскольку new B(),new(D),new(D)
выполняются во время выполнения (?), 3 объекта имеют тип 1)type B 2)type D 3)type D
, а результат равен 42 17 17
.
Это правильно? Если нет, каковы правильные результаты для этих двух типов диспетчеризации и как они определяются