带有方法调用的Java强制转换

带有方法调用的Java强制转换,java,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();

假设我有以下课程

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?

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

因此,当您键入
A obj=new B()
时,编译器只“看到”类
A
中的方法,而B的void方法(B)对于其父A来说是完全未知的

这是合乎逻辑的,因为在
obj.method((B)obj)中
obj
的类型是A,在多态性规则中,它可以调用类B的
void方法(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);
    }
}

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

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

method (B b)

被称为。

嗯。。。编译器只“看到”定义了这样的方法,但调用对象的方法,在本例中,这些方法是类B的方法,因为它具有相同的方法和相同的参数。这是因为java中的所有方法都是虚拟的。