繁体   English   中英

使用方法调用进行Java转换

[英]Java Casting with Method Calls

假设我有以下课程

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?

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

你可以阅读这个解答Override vs. Overload的SO答案。

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

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

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

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

method (B b)

叫做。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM