假设我有这个简单的类似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 }}。因此,结果必须为1)type B 2)type B 3) type D
。在动态分派中,这些对象的类型取决于运行时,并且由于42 42 17
是在运行时执行的(?),因此3个对象的类型为{{1 }},结果为new B(),new(D),new(D)
。
这是正确的吗?如果不是,这两种调度的正确结果是什么?如何确定?