62,620
社区成员
发帖
与我相关
我的任务
分享
public static void main(String[] args) {
invoke(null);
}
// method_1
public static void invoke(Object obj) {
System.out.println("Object obj");
}
// method_2
public static void invoke(int[] arr) {
System.out.println("int[] arr");
}
// method_3
public static void invoke(int num) {
System.out.println("int num");
}
// method_3
public static void invoke(int num) {
null是空的对象引用。int是基本数据类型,不存在引用的概念。
你可以试一下
int a = null;
肯定会报错了。
接下来要判断,程序调用的是method 1还是method 2,
就必须了解Java的重载解析过程。
Java的重载解析过程是以下两阶段运行的。
第一阶段 选取所有可获得并且可应用的方法。
这一阶段,程序选取method 1和method2。排除了method3。
第二阶段在第一阶段选取的方法中选取最精确的一个。
什么是最精确的一个呢?
如果一个方可以接受传递给另一个方法的任何参数,那么我们就说第一个方法比第二个方法缺乏精确性。
// method_1
public static void invoke(Object obj) {
// method_2
public static void invoke(int[] arr) {
显然invoke(Object obj)的参数,可以接受任何传递给invoke(int[] arr)的参数。因此method 1相对缺乏精确性。
所以,main方法调用的是method 2。
String a1 = null;
System.out.println(a1 + "a2");
不过,确实值得一看。感觉比较好玩,就拿出来探讨下public static void main(String[] args) {
invoke(null);
}
// method_1
public static void invoke(Object obj) {
System.out.println("Object obj");
}
// method_2
public static void invoke(int[] arr) {
System.out.println("int[] arr");
}
// method_3
public static void invoke(int num) {
System.out.println("int num");
}
public static void invoke(String str) {
System.out.println("str");
}
public class Abc {
public static void main(String[] args) {
String letters = "ABC";
char[] numbers = {'1', '2', '3'};
System.out.println("1)" + letters + " easy as " + numbers);
System.out.print("2)" + letters + " easy as ");
System.out.println(numbers); // Invokes println(Object)
}
}
上面的示例是Java Puzzlers的第12个谜题
Ctrl+A查看运行结果
1)ABC easy as [C@15db9742
2)ABC easy as 123
我在想 是不是钻牛角尖了
public class InvokeTest {
public static void main(String[] args) {
Object obj = null;
invoke(obj);
}
// method_1
public static void invoke(Object obj) {
System.out.println("Object obj");
}
// method_2
public static void invoke(int[] arr) {
System.out.println("int[] arr");
}
// method_3
public static void invoke(int num) {
System.out.println("int num");
}
}
嘿嘿