将派生对象引用分配给基类的变量将不起作用

时间:2016-03-28 08:07:40

标签: 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)无法对C中的A方法进行C,因为C不需要参数。但据我所知,我在B中调用方法['enablePushState'=>flase, 'enableReplaceState=>true]

据我所知,变量类型确定要使用其分配引用的对象调用的方法集,但实际对象确定将被调用的确切方法。那么为什么它不起作用?

3 个答案:

答案 0 :(得分:3)

您已将B类型的对象分配给A类型的变量。类A上没有方法C,编译器抱怨,因为它必须链接到基于变量的声明的类型的方法 - 即A。除非类型A具有方法C的某种声明,否则编译器无法知道在对{{{{}的引用上调用该方法是安全的。 1}}类型。

答案 1 :(得分:2)

正如您在问题本身中提到的那样,变量的类型决定了可以使用它调用的所有方法。在您的示例中,class A没有带签名C(int)的方法。它只有一个签名为C()的方法。因此,B中的方法C(int)甚至不是一个被重写的方法。这是一种重载方法。

运行时多态性仅适用于重写方法。

您必须让class A拥有C(int)方法才能成功编译此代码。

答案 2 :(得分:0)

您已将<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script> <div class="container"></div>声明为new B的实例,并且没有方法A以使其工作,您必须再次至少投射C它B.假设这是一个伪代码,这可行:

ob