本帖最后由 magi1201 于 2014-09-26 20:38:12 编辑

解决方案 »

  1.   


    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");
        }
    }
    嘿嘿
      

  2.   

    感觉这样的语言细节了解的越多越好
    不是钻牛角尖儿,而是加深理解
    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
      

  3.   

    method1实际运行发现真错了
    太难了得看看源码到底是如果匹配参数的难道是先子类后父类, 先基本类型后引用类型的顺序吗?
      

  4.   

    只能说明null是对象。
    先找具体对象。这样就报错了,有2个具体对象,不知道匹配谁。   String   int[]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");
    }
      

  5.   

    恩 null 是现象级的String a1 = null;
    System.out.println(a1 + "a2");不过,确实值得一看。感觉比较好玩,就拿出来探讨下
      

  6.   

    java程序在运行时,当遇到函数重载的时候,会根据参数去匹配最接近的子类,然后再去匹配父类,Object是所有子类的父类,所以最后考虑翻书为Object的方法的执行。
      

  7.   

    首先,method 3排除。// 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。
      

  8.   


    点赞,这个解释结合上面说如果同时有 String,int[]看得话,觉得很对