Java 转换为超类并调用重载方法
Java cast to superclass and call overload method
abstract class A {
int met(A a) {
return 0;
}
int met(B b) {
return 1;
}
int met(C c) {
return 2;
}
}
class B extends A {
int met(A a) {
return 3;
}
int met(B b) {
return 4;
}
int met(C c) {
return 5;
}
}
class C extends B {
int f() {
return ((A)this).met((A)this);
}
}
public class teste {
public static void main(String args[]) {
C x = new C();
System.out.println(x.f());
}
}
程序将 return 3 而我期待的是 0。为什么方法 f 中的第一个强制转换什么都不做而第二个有效?是不是因为在A和B中类 met方法被重载了,所以使用了静态绑定?
这就是多态性的工作方式。想想这个例子:
A a = new C();
a.met(a);
这将按预期调用正确的方法 B#met(...)
。一个对象的 method-tables 不只是因为你改变了你存储 Object
的变量的类型而改变,因为 Object
和它的方法之间的绑定比一个更强在 storage-type 和与之相关的方法之间。第二种类型有效,因为输入的类型被强制转换为 A
,因此该方法将其识别为 A
(input-storage 的类型比 Object
具有更强的绑定]类型)。
abstract class A {
int met(A a) {
return 0;
}
int met(B b) {
return 1;
}
int met(C c) {
return 2;
}
}
class B extends A {
int met(A a) {
return 3;
}
int met(B b) {
return 4;
}
int met(C c) {
return 5;
}
}
class C extends B {
int f() {
return ((A)this).met((A)this);
}
}
public class teste {
public static void main(String args[]) {
C x = new C();
System.out.println(x.f());
}
}
程序将 return 3 而我期待的是 0。为什么方法 f 中的第一个强制转换什么都不做而第二个有效?是不是因为在A和B中类 met方法被重载了,所以使用了静态绑定?
这就是多态性的工作方式。想想这个例子:
A a = new C();
a.met(a);
这将按预期调用正确的方法 B#met(...)
。一个对象的 method-tables 不只是因为你改变了你存储 Object
的变量的类型而改变,因为 Object
和它的方法之间的绑定比一个更强在 storage-type 和与之相关的方法之间。第二种类型有效,因为输入的类型被强制转换为 A
,因此该方法将其识别为 A
(input-storage 的类型比 Object
具有更强的绑定]类型)。