使用方法调用进行Java转换

时间:2013-02-25 08:27:28

标签: java

假设我有以下类

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?

3 个答案:

答案 0 :(得分:4)

B的

void method (B b)对于其父A来说是完全未知的。

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

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);
    }
}

You can read this SO answer which explained Override vs. Overload.

答案 1 :(得分:3)

因为java选择在编译时调用的方法。编译器只考虑作业的“左侧”。

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

答案 2 :(得分:1)

第一个方法调用是使用类型A的对象引用完成的,因此可以调用相应的方法(可以重写)。

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

method (B b)

被召唤。