是否动态绑定未被覆盖的公共实例方法?

时间:2018-01-05 16:45:30

标签: java dynamic binding static method-overriding

我对方法绑定有疑问。如您所知,私有,静态和最终方法的绑定发生在编译时,而重写方法的绑定在运行时发生。

在下文中,我们在something()中有一个方法Parent,该方法未在相应的子类Child中重写。

class Parent {
    void something() {
    }
}

class Child extends Parent {
}

public class Main {
    public static void main(String[] args) {
        Parent p = new Child();
        p.something(); // still dynamically bound?
    }
}

我们的主程序中p.something()的调用(虽然没有被覆盖)仍然是动态绑定的吗?

1 个答案:

答案 0 :(得分:1)

首先,在编译时确定方法签名。但是,方法绑定始终在运行时完成。运行时调度的确切规则在JLS §15.12.2.5

中定义

因此,正如您现在可能正在猜测的那样,p.something();的召唤仍然受到限制。

作为旁注,请查看this以清楚地了解多态性。