import java.util.ArrayList;
import java.util.List;public class Demo {
public static void main(String[] args) {
x(null);
}
public static void x(int x){
System.out.println("x(int)");
}
public static void x(List x){
System.out.println("x(List)");
}
public static void x(ArrayList x){
System.out.println("x(ArrayList)");
}
public static void x(Object x){
System.out.println("x(Object)");
}
}
上面的代码应该输出什么,为什么?有人知道吗?

解决方案 »

  1.   

    输出x(ArrayList)
    java 方法 就近调用原则
      

  2.   

    输出x(ArrayList)
    调用java方法,当参数满足好几个重载方法时,会调用符合参数条件范围最小的。
    null  证明参数要是引用类型,ArrayList是List子类,所以调用ArrayList的
      

  3.   

    为什么不调用x(int x)?int型不是引用类型,这次yes了吧
      

  4.   

    为什么不调用x(int x)?int型不是引用类型,这次yes了吧好吧,给你一个YES!
      

  5.   

    为什么不调用x(int x)?int型不是引用类型,这次yes了吧好吧,给你一个YES!
      

  6.   

    x(object)吧,因为null最最符合的是Object
      

  7.   

    +1
    如果想调用x(int x),就在调用方法处给一个符合参数的值,就是说可以这样x(1);
      

  8.   

    验证了一下:
    > javac Demo.java
    > java Demo
    x(ArrayList)
      

  9.   

    当然是输出x(ArrayList)了!---------首先,来一段题外的--------其实,这是根据函数的重载规则来的,
    比如,你如果把你的函数里
        public static void x(int x){
            System.out.println("x(int)");
        }
    改成
        public static void x(Integer x){
            System.out.println("x(int)");
        }
    程序就会报错!
    因为匹配有错!-----------现在进入正题-------1、思考,为什么程序不报错
    在你的程序里面,int 是原生类型,Object是基本对象类型,所以,这两个和List \ ArrayList不冲突,所以,不会报错!2、首先证明了你的程序不报错,现在,分析别的。
    在你的程序里,int和null是不匹配的,所以,x(null)根本不会理会x(int),
    然后,Object ---> List ---> ArrayList是继承关系。
    在英语语法中,有一个有意思的原则,叫:就近原则 , Java的设计者在设计重载函数的冲在顺序时,不应该忽视他,因为这个原则很好的表达了继承关系。
    于是,根据这原则,自然选择x(ArrayList)。3、猜是没有意义的!前面很多楼层的猜测,我建议好好看看JavaSE基本部分(即Java基础)
      

  10.   

    因为Integer和ArrayList有冲突,不知道应该调用哪一个,所以就会报错
      

  11.   

    总结的好呀~
    这里有个类似的,也可以过来看看,挺有意思的:http://bbs.csdn.net/topics/390568327