重载方法

时间:2014-11-03 11:54:53

标签: java methods overloading

我在本网站上看到了以下问题。

"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。任何人都可以向我解释一下吗?

3 个答案:

答案 0 :(得分:4)

首先,这些是重载方法,而不是重写方法。

14是整数。因此1/4是一个整数除法,返回0

因此,被调用的方法是sum(int i)

永远不会为int参数调用

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)

如果您没有明确告诉编译器14的类型是什么,则假定它们的类型为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可以定义为intshort,但由于您没有定义任何内容,编译器将1和4标识为int,因此它输入到函数中取1/4除法(0),取参数int