带有方法调用的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中的所有方法都是虚拟的。