基本 Java 继承练习
Basic Java inheritance exercise
我正在学习 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) returns 一个同时具有静态和动态类型的对象 == B;在此对象上调用 m(b) 方法;那为什么不调用B的m()方法class?
我已经看到 B class 中的 m() 方法不是 A class 中 m() 方法的覆盖,因为它们具有不同的显式参数。
提前致谢
b
在 B
的实例中,它扩展了 A
。因此,B
有 2 个 m
方法。
要知道调用了哪个,重要的是调用该方法的对象的类型。
(x.m(b))
是X
接口调用m
方法的结果,因为x
的声明类型是X
.
因此 (x.m(b))
是类型 A
的对象(即使实际实现是 B
)。
这是一个类型 A
,调用 A
class 中的 m
方法。
如果更改方法的名称,A
和 B
中的 m
方法实际上是不同的对象。
你的错误是假设
The x.m(b) returns an object that has both static and dynamic type == B;
这是错误的,因为 x
被声明为 X
类型,使得 x.m
的结果成为 A
.
类型
我正在学习 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) returns 一个同时具有静态和动态类型的对象 == B;在此对象上调用 m(b) 方法;那为什么不调用B的m()方法class?
我已经看到 B class 中的 m() 方法不是 A class 中 m() 方法的覆盖,因为它们具有不同的显式参数。
提前致谢
b
在 B
的实例中,它扩展了 A
。因此,B
有 2 个 m
方法。
要知道调用了哪个,重要的是调用该方法的对象的类型。
(x.m(b))
是X
接口调用m
方法的结果,因为x
的声明类型是X
.
因此 (x.m(b))
是类型 A
的对象(即使实际实现是 B
)。
这是一个类型 A
,调用 A
class 中的 m
方法。
如果更改方法的名称,A
和 B
中的 m
方法实际上是不同的对象。
你的错误是假设
The x.m(b) returns an object that has both static and dynamic type == B;
这是错误的,因为 x
被声明为 X
类型,使得 x.m
的结果成为 A
.