2015-10-16 124 views
1

假设我有一个叫做A的类。我有另一个课程,调用BJava:类和扩展类

B包含一个名为BsMethod()的方法,即A不包含。

说我申报A数组:arrA = new A[10]

我分配arrA[1] = new B();

我尝试做arrA[1].BsMethod()

这给出了一个错误,说arrA不包含此方法来调用BsMethod 。我应该更改什么,以便我可以使用arrA[1]致电BsMethod

回答

2

这是失败的,因为在编译java编译器无法绑定该方法与class A对象,它不能找到方法BsMethod()class A

您可以将对象投射到class B并使用它。

((B)arrA[1]).BsMethod(); 

动态绑定实际方法调用在运行时间被确定。所以如果你有一个超类的方法,你也可以在子类中覆盖它。然后,在运行时确定实际的方法调用,这种方法。

您可以通过示例阅读更多关于静态和动态绑定的信息。 Static Binding and Dynamic Binding

+0

这不是真的准确;绑定仍然是动态的,并且JVM仍然会在运行时确定实际调用哪个方法(因为它可能被覆盖)。静态绑定仅在不可覆盖时才会发生,这意味着静态,最终或私有方法。但是(无需强制转换)'arrA [1]'的编译时类型是'A',所以编译器无法绑定在'B'中声明的方法。 –

+0

@JoeriHendrickx我希望现在有道理。 – YoungHobbit

1

你要投arrA[1]作为B因为arrAA的阵列和编译器不知道在这一点上约B

这样称呼:((B)arrA[1]).BsMethod()