【问题标题】:Java: Classes and Extended ClassesJava:类和扩展类
【发布时间】:2016-01-15 05:45:17
【问题描述】:

假设我有一个名为A 的类。我有另一个扩展 A 的类,称为 B

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

假设我声明了一个A 的数组:arrA = new A[10]

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

我尝试通过 arrA[1].BsMethod() 拨打 BsMethod

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

【问题讨论】:

    标签: java class oop extends superclass


    【解决方案1】:

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

    您可以将对象转换为class B 并使用它。

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

    动态绑定中,实际的方法调用是在运行时确定的。因此,如果您在超类中有一个方法,并且在子类中也覆盖了它。然后在运行时确定此类方法的实际方法调用。

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

    【讨论】:

    • 这不太准确;绑定仍然是动态的,JVM 仍然会在运行时确定实际调用哪个方法(因为它可以被覆盖)。静态绑定仅在无法覆盖时发生,这意味着静态、最终或私有方法。但确实(不强制转换)arrA[1] 的编译时类型是A,所以编译器无法绑定B 中声明的方法。
    • @JoeriHendrickx 我希望现在有意义。
    【解决方案2】:

    您必须将arrA[1] 转换为B,因为arrAA 的数组,而此时编译器不知道B

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

    【讨论】:

      猜你喜欢
      • 2013-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-25
      • 2011-06-15
      • 1970-01-01
      • 2014-06-12
      相关资源
      最近更新 更多