gpt4 book ai didi

java - 为什么第 3 行没有发生动态绑定(bind)?

转载 作者:行者123 更新时间:2023-12-01 07:43:53 25 4
gpt4 key购买 nike

class A {
public void fun(double d) {
System.out.println("A");
}
}

class B {
public void fun(int i) {
System.out.println("B");
}
}

class C extends A {
public void fun(int i) {
System.out.println("C");
}
}

class D extends B {
public void fun(double d) {
System.out.println("D");
}
}

class E extends B {
public void fun(double d) {
System.out.println("E");
}
public void fun(int i) {
System.out.println("F");
}
}

public class Test {

public static void main(String[] args) {
C c = new C(); c.fun(6); //line 1
D d = new D(); d.fun(6); //line 2
A x = new C(); x.fun(6); //line 3
B y = new D(); y.fun(6); //line 4
B z = new E(); z.fun(6); //line 5
}

}

此代码的输出是:C乙A乙

不知道为什么第 3 行的输出不是“C”而是“A”。由于正在发生动态绑定(bind),不应该调用类中的方法吗?

对于第 5 行中的代码,发生动态绑定(bind)并且输出是“F”而不是“B”,但第 3 行不会发生同样的情况。

最佳答案

动态绑定(bind)适用于具有相同签名的方法。

当您调用编译时类型为 A 的变量 x 的方法时,仅在类 A(或其父类)中定义的方法-classes)可以被编译器考虑(方法重载决策发生在编译时)。这意味着仅考虑 public void fun(double d)

由于 Cpublic void fun(int i) 具有不同的签名,因此它不会覆盖 A 的方法,因此,即使变量 x 的运行时类型是 C,它也无法执行。

第 5 行的行为有所不同。这里 z 的编译时类型是 B,类 B 有一个 public void fun(int i)方法。由于z的运行时类型是E,并且E还有一个签名为public void fun(int i)<的方法E的方法覆盖了B的方法,因此E的方法被执行。

关于java - 为什么第 3 行没有发生动态绑定(bind)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59045816/

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