重载Java函数并确定要执行的函数

caw*_*caw 2 java overloading function

当涉及到重载函数时,我还没有完全理解Java如何确定在运行时执行哪个函数.我们假设我们有一个这样的简单程序:

public class Test {

    public static int numberTest(short x, int y) {
        // ...
    }
    public static int numberTest(short x, short y) {
        // ...
    }

    public static void main(String[] args) {
        short number = (short) 5;
        System.out.println(numberTest(number, 3));
    }

}
Run Code Online (Sandbox Code Playgroud)

我测试了这个 - 而Java使用了第一个numberTest()函数.为什么?为什么不使用第二个,或者更确切地说,为什么它不显示编译器错误?

第一个参数是short,好的.但第二个区别于这两个功能.由于函数调用只使用3,它可能是两者,不是吗?并且不需要类型转换.或者,每当我使用"3"时,Java是否应用类型转换int?是否总是开始byte,然后转换为shortint呢?

Jon*_*eet 6

第一个参数很简单,好的.但第二个区别于这两个功能.由于函数调用仅使用3,它可能是两者,不是吗?

不,Java中的整数文字总是int或者long.举个简单的例子,这段代码:

static void foo(short x) {
}

...
foo(3);
Run Code Online (Sandbox Code Playgroud)

给出这样的错误:

Test.java:3: error: method foo in class Test cannot be applied to given types;
        foo(3);
        ^
  required: short
  found: int
  reason: actual argument int cannot be converted to short by method invocation
  conversion
1 error
Run Code Online (Sandbox Code Playgroud)

JLS第3.10.1节开始:

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