public class test {
public static void main(String[] args) {
Foo foo = new Foo();
foo.test(1);
}
}
class Foo {
void test(byte a) {
System.out.println("byte");
}
void test(int... a) {
System.out.println("int...");
}
void test(short a) {
System.out.println("short");
}
void test(long a) {
System.out.println("long");
}
}
为什么输出结果是long啊。
int类型后面为啥加...呢? 整型常量默认是int型,四个重载函数与int最接近的是long型,把...去掉的话,才是int型
可变参数方法和不可变参数方法,优先匹配不可变参数方法
这个问题往深了说是编译器处理方法重载的问题,是静态分派问题, 编译器遇到重载方法时,是根据外观类型作为判定依据的。靠外观类型(静态类型)决定方法执行版本的分派动作称为静态分派,也可以把这一部分归为解析。
简单的说,当你有方法重载的时候,编译器会推断一个相对合适的版本。
如果有多个父类(或者说范围更高的类型),会在继承关系中从下向上开始搜索,越接近上层,优先级越低,参数传入null也可以。
而可变类型参数的优先级最低,你的int...是可变类型
这篇文章可能适合你浅谈JVM(六):方法调用过程