我想知道为什么这段Java代码会产生2,而不是3:
public class Test {
private static class A {
int f(A a) {
return 1;
}
}
private static class B extends A {
int f(A a) {
return 2;
}
int f(B b) {
return 3;
}
}
public static void main(String[] astrArgs) {
A ab = new B();
B b = new B();
System.out.println( ab.f(b) );
}
}我在一道测试题中遇到了这个问题,并且无法理解它背后的逻辑。
发布于 2013-05-02 04:23:55
ab的编译时类型就是A。因此,当编译器看到这个表达式时:
ab.f(b)..。它只考虑在A及其超类(本例中只有Object )上声明的方法签名。
因此,编译器决定使用签名f(A a)调用该方法。
现在,在执行时,VM根据方法调用目标的执行时类型(即B )来选择要执行该签名的哪个实现。
B重写f(A a),因此重写实现被调用-并返回2。
基本上,重载是在编译时确定的,以根据调用目标和参数的编译时类型确定要调用的方法签名,而重载是在执行时确定的,以根据目标对象的执行时类型确定要执行的确切实现。
发布于 2013-05-02 04:43:13
在本例中,ab是A类型,但实例化为B。A只知道方法
int f(A a) {
return 1;
}B是A类型,所以它是有效的。B覆盖int f(A a),因此使用此方法。
int f(A a) {
return 2;
}希望这能有所帮助。
https://stackoverflow.com/questions/16325823
复制相似问题