【问题标题】:Overloading and inheritance [duplicate]重载和继承[重复]
【发布时间】:2013-10-05 12:36:20
【问题描述】:

假设我有这些类:

class A {}
class B extends A {}

还有

static void call(A a) { System.out.print("A"); }
static void call(B b) { System.out.print("B"); }
public static void main(String[] args) {
    A a = new A();
    A b = new B();
    call(a);
    call(b);
}

我得到的输出是:AA

在我期待的时候:AB

我想知道为什么?

【问题讨论】:

    标签: java oop


    【解决方案1】:

    我想知道为什么?

    • 因为引用类型是A
    • 重载的方法在编译时绑定。所以在编译时 只有,编译器知道类 A 的方法将被调用为 引用变量b 的类型是A
    • 永远记住,要调用哪个重载方法是在 基于变量引用类型的编译时间

    稍微解释一下,

    A b = new B();
    

    这一行意味着引用变量b 引用了B 类的对象,但它的类型是A,根据上面的规则,编译器在编译时只知道call 方法被称为应该类A

    编辑: 由 Subhrajyoti 建议。 正如 Subhrajyoti 所说,这是编译时多态性

    【讨论】:

    • @sureshatta,感谢您的编辑。
    • 是编译时多态性
    • @JunedAhsan 你的评论可能是我的重复.. :D
    • @MarounMaroun 我在某处读到“伟大的思想都一样”:-p ;-)
    • @SubhrajyotiMajumder 感谢您提供确切的术语,编辑了答案:)
    【解决方案2】:

    变量b的类型是A。静态方法在变量的声明类上调用,而不是在它的实际运行时内容上调用,因此call(b) 绑定为call(A b)

    【讨论】:

      【解决方案3】:

      对于静态方法,您没有多态性。静态方法绑定到类。如果您引用了A,那么您可以从A 调用静态方法

      【讨论】:

        【解决方案4】:

        使用静态类型在编译类型时完成重载调用绑定

        Java 使用 静态类型引用类型 在编译时决定重载调用和 >不是运行时类型。

        所以当b的静态类型为A时,会调用以A为参数的方法。

        call(b) //Now compiler sees that reference type is A

        所以将此调用与call(A a)not call(B b)

        绑定

        【讨论】:

          【解决方案5】:

          您期望的是方法覆盖。在这种情况下,这两个调用方法应该是不同类的一部分,一个在父类中,一个在子类中,在这种情况下,两个方法签名应该完全相同/匹配。

          由于你的方法是静态的,所以你应该记住静态方法没有被覆盖。但是你可以在子类中编写具有相同签名和名称的静态方法,但这将被称为方法隐藏。

          当您调用被覆盖的方法时,方法调用与其定义的绑定在运行时根据引用变量引用的对象类型发生。

          【讨论】:

            【解决方案6】:

            按照惯例,不建议以这种方式使用静态字段以提高可读性。如您所见,您有些困惑。

            使用所有静态字段,例如“A.call(some variable)”而不是“new A().call(some variable)”。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-01-07
              • 2011-02-27
              • 2023-04-04
              • 1970-01-01
              • 1970-01-01
              • 2013-01-12
              相关资源
              最近更新 更多