gpt4 book ai didi

Java多态函数调用

转载 作者:行者123 更新时间:2023-11-30 08:07:20 24 4
gpt4 key购买 nike

无法理解为什么两个函数调用的输出是“3”和“4”。对于,

g2.foo( t1 );

在编译时,g2 是类型 A,它寻找 foo(类型 C),它在它的主类中找不到,所以它查看它的子类 B,然后是 C。所以 foo(... ) 应该绑定(bind)到

public void foo(C p) {
System.out.println("5");
}

子类C对吗?

然后在运行时 g2 将是类型 C 并调用 foo(C p) ,这将导致输出“5”。我不确定我对多态性的逻辑/理解哪里错了。

class A {
public void foo(A p) {
System.out.println("1");
}
}

class B extends A {
public void foo(B p) {
System.out.println("2");
}
}

class C extends B {
public void foo(A p) {
System.out.println("3");
}

public void foo(B p) {
System.out.println("4");
}

public void foo(C p) {
System.out.println("5");
}
}

public class HelloWorld {
public static void main(String[] args) {
A g2 = new C();
B r2 = new C();
C t1 = new C();

g2.foo(t1); // 3

r2.foo(new C()); // 4
}
}

最佳答案

要记住的主要事情是,重载方法是在编译时根据调用该方法的实例的编译时类型选择的。运行时类型仅确定所选方法是否被运行时类型的实现覆盖。

g2.foo( t1 )

g2 有一个编译类型A,这意味着在编译时只能选择public void foo(A p)。在运行时 g2C 的一个实例,这意味着 Cpublic void foo(A p) 是调用,打印 3。

r2.foo( new C() )

r2 的编译类型为 B,因此 public void foo(A p)public void foo(B p ) 可以在编译时选择。 public void foo(B p) 是最好的重载匹配(因为 BA 更具体)。在运行时,r2C的一个实例,所以Cpublic void foo(B p)是调用,并打印 4。

关于Java多态函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33773523/

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