每次调用Integer方法 - methodOverloading -java

时间:2018-05-21 06:12:19

标签: java overloading

我在方法重载方面有些困惑,任何人都可以解决这个问题。

在我的示例类中,我有一个名称显示的方法,它被重载,代码如下所示。

class Sample {
    void display(byte num) {
        System.out.println("under byte");
    }

    void display(short num){
        System.out.println("under short");
    }

    void display(int num) {
        System.out.println("under int");
    }

    void display(long num) {
        System.out.println("under long");
    }

    public static void main(String... args) {
        Sample sample = new Sample();
        sample.display(10);
        sample.display(128);
        sample.display(134572);
        sample.display(65757l);
    }
}

我的输出为

under int
under int
under int
under long

为什么即使数字小于127也jvm没有调用接受byte作为参数的方法?

提前致谢

7 个答案:

答案 0 :(得分:5)

没有后缀的整数值的文字总是由编译器视为int字面值。因此,无论实际值如何,都会在前3个案例中选择display(int num)

在最后一种情况下,您传递了一个带有l后缀的文字,后缀被视为long,这就是调用接受long的方法的原因。

答案 1 :(得分:1)

byte :8位有符号整数。可以保存-128到127之间的值。 :16位有符号整数。可以保存-32,768到32,767之间的值。 int :32位有符号整数。可以保持从-2,147,483,648到2,147,483,647的值。 :64位整数。可以容纳非常大的数字(-2 ^ 63到2 ^ 63-1)。

通常情况下,从较大数据类型到较低数据类型的转换不是强制性的,系统本身将负责这一点,但我们必须明确提及将较低数据类型转换为较高数据类型。

覆盖代码中的所有方法。试试这个

Sample sample = new Sample();
sample.display((byte)10);
sample.display((short)128);
sample.display(134572);
sample.display(65757l);

答案 2 :(得分:0)

  

为什么即使数字小于127也jvm没有调用接受byte作为参数的方法?

因为文字127的类型是int(根据JLS 15.8.1)。 int类型无法隐式转换为byteshort,因此前两个重载不兼容。 int参数的方法更具体JLS 15.12.2.5),而不是long参数的方法,这就是为什么选择它,除了你的上一个例子由于文字以long结尾,因此使用l参数。 (顺便说一句,我建议使用L作为后缀而不是l;它更清晰的IMO。)

调用方法和分配变量之间存在差异。这没关系:

byte b = 127;

因为127是一个赋给byte的常量表达式,并且它已知是该字节的有效值。这是分配上下文,分配上下文的有效转换在JLS 5.2中指定。

进行方法调用时,从参数类型到参数类型的转换是而不是被视为赋值上下文。相反,这是一个调用上下文JLS 5.3)。这是Java语言设计者的选择 - 语言可以以允许它的方式设计,但事实并非如此。这种差异在JLS 5.3中被提及:

  

严格或松散的调用上下文都不包括赋值上下文中允许的整数常量表达式的隐式缩小。 Java编程语言的设计者认为,包含这些隐式缩小转换会增加重载决策规则的复杂性(§15.12.2)。

答案 3 :(得分:0)

The values of the integral types are integers in the following ranges:

  

对于字节,从-128到127,包括

     

简而言之,从-32768到32767,包括

     

对于int,从-2147483648到2147483647,包括

     

很长一段时间,从-9223372036854775808到9223372036854775807,包括在内

     

对于char,从'\ u0000'到'\ uffff'包含,即从0到   65535

如果您明确使用后缀lLReference

,则整数值的类型为long
  

如果整数文字以ASCII为后缀,则其长度为long   字母L或l(ell);否则它的类型为int(§4.2.1)。

如此有效,你在传递那些int时调用你的int重载版本:

    sample.display(10);
    sample.display(128);
    sample.display(134572);

例如,如果您需要调用short重载版本,则必须先缩小该值:

 sample.display((short) 10);

答案 4 :(得分:0)

您需要澄清整数数字的type,否则它会始终将该数字视为int。 (除了更大的数字)

答案 5 :(得分:0)

Java中整数的默认数据类型是整数,因此每个调用都委托给接受int类型参数的方法。

如果要调用其他方法,可以在方法调用期间键入强制转换为该类型的值,也可以声明该类型的变量并在方法调用期间传递该变量。

答案 6 :(得分:0)

您的问题有三个基本原则:

  1. <强>字面: 如果编写sample.display(10),则默认情况下Java编译器将数字10视为int变量类型的整数文字。

  2. <强>重载: 您有4个具有单个参数的重载方法。当值传递给方法时,编译器将选择具有最接近输入值类型的参数数据类型的值。在这种情况下,编译器将对前3个调用执行display(int num),因为输入值是整数文字。第四个将执行display(long num)因为输入值很长。

  3. <强>铸造: 如果要执行显示(字节数)和显示(短麻木),则需要将int类型的输入值向下转换为byte和short。因为从int到byte或short的向下转换是一个缩小的转换,所以你必须明确地做。

    sample.display(10) -> sample.display((byte)10);
    sample.display(128) -> sample.display((short)128);