问题描述
publicclassCollectionDemo{publicstaticvoidmain(String[]args){p(null);}staticvoidp(Objecto){System.out.println("001");}staticvoidp(Strings){System.out.println("002");}}求结果,如果在后面再加上一个staticvoidp(StringBuffersb){System.out.println("003");}求结果。大家都可以想一下,再去运行一下结果,看看是否一致。当然了,最重要的,还是听听大家对其运行的分析。
解决方案
解决方案二:
这样写行吗?放到Eclipse里面报异常个人认为应该先执行object对象的方法,即输出001不过看样子应该是输出002
解决方案三:
mark,我想的跟运行的结果刚刚相反,有点纳闷。。。
解决方案四:
嗯..有意思
解决方案五:
p(objecto)和p(Strings)不能一起出现,Eclipse报错;p(Obj)和p(Strbuf)可以一起出现,因为strbuf不是final修饰的。结果为003具体什么原因期待高手~~~~
解决方案六:
这样是有问题的,去掉以下其中一个staticvoidp(Strings){System.out.println("002");}}staticvoidp(StringBuffersb){System.out.println("003");},如果出现这种情况,那会执行非Object类型的
解决方案七:
这道有意思啊,不过不知道为什么p(Strings)和其他重名的方法一起的时候p(null)就报错呢等高人解释
解决方案八:
这种情况会执行非Object类型,p(Strings)和其他重名的方法(非Object)一起的时候,JVM不知道要调用哪一个啊
解决方案九:
测试了下是final类的原因只要重名的方法中的参数的类型有一个是final类的那么其他重名的方法参数类型有除了Object类型和fianal类的父类类型外p(null)就会编译报错,这是为什么呢
解决方案十:
有趣学习
解决方案十一:
哦,有点意思........
解决方案十二:
晕一开始就想错了被4楼误导了跟final根本就没关系当调用p(null)编译器会去检查所有p()方法的参数除非各个重名方法的参数中存在上下级关系,否则都视为Object就像StringBuffer和String编译器把它们当作两个Object了所以编译报错方法执行的优先级是从参数是子类(最下界?)开始的
解决方案十三:
晕,看得不是很明白,那位高人说详细点,原因,三个方法之间有什么关联和区别
解决方案十四:
jdk1.4,编译没有错,结果002等待达人解释
解决方案十五:
同志们,主要的是我们要搞清楚null到底是什么类型的,null是原始原始数据类型,而不是Object类型!有兴趣的可以到百度这个地址看看:http://zhidao.baidu.com/question/73578464.html
解决方案:
还要补充点,StringBuffer和String不能同时存在你的那种环境中,不能有你补充的那个;当然你也可以加入下面代码是:staticvoidp(inta){System.out.println("111");}staticvoidp(charc){System.out.println("111");}
解决方案:
我楼上的大哥好象是个高手耶~~~~~~~~``学习了UP
解决方案:
确实,加入voidp(StringBuffersb)进去是会报错的,但是为什么呢?
解决方案:
稍微修改一下代码:classBase{}classSubextendsBase{}publicclassOverload{publicstaticvoidmain(String[]args){p(null);}staticvoidp(Objecto){System.out.println("001");}staticvoidp(Basebase){System.out.println("002");}staticvoidp(Subsub){System.out.println("003");}}
也就是说如果多个方法的参数类型都能匹配的话,编译器最终会选择一个“最具体”的方法。所谓一个方法A比另外一个方法B更加具体意思是:任何传递到A方法的参数都可以被方法B接受。在这里任何传递给p(Subsub)的方法都可以被p(Basebase)接受,因此p(Subsub)更具体。大概是这个意思,忘了在哪里看过了.....
解决方案:
看看了解一下
解决方案:
引用4楼hardycheng的回复:
p(objecto)和p(Strings)不能一起出现,Eclipse报错;p(Obj)和p(Strbuf)可以一起出现,因为strbuf不是final修饰的。结果为003具体什么原因期待高手~~~~
出错了,不知道怎么修改
解决方案:
这个原理不难,编译很聪明它会找最近视object的类型来匹配所以这里它找到了staticvoidp(Strings){System.out.println("002");}但是你在加一个staticvoidp(StringBuffersb){System.out.println("003");}编译器很无奈因为他们认为这2种都很接近object,所以存在二义性,编译是过不去的over
解决方案:
鄙人实在是愚钝,不知道这面的什么?难道是null和那种类型匹配。坐看。。。
解决方案:
学习了
解决方案:
学习了
解决方案:
输出是002,null在这里为String类型
解决方案:
我晕呀,看不懂。
解决方案:
俺先拷到MyEclipse运行一下再说...
解决方案:
有意思啊
解决方案:
到底说的什么啊
解决方案:
学习了
解决方案:
哈哈~不错!不错!
解决方案:
Java'soverloadresolutionprocessoperatesintwophases.Thefirstphaseselectsallthemethodsorconstructorsthatareaccessibleandapplicable.Thesecondphaseselectsthemostspecificofthemethodsorconstructorsselectedinthefirstphase.Onemethodorconstructorislessspecificthananotherifitcanacceptanyparameterspassedtotheother[JLS15.12.2.5].引自--javapuzzlers,Puzzle46:TheCaseoftheConfusingConstructor
解决方案:
晕乎乎!
解决方案:
看看大家的意见,学习学习!
解决方案:
这个题不错!
解决方案:
如果是前2个话就输出002如果加上p(StringBuffersb)的话编译不通过的吧(p方法有歧义)
解决方案:
p(Objecto)p(Strings)这两个一起出现没有问题,String是Object的子类.它会调用String而不是Object如果加一个p(StringBuffersb)就会弄不懂要调用哪个,StrinbBuffer也是Object的子类,它的String这两个方法不能确定是调用哪个.如果不调用,p(null)是可以编译通过的.
解决方案:
有意思
解决方案:
哈哈,这些面试题考的还真仔细。。。。。。运行了一下,感觉和想的一样。。。。。
解决方案:
学习学习,还不是很清楚
解决方案:
Null是object类型,在模式匹配时选择最小匹配,所以会输出p(string),但是加上后面的那个后,匹配出现二义性,所以会报错。
解决方案:
packageaa;importjava.util.List;publicclassBb{publicstaticvoidmain(String[]args){p(null);}staticvoidp(Objecto){System.out.println("001");}staticvoidp(Cccsb){System.out.println("002");}staticvoidp(Dddsb){System.out.println("003");}staticvoidp(intsb){System.out.println("004");}}classCccextendsObject{}classDddextendsCcc{}
打印结果003booleanjudge=nullinstanceofObject;if(judge){System.out.println("Yes,nullisanObject.");}else{System.out.println("No,nullisanObject.");}-------编译/运行结果-------No,nullisanObject.///:~EndofCodesegment3综上所述,java中的null的类型是<nulltype>.null本身不是Object这里null在传输的过程中会自动转换成Object楼主的问题上第一次打印002是因为null在选择方法上的优先级,选择最小的。加上后面的代码报错是因为null只能选择一个同级的Object类型,同时有多个同级类型就会不知道选择那个。所以编译报错。
解决方案:
有点意思
解决方案:
我的理解是null属于字符串类型所以对应的应该是String或StriingBuffer类型而调用方法时有更为具体的类型时,JVM就会找范围最小的,所有不会走参数为object的方法,而是会找String或StringBuffer,但如果两种类型都有的话就会因为不知道选择哪个方法而报异常。
解决方案:
引用42楼ddshuaige的回复:
Javacodepackageaa;importjava.util.List;publicclassBb{publicstaticvoidmain(String[]args){p(null);}staticvoidp(Objecto){System.out.println("001");}staticvoidp(Cccsb){System.out.println("002");}staticvoidp(Dddsb){System.out.println("003");}staticvoidp(intsb){System.out.println("004");}}classCccextendsObject{}classDddextendsCcc{}打印结果003booleanjudge=nullinstanceofObject; if(judge){ System.out.println("Yes,nullisanObject."); }else{ System.out.println("No,nullisanObject."); }-------编译/运行结果-------No,nullisanObject.///:~EndofCodesegment3综上所述,java中的null的类型是<nulltype>.null本身不是Object这里null在传输的过程中会自动转换成Object楼主的问题上第一次打印002是因为null在选择方法上的优先级,选择最小的。加上后面的代码报错是因为null只能选择一个同级的Object类型,同时有多个同级类型就会不知道选择那个。所以编译报错。
我看好这种解释。