public class CollectionDemo { public static void main(String[] args){
p(null); }

static void p(Object o){
System.out.println("001");
}

static void p(String s){
System.out.println("002");
}
}求结果,如果在后面再加上一个
static void p(StringBuffer sb){
System.out.println("003");
}求结果。    大家都可以想一下,再去运行一下结果,看看是否一致。当然了,最重要的,还是听听大家对其运行的分析。
   

解决方案 »

  1.   

    这样写 行吗?  放到Eclipse里面报异常个人认为应该先执行 object对象的方法,即输出 001  不过看样子应该 是输出 002
      

  2.   

    p(object o) 和 p(String s )不能一起 出现,Eclipse报错;
    p(Obj) 和 p(Strbuf) 可以一起出现,因为strbuf不是final修饰的。 结果为 003具体什么原因 期待高手~~~~
      

  3.   

    这样是有问题的,去掉以下其中一个
    static void p(String s){ 
    System.out.println("002"); 

    } static void p(StringBuffer sb){ 
    System.out.println("003"); 
    } ,如果出现这种情况,那会执行非Object类型的
      

  4.   

    这道有意思啊,不过不知道为什么p(String s )和其他重名的方法一起的时候
    p(null)就报错呢
    等高人解释
      

  5.   

    这种情况会执行非Object类型,p(String s )和其他重名的方法(非Object)一起的时候,JVM不知道要调用哪一个啊
      

  6.   

    测试了下是final类的原因
    只要重名的方法中的参数的类型有一个是final类的
    那么其他重名的方法参数类型有除了Object类型和fianal类的父类类型外
    p(null)就会编译报错,这是为什么呢
      

  7.   

    晕一开始就想错了被4楼误导了跟final根本就没关系
    当调用p(null)编译器会去检查所有p()方法的参数
    除非各个重名方法的参数中存在上下级关系,否则都视为Object
    就像StringBuffer 和 String编译器把它们当作两个Object了所以编译报错
    方法执行的优先级是从参数是子类(最下界?)开始的
      

  8.   

    jdk1.4,编译没有错,结果002
    等待达人解释
      

  9.   

    同志们,主要的是我们要搞清楚null到底是什么类型的,null是原始原始数据类型,而不是Object类型!
    有兴趣的可以到百度这个地址看看:http://zhidao.baidu.com/question/73578464.html
      

  10.   

    还要补充点,StringBuffer和String不能同时存在你的那种环境中,不能有你补充的那个;
    当然你也可以加入下面代码是:static void p(int a){
    System.out.println("111");
    }
    static void p(char c){
    System.out.println("111");
    }
      

  11.   

    确实,加入void p(StringBuffer sb) 进去是会报错的,但是为什么呢?
      

  12.   

    稍微修改一下代码:class Base{
    }
    class Sub extends Base{
    }
    public class Overload{ 
    public static void main(String[] args){ 
       p(null); 
    }
    static void p(Object o){ 
    System.out.println("001"); 

    static void p(Base base){ 
    System.out.println("002"); 

    static void p(Sub sub){ 
    System.out.println("003"); 

    } 也就是说如果多个方法的参数类型都能匹配的话,编译器最终会选择一个“最具体”的方法。所谓一个方法A比另外一个方法B更加具体意思是:任何传递到A方法的参数都可以被方法B接受。
    在这里任何传递给 p(Sub sub)的方法都可以被p(Base base)接受,因此p(Sub sub)更具体。
    大概是这个意思,忘了在哪里看过了.....
      

  13.   


    这个 原理不难,编译很聪明 它会找最近视object的类型 来匹配 
    所以 这里它 找到了
    static void p(String s){
    System.out.println("002");
    } 但是你在加一个 static void p(StringBuffer sb){
    System.out.println("003");
    } 编译器很无奈 因为他们认为 这2种都很接近object,所以 存在二义性,编译是过不去的over
      

  14.   

    鄙人实在是愚钝,不知道这面的什么?难道是null和那种类型匹配。坐看
      

  15.   

    输出是002,null在这里为String类型
      

  16.   

     俺  先拷到 MyEclipse 运行一下 再说...
      

  17.   

    Java's overload resolution process operates in two phases. The first phase selects all the methods or constructors that are accessible and applicable. The second phase selects the most specific of the methods or constructors selected in the first phase. One method or constructor is less specific than another if it can accept any parameters passed to the other [JLS 15.12.2.5].
    引自--java puzzlers,Puzzle 46: The Case of the Confusing Constructor
      

  18.   

    如果是前2个话就输出 002 如果加上 p(StringBuffer sb)的话 编译不通过的吧(p方法有歧义)
      

  19.   

    p(Object o)
    p(String s)
    这两个一起出现没有问题,String是Object的子类.
    它会调用 String而不是Object
    如果加一个p(StringBuffer sb)
    就会弄不懂要调用 哪个,StrinbBuffer也是Object的
    子类,它的String这两个方法不能确定是调用哪个.
    如果不调用,p(null)是可以编译通过的.
      

  20.   

    Null 是object类型,在模式匹配时选择最小匹配,所以会输出p(string),但是加上后面的那个后,匹配出现二义性,所以会报错。
      

  21.   


    package aa;import java.util.List;public class Bb { public static void main(String[] args){ 
    p(null);  }  static void p(Object o){ 
    System.out.println("001"); 


    static void p(Ccc sb){ 
    System.out.println("002"); 


    static void p(Ddd sb){ 
    System.out.println("003"); 

    static void p(int sb){ 
    System.out.println("004"); 



    }class Ccc extends Object{

    }class Ddd extends Ccc{

    }
    打印结果003boolean judge = null instanceof Object;
      if(judge){
       System.out.println("Yes, null is an Object.");
      }else{
       System.out.println("No, null is an Object.");
      }------- 编译/运行结果 -------No, null is an Object.
    ///:~End of Code segment 3
    综上所述,java中的null 的类型是<nulltype>.null本身不是Object
    这里null在传输的过程中会自动转换成Object
    楼主的问题上第一次打印002是因为null在选择方法上的优先级,选择最小的。
    加上后面的代码报错是因为null只能选择一个同级的Object类型,同时有多个同级类型就会不知道选择那个。所以编译报错。
      

  22.   

    我的理解是 null属于字符串类型 所以对应的应该是 String 或StriingBuffer类型 而调用方法时 有更为具体的类型时,JVM就会找范围最小的,所有不会走参数为object的方法,而是会找String或StringBuffer,但如果两种类型都有的话 就会因为不知道选择哪个方法而报异常。