我是Java的新手并且正在尝试学习方法覆盖。 当我执行以下操作时,输出为-35。有人可以解释一下吗?
public static void f(int a, int b) {
System.out.println(a + b);
}
public static void f(double a, double b) {
System.out.println(a - b);
}
public static void main(String[] args) {
int i = 19;
double x = 54.0;
f(i, x);
}
输出:
-35
答案 0 :(得分:2)
Java选择最具体的适用类型。在这种情况下,f(int,int)不适用。
它选择f(double,double),因为两个参数都可以转换为double,但两个参数都不能转换为int而不会丢失。如果f(double,double)不存在,则f(int,int)仍然无法在没有强制转换的情况下使用。
规格中的更多信息: https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.12.2
答案 1 :(得分:1)
正在调用带有double
参数的方法,因为double
优先于int
。这是因为int
可以分配给double
,但不是相反。
例如:
int a = 0;
double b = 0;
b = a; // Okay
a = b; // error
所谓使用f(int a, int b)
和double
调用int
会导致错误,而调用f(double a, double b)
则不会,因为int
只会被投放到double
。