【发布时间】:2014-12-06 20:58:49
【问题描述】:
假设我们有这两个类和一个主要方法:
public class Super {
public void f(double d){
System.out.println("Super: f(double d)");
}
public void f(int i){
System.out.println("Super: f(int i)");
}
}
public class Sub extends Super {
public void f(double d){
System.out.println("Sub: f(double d)");
}
public void f(float f){
System.out.println("Sub: f(float f)");
}
}
public class M {
public static void main(String[] args){
Sub a = new Sub();
a.f(1.5f); //output: "Sub: f(float f)"
Super b = new Sub();
b.f(1.5f); //output: "Sub: f(double d)"
}
}
为什么第二次调用的结果是Sub: f(double d) 而不是Sub: f(float f) 像第一个一样?
当我添加时
public void f(float f) {
System.out.println("Super: f(float f)");
}
到Super 类,输出变为Sub: f(float f)。
鉴于这种行为,我希望工作流程如下所示:
- 当
a向上转换为Super时,会检查Super类的匹配方法 - 只找到
public void f(double d),所以浮点数被转换为双精度数 - 现在可以看到并执行更具体的类
Sub中的方法public void f(double d)
这对吗?
【问题讨论】:
-
因为没有方法
f(float)可通过Super类型的引用获得。
标签: java casting overloading upcasting