我在本网站上看到了以下问题。
"What happens when we pass int arguments to the overloading method having float
as a parameter for one method and another having double param".
我以为我理解了这个概念并编写了这段代码:
public class TestClass {
public static void main(String args[])
{
TestClass t=new TestClass();
t.sum(1/4);
}
void sum(double d)
{
System.out.println("Double==="+d);
}
void sum(int i)
{
System.out.println("Integer==="+i);
}
void sum(short s)
{
System.out.println("Short==="+d);
}
}
根据我在网站上解释的理解(如上所述),我认为它会打印Short===0
,但令我惊讶的是它会打印Integer===0
。任何人都可以向我解释一下吗?
答案 0 :(得分:4)
首先,这些是重载方法,而不是重写方法。
1
和4
是整数。因此1/4
是一个整数除法,返回0
。
因此,被调用的方法是sum(int i)
。
sum(short s)
,因为这需要narrowing primitive conversion (JLS 5.1.3),这可能会导致数据丢失,method invocation conversion (JLS 5.3)中不允许这样做。这种转换可以通过显式转换来完成。
如果删除int版本,将调用sum(double d)
,如果删除双版本,则代码将无法编译。
要调用短版本,必须将参数转换为short:
t.sum ((short)(1/4));
答案 1 :(得分:0)
如果您没有明确告诉编译器1
和4
的类型是什么,则假定它们的类型为int
。然后,/
运算符将应用整数除法,并将生成另一个int
(将为0
。)
之后,将调用具有特定于整数参数类型的方法。在您的情况下,这将是sum(int i)
。
如果要调用其他一些重载方法,则必须明确地:
sum((short) (1/4));
将调用sum(short s)
。sum(1d/4)
将调用sum(double d)
,因为1d/4
将导致double
答案 2 :(得分:0)
对于整数,类型int
是默认选项。因此,虽然1和4可以定义为int
或short
,但由于您没有定义任何内容,编译器将1和4标识为int
,因此它输入到函数中取1/4除法(0),取参数int
。