假设我有一个叫做A
的类。我有另一个课程,调用B
。Java:类和扩展类
B
包含一个名为BsMethod()
的方法,即A
不包含。
说我申报A
数组:arrA = new A[10]
我分配arrA[1] = new B();
我尝试做arrA[1].BsMethod()
这给出了一个错误,说arrA
不包含此方法来调用BsMethod
。我应该更改什么,以便我可以使用arrA[1]
致电BsMethod
?
假设我有一个叫做A
的类。我有另一个课程,调用B
。Java:类和扩展类
B
包含一个名为BsMethod()
的方法,即A
不包含。
说我申报A
数组:arrA = new A[10]
我分配arrA[1] = new B();
我尝试做arrA[1].BsMethod()
这给出了一个错误,说arrA
不包含此方法来调用BsMethod
。我应该更改什么,以便我可以使用arrA[1]
致电BsMethod
?
这是失败的,因为在编译java编译器无法绑定该方法与class A
对象,它不能找到方法BsMethod()
在class A
。
您可以将对象投射到class B
并使用它。
((B)arrA[1]).BsMethod();
在动态绑定实际方法调用在运行时间被确定。所以如果你有一个超类的方法,你也可以在子类中覆盖它。然后,在运行时确定实际的方法调用,这种方法。
您可以通过示例阅读更多关于静态和动态绑定的信息。 Static Binding and Dynamic Binding
你要投arrA[1]
作为B
因为arrA
是A
的阵列和编译器不知道在这一点上约B
。
这样称呼:((B)arrA[1]).BsMethod()
这不是真的准确;绑定仍然是动态的,并且JVM仍然会在运行时确定实际调用哪个方法(因为它可能被覆盖)。静态绑定仅在不可覆盖时才会发生,这意味着静态,最终或私有方法。但是(无需强制转换)'arrA [1]'的编译时类型是'A',所以编译器无法绑定在'B'中声明的方法。 –
@JoeriHendrickx我希望现在有道理。 – YoungHobbit