gpt4 book ai didi

java - 具有父类(super class)引用变量的 Java 子类对象中的方法重载/覆盖

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

 class A{
void m1(A a) {System.out.print("A");}
}
class B extends A{
void m1(B b) {System.out.print("B");}
}
class C extends B{
void m1(C c) {System.out.print("C");}
}

public class d {

public static void main(String[] args) {

A c1 = new C(); C c2 = new C();c1.m1(c2);

}}

此代码的输出是'A'

但是如果我将 A 类修改为:

 class A{
void m1(C a) {System.out.print("A");}
}

那么输出是'C'。有人可以解释一下这段代码是如何工作的吗?

最佳答案

(通过对参数类型和实现使用相同的继承层次结构,您已经使这变得比实际需要的更加困惑。将它们分开可能有助于在您的脑海中简化它。)

c1 的类型是 A。因此,在确定要调用哪个方法签名时,编译器只能查看A中声明的方法。

因此,在第一种情况下,编译器将调用 m1(A);在第二种情况下,编译器将调用 m1(C)

现在,在第一种情况下,m1(A) 方法永远不会被重写,因此实际上 c1 的执行时类型是无关紧要的。

在第二种情况下,m1(C)C 覆盖,因此调用 C 中的实现,因为执行时间c1 的类型是 C

所以请记住:

  • 重载解析(调用哪个方法签名)是在编译时根据方法目标和参数表达式的编译时类型确定的
  • 该方法签名的实现(覆盖)基于执行时目标对象的实际类型。

关于java - 具有父类(super class)引用变量的 Java 子类对象中的方法重载/覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12587539/

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