简单的问题,奇怪的结果.我有两个类A和B:
public class A
{
protected int num;
public A(int n)
{
num = n;
}
public boolean f(A a)
{
return num == a.num * 2;
}
}
Run Code Online (Sandbox Code Playgroud)
public class B extends A
{
public B(int n)
{
super(n);
}
public boolean f(B b)
{
return num == b.num;
}
}
Run Code Online (Sandbox Code Playgroud)
为什么要y1.f(y2)调用f()方法A而不是in B?
A y1 = new B(10);
B y2 = new B(10);
System.out.println(y1.f(y2));
Run Code Online (Sandbox Code Playgroud)
难道不应该叫f()在B为B比更具体A?
Jon*_*eet 32
为什么y1.f(y2)在A中而不是在B中调用f()方法?
因为编译时类型y1是A.
重载是在编译时执行的...您调用方法的对象的执行时类型仅与重写相关.
所以编译器选择的方法f(A)是f它知道它可以调用的唯一方法y1(并且在给定参数列表的情况下检查它是否适用).该方法未被覆盖B,因此在执行时,A调用inlmenetation .
作为一个更为明显的例子,请考虑以下代码:
Object x = "foo";
int length = x.length();
Run Code Online (Sandbox Code Playgroud)
这甚至不会编译,因为Object不包含length()方法.String确实,但是编译器不考虑,因为编译时类型x是Object,不是String-尽管我们可以告诉大家,在执行时,值x将是一个参考String对象.
| 归档时间: |
|
| 查看次数: |
1599 次 |
| 最近记录: |