我正在学习Java,我正在做这个练习,我不得不说主要方法打印的是什么。它的目标是更好地理解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()
我的main方法的第三行打印“C.m()A.m()”但我不明白它为什么打印A.m()。 x.m(b)返回一个具有静态和动态类型== B的对象;在这个对象上调用m(b)方法;那么为什么它不被称为B类的m()方法?
我已经看到B类中的m()方法不是A类中m()方法的重写,因为它们有不同的显式参数。
提前致谢
答案 0 :(得分:5)
b
的{{1}}实例中的 B
,其范围为A
。因此,B
有两种m
方法。
要知道调用哪个,重要的是调用该方法的对象的类型。
(x.m(b))
是m
界面调用X
方法的结果,因为x
的声明类型为X
。
因此(x.m(b))
是A
类型的对象(即使实际实现是B
)。
这是A
类型,调用m
类的A
方法。
如果更改方法的名称,m
和A
中的B
方法实际上是不同的对象会更清楚。
你的错误是假设
x.m(b)返回一个同时具有静态和动态类型== B;
的对象
哪个错误,因为x
被声明为X
类型,因此x.m
的结果为A
类型。