Java 中的静态绑定和动态绑定



起初我是初学者
,我看过很多教程,阅读了很多示例,甚至试图从 JLS 中理解这个主题,但我仍然有一些困惑或误解。

让我告诉你我无法理解的问题。

假设我们有三个类ParentChild1Child2如下:

class Parent {
void doSmth(Object o) {
System.out.println("Parent.doSmth");
}
}
class Child1 extends Parent {
void doSmth(Object o) {
System.out.println("Child1.doSmth");
}
}
class Child2 extends Parent {
void doSmth(String s) {
System.out.println("Child2.doSmth");
}
}
class Test {
public static void main(String[] args) {
Parent p1 = new Child1();
Parent p2 = new Child2();
p1.doSmth("String");
p2.doSmth("String");
}
}

我的理解是,因为p1p2的引用来自Parent类型,那么doSmth(Object)对编译器是唯一可见的。

对于p1.doSmth("String");编译器没有绑定它,因为有一个覆盖方法,所以它只是把它留给 JVM 在运行时绑定它(动态绑定)。

而对于p2.doSmth("String");编译器绑定它,因为它没有找到它的覆盖方法(静态绑定)。

问题是,我说的是真的吗? 还是我有误解? 如果它是假的,那么请告诉我编译器在这种情况下会采取什么步骤?
如果这是真的,编译器怎么能期望p1.doSmth它有一个覆盖方法(虽然它不知道它是真正的类型),而p2.doSmth它只是绑定它?? 我错过了什么吗??

对不起,这真的让我头疼..

试图总结讨论。根据需要进行编辑。

Java 中的静态绑定发生在编译时,而动态绑定发生在运行时。

在编译时,p1 和 p2 都是父级的类型,父级具有 doSmth(对象) 方法,因此两行绑定到同一方法。

p1.doSmth("String");
p2.doSmth("String");

在运行时,动态绑定会出现。

p1 是 Child1 的实例,Child1 覆盖了 doSmth(Object),因此使用了 Child1 的实现。

p2 是 Child2 的实例,Child2 不会覆盖 doSmth(Object),因此调用从 Parent 继承方法的实现。

相关内容

  • 没有找到相关文章

最新更新