gpt4 book ai didi

Java多态练习

转载 作者:行者123 更新时间:2023-12-01 17:49:47 25 4
gpt4 key购买 nike

有人可以解释一下编译器/运行时如何运行示例中的适当方法?有 6 个类和一个具有不同参数的方法 void m(/* ... */)。我知道编译器会分析声明的类型。输出始终是来自中间类的“M”。

public class All {}
public class Most extends All {}
public class Special extends Most {}

public class Top {
public void m( All p ) { System.out.println("A"); }
}
public class Middle extends Top {
public void m( All p ) { System.out.println("M"); }
public void m( Special p ) { System.out.println("L"); }
}
public class Bottom extends Middle {
public void m( Most p ) { System.out.println("V"); }
public void m( Special p ) { System.out.println("X"); }
}

public class Main {

public static void main(String[] args) {
All all = new All();
Most most = new Most();
Special special = new Special();

Top x = new Middle();
Top y = new Bottom();
Middle z = new Bottom();

x.m( most ); // Output is M
x.m( special ); // Output is M
y.m( all ); // Output is M
y.m( special ); // Output is M
z.m( all ); // Output is M
z.m( most ); // Output is M
}
}

最佳答案

方法重写是在运行时通过查看对象的运行时类型来解决的。编译器也会决定调用哪个方法,但它只能根据表达式的编译时类型来决定。

对于 x 的两次调用,它们都在编译时解析为 Top.m(All)x 是编译时类型 Top,因此编译器只能查找 Top 及其父类(super class)中声明的方法。编译器发现唯一可用的方法是m(All)。在运行时,要调用的方法将解析为 Middle.m(All)。这是因为 x 的运行时类型实际上是 Middle,因此运行时会调用 Middle< 中重写的 m(All)/。为什么它没有调用Middle.m(Special)?编译器已经决定应该调用Top.m(All)。运行时只会检查运行时类型是否已覆盖它。编译器不知道有 Middle.m(Special),因为 x 是编译时类型 Top

y 的两次调用类似。 y 的编译时类型仍然是 Top,因此编译器将该方法解析为 Top.m(All)y 是运行时类型 Bottom。由于 Bottom 继承自 Middle,因此它也会覆盖 Top.m(All)。实现与Middle中的相同。因此,被重写的方法会在运行时被调用。

z 的两次调用有点不同,但最终仍然解析为 Middle.m(All)z 的编译时类型为 Middle,因此两个调用都解析为 Middle.m(All)。请注意,没有 Middle.m(Most),因此调用 z.m(most) 仍将解析为 Middle.m(All) 。在运行时,该方法仍解析为 Middle.m(All),因为运行时类型 Bottom 不会覆盖 Middle.m(All) .

关于Java多态练习,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51643868/

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