gpt4 book ai didi

java - Java中的静态绑定(bind)和动态绑定(bind)

转载 作者:行者123 更新时间:2023-12-02 11:47:44 24 4
gpt4 key购买 nike

首先我是一个初学者
我看了很多教程,读了很多例子,甚至试图从 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) 仅对编译器可见。

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

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

问题是,我说的是真的吗?或者我有什么误解?如果是假的,那么请告诉我编译器在这种情况下会采取什么步骤?
如果这是真的,编译器怎么会期望 p1.doSmth 具有重写方法(虽然它不知道它是真实类型),而在 p2.doSmth 中> 它只是绑定(bind)了它?我错过了什么吗??

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

最佳答案

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

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

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

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

在运行时,动态绑定(bind)开始出现。

p1 是 Child1 的实例,Child1 已重写 doSmth(Object),因此使用 Child1 的实现。

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

关于java - Java中的静态绑定(bind)和动态绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48086678/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com