7

假设我有以下课程

class A{
    public method(A a) {
        System.out.println(3);
    }
}

class B extends A{
  public void method (A a) {
        System.out.println(2);
  }
  public void method (B b) {
        System.out.println(1);
  }
}

A obj = new B();
obj.method( (B) obj);
((B) obj).method( (B) obj);

第一个方法调用打印出 2,而第二个方法调用打印出 1。为什么两个方法调用都不打印出 1?

4

3 回答 3

4

void method (B b)B 的父级 A 完全未知。

这是合乎逻辑的,因为在 中obj.method((B) obj);,类型obj是 A,在多态规则中它可以只调用 void method(A a)B 类的版本。

class B extends A {

    // This is an overridden method visible to A
    public void method(A a) {
        System.out.println(2);
    }

    // This is an overloaded method unknown from A
    public void method(B b) {
        System.out.println(1);
    }
}

您可以阅读解释 Override 与 Overload 的 SO 答案。

于 2013-02-25T08:37:41.177 回答
3

因为java在编译时选择调用的方法。并且编译器只考虑赋值的“左侧”。

因此,当您键入A obj = new B()编译器时,只会“看到” class 中的方法A

于 2013-02-25T08:30:24.150 回答
1

第一个方法调用是使用类型 A 的对象引用完成的,因此调用了可以覆盖的相应方法。

在第二种情况下,首先对类型 B 进行强制转换,因此在类 B 中定义了相应的方法,即

method (B b)

叫做。

于 2013-02-25T08:38:57.693 回答