繁体   English   中英

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

[英]Static binding and dynamic binding in 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.doSmthp2.doSmth其绑定呢? 我错过了什么吗?

对不起,但这确实让我头疼。

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

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

在编译时,p1和p2都是Parent的类型,并且Parent具有doSmth(Object)方法,因此两条线都绑定到同一方法。

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

在运行时,动态绑定成为现实。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM