[英]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);
}
}
因为java选择在编译时调用的方法。 编译器只考虑赋值的“左侧”。
因此,当您键入A obj = new B()
,编译器仅“看到” A
类中的方法。
第一个方法调用是使用类型A的对象引用完成的,因此可以调用相应的方法(可以重写)。
在第二种情况下,首先对类型B进行强制转换,因此在B类中定义相应的方法,即:
method (B b)
叫做。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.