gpt4 book ai didi

java - 基本 Java 继承练习

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

我正在学习 Java,我正在做这个练习,我必须说一下 main 方法打印的内容。其目标是更好地理解 Java 继承。

interface X extends Remote{
A m(B bb) throws RemoteException;
}

class A implements Serializable{
int a;
A m(A aa){
aa.a = 3;
System.out.println("A.m");
return aa;
}
}

class B extends A{
int b;
A m(B bb){
bb.b = 7;
System.out.println("B.m");
return bb;
}
}

class C extends A implements X{
public B m(B bb){
if(bb.b == 7) bb.b = 9; else bb.b = 1;
System.out.println("C.m");
return bb;
}
}

现在我有一个可以调用的主要方法:

X x = new C();
B b = new B();
(x.m(b)).m(b); // prints C.m() A.m()

我的主要方法的第三行打印“C.m() A.m()”,但我不明白为什么它打印 A.m()。 x.m(b) 返回一个具有静态和动态类型 == B 的对象;在此对象上调用 m(b) 方法;那么为什么不调用B类的m()方法呢?

我发现 B 类中的 m() 方法并没有覆盖 A 类中的 m() 方法,因为它们具有不同的显式参数。

提前致谢

最佳答案

b 位于 B 的实例中,它扩展了 A。因此,B 有 2 m 个方法。

要知道调用的是哪个方法,重要的是调用该方法的对象的类型。

(x.m(b))

是从X接口(interface)调用m方法的结果,因为x的声明类型是X .

因此 (x.m(b))A 类型的对象(即使实际实现是 B)。

这是一个类型 A,调用 A 类中的 m 方法。

如果更改方法的名称,就会更清楚地看出 AB 中的 m 方法确实是不同的对象。

你的错误是假设

The x.m(b) returns an object that has both static and dynamic type == B;

这是错误的,因为 x 声明为 X 类型,使得 x.m 的结果为 A 类型>.

关于java - 基本 Java 继承练习,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28369005/

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