根据我的理解,Java中的所有函数调用都是虚拟的,数字文字的类型为int。但是为什么下面例子中的输出不同?
public class A {
public int f(long d) {
return 2;
}
}
public class B extends A {
public int f(int d) {
return 1;
}
}
public class M {
public static void main(String[] args) {
B b = new B();
A ab = b;
System.out.println(b.f(1));
System.out.println(ab.f(1));
}
}
答案 0 :(得分:1)
你不要覆盖任何东西。
第一次调用System.out.println(b.f(1));
会返回1
,因为它与class B
一起使用,即使该方法命名相同,但参数不同(long
不是与int
)相同。
如果参数相同(int d)
,结果将为1
,因为它会覆盖(@Override
} class A
的方法。
现在,您知道为什么第二次调用System.out.println(ab.f(1));
会返回2
。从哪个班级调用来看。
答案 1 :(得分:0)
实际上子类 B 继承了方法 f(with a long) 并添加了(重载)了另一个方法 f(with a int)。 当您以这种方式写下诸如 1 之类的值时,即使在将其分配给类型化引用之前,编译器也会将其解析为 int。更多信息:Java's L number (long) specification .
当您使用引用 ab(这是 A 类)调用方法 f 时,它(引用)说我只能将您发送到方法 f(带有 long),然后将类型 int 1 隐式转换为 long .
我们尝试将A类中方法的类型改为f(short), 然后 System.out.println(ab.f(1));会给你这个错误: "类型A中的方法f(short)不适用于参数(int)"