gpt4 book ai didi

java - 理解Java继承

转载 作者:行者123 更新时间:2023-12-03 06:32:04 25 4
gpt4 key购买 nike

给出以下 Java 代码:

class mainul {

public static void main(String[] args) {

/*block 1*/
B b1 = new B();
A a1 = b1;
a1.m1(b1);

/*block 2*/
B b2 = new B();
B a2 = b2;
b2.m1(a2);
}
}

class A {

public static void p(Object o) {
System.out.println(o.toString());
}

public void m1(A a) {
p("m1(A) in A");

}
}

class B extends A {

public void m1(B b) {
p("m1(B) in B");
}
}

有人可以解释一下为什么这个程序的输出是

m1(A) in A
m1(B) in B

由于 a1 的动态类型是 B,人们会期望 block 1 的输出为“B 中的 m1(B)”。我注意到 A 和 B 中 m1 的函数签名不匹配(一个期望类型 A 的对象和 B 类型的另一个作为其参数)并且 A 中的方法似乎获得优先级,但无法真正将其链接到我的输出,因为它似乎与 block2 的输出不一致。

感谢您的宝贵时间

最佳答案

正如您所注意到的,B.m1(B) 不会覆盖 A.m1(A),因为它们采用不同的参数(尝试添加 @覆盖注释,你会看到编译器提示)。因此永远不能通过对 A 的引用来调用它。

但是,可以通过对 B 的引用来调用它。

关于java - 理解Java继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10096521/

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