今天我发现以下代码编译并运行时没有任何警告:
public class Try_MultipleArguments2 {
public static void main(String[] args) {
myfunction();
myfunction(1, 2, 3);
}
public static void myfunction(int ... as) {
System.out.println("varags called");
}
public static void myfunction() {
System.out.println("noarg called");
}
}
我清楚地记得,它不是那么早。
这个JVM是变化还是我的内存故障???
如何区分no-arg和varargs?
更新
以下代码也运行正常:
public class Try_MultipleArguments2 {
public static void main(String[] args) {
myfunction();
myfunction(1, 2, 3);
}
public static void myfunction(int ... as) {
System.out.println("varags called");
}
// public static void myfunction() {
// System.out.println("noarg called");
// }
}
答案 0 :(得分:3)
这些是重载方法。编译器知道编译的main
从方法签名中调用哪个方法。见this specification:
当调用方法(第15.12节)时,在编译时使用实际参数的数量(以及任何显式类型参数)和参数的编译时类型来确定方法的签名。被调用(§15.12.2)。
此外,所选择的方法是最具体的方法。见this。在这种情况下,no-arg方法比varargs版本更具体 - 再次检查参数的数量以查看选择哪种方法。
答案 1 :(得分:-2)
它的后端函数重载。
当void myfunction(int ... as)
没有参数时,void myfunction()
接受多个参数。我没有看到任何故障。 Method Overloading