java中当一个方法存在重载时,我通过方法名调用方法是java是如何判断应该执行那个方法呢,尤其是在方法中的形参存在包装器类的对象时

我学习到包装器类时,发现报了这样的一个错误

public class Demo
{
    public static void main(String[] args) {
        short s1 = 12;
        short s2 = 32;
        Test.f(s1,s2);
        Short a = s1;
        Short b = s2;
        Test.f(a,s1);  //1
        Test.h(s1);    //2
        Test.h(s1,s2); //3
        Test.h(a);     //4
        Test.h(a,b);   //5
     }
}
class Test{
    static void f(short a,short b) {}
    static void f(Short a,Short b) {}
//    static void h(short a) {}
    static void h(Short...arr) {}
    static void h(short...arr) {}
}

其中注释了的代码都报错了,我在网上查了半天也没搞明白,查到了一个感觉可能有关的


我知道是意义有混淆,比如Test.h(a,b); 可能是要调用h(Short,Short)这个方法,但也可能是要自动拆箱后调用h(short,short)方法,但是为什么去掉static void h(short a) {}前的注释后h(s1)却能判断出要调用h(short)这个方法呢,我没法将其统一起来
就想明白java是如何判断应该调用了那个方法

是根据参数数量和参数类型判断的。

把 你的 这2个方法:static void h(Short...arr) {}
static void h(short...arr) {}
改成: static void h(Short[] arr) {}
static void h(short[] arr) {}

然后把上面的调用改正确,你会发现能顺利执行,基本类型 和包装类型虽然能自动转换,但本质上还是属于不同的类型;

还能增加重载方法: static void f(Short a,short b){} ; static void f(short a,Short b){} 等等 都是可以的


这是我找到的结果,其实我想问的只是java如何判断应该执行那个成员方法而已。。。。
我看不懂,但是这些我是能看懂的
在第一个阶段中,编译器在不允许自动装箱和解箱以及不考虑变长参数列表的情况下,执行方法搜索;
在第二个阶段中,编译器在不考虑变长参数列表,但是允许自动装箱和解箱的情况下,执行方法搜索;
在第三个阶段中,编译器在允许自动装箱和解箱以及变长参数列表的情况下,执行方法搜索;

定义的方法名与调用语句中的方法名一致(大小写敏感的);
方法定义对于方法调用语句来说是可以见的;
方法定义中的参数个数必须小于等于方法调用语句中提供的参数个数(变长参数被视为一个方法参数);
如果方法定义的参数列表中包含了变长参数,假设方法定义有n个参数(变长参数被视为一个方法参数),那么方法调用语句提供的参数列表长度必须大于等于n-1;
如果方法定义不包含变长参数,假设方法定义有n个参数,那么方法调用语句提供的参数列表的长度也必须是n;
如果方法调用语句包含了显示的类型参数,并且方法声明也是泛型的,那么方法调用语句中的真实类型参数个数必须与方法声明中的形式化类型参数的格式保持一致;
方法调用语句中参数列表中的参数类型必须依次能够与方法声明中参数列表的参数类型匹配;