java将派生对象引用分配给基类的变量将不起作用
这里有一个例子
Class A {
Method A();
Method B();
Method C();
}
// A and B are not interfaces
Class B extends A {
Method C(int);
}
Class Harness {
A ob = new B ();
ob.C(3);
}
IDE抱怨说ob.C(3)
不能被设置为A
中的方法C
,因为C
不需要任何参数。但据我所知,我正在B
中调用方法C
据我所知,变量类型决定了要调用的方法集,方法集的引用被分配给了对象,但实际对象决定了要调用的确切方法。那么为什么它不起作用呢
# 1 楼答案
您已将
B
类型的对象分配给A
类型的变量。类A
上没有方法C
,编译器正在抱怨,因为它必须链接到基于变量的声明的类型的方法,即A
。除非类型A
具有方法C
的某种声明,否则编译器无法知道对A
类型的引用调用该方法是安全的# 2 楼答案
正如您在问题中提到的,变量的类型决定了可以使用它调用的所有方法。在您的示例中,
class A
没有签名为C(int)
的方法。它只有一个签名为C()
的方法。因此,B中的方法C(int)
甚至不是被重写的方法。这是一个重载方法运行时多态性仅适用于重写的方法
您必须使用
class A
方法C(int)
才能成功编译此代码# 3 楼答案
您已声明
new B
为A
的实例,并且a没有方法C
使其工作,您必须再次至少强制转换ob
it B。因此,假设这是一个伪代码,这将工作: