一道面试题,一起来探讨

问题描述

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类型,同时有多个同级类型就会不知道选择那个。所以编译报错。

我看好这种解释。

时间: 2024-10-31 04:23:23

一道面试题,一起来探讨的相关文章

一道面试题(关于千万量级数据结构排序)

问题描述 一道面试题(关于千万量级数据结构排序) 题目: 已知文件中存有全国英语六级历年来的成绩(千万级别,考生分数都是正整数,最高710分),每一行都是一个人的姓名.考号和成绩,请你对考生的成绩从高到低进行排序,输出到另一个文件中. 格式 如下: 李四,201008823,678: 张三,201007432,356: 王五,201322233,464: 排序后: 李四,201008823,678: 王五,201322233,464: 王五,201322233,464: 要求:使空间复杂度和时间

语言 面试题-一道面试题,不是很清楚这个例子怎么解答,求大神帮助.

问题描述 一道面试题,不是很清楚这个例子怎么解答,求大神帮助. 提问是 这段代码有什么问题, 有什么解决思路.(我其实连问题都没看出来,代码可以编译) // Memory-mapped peripheral#define STATUS_REG_ADDR 0x12345678 // 32-bit status register#define DATA_REG_ADDR 0x1234567C // 32-bit data register // Status register bits#define

初始化顺序-今年阿里巴巴的一道笔试题

问题描述 今年阿里巴巴的一道笔试题 public class Test1 { public static int k = 0; public static Test1 t1 = new Test1("t1"); public static Test1 t2 = new Test1("t2"); public static int i = print("i"); public static int n = 99; public int j = pr

结构体定义-如何定义满足以下的Node与List结构体,今天参加斐讯的一道笔试题。

问题描述 如何定义满足以下的Node与List结构体,今天参加斐讯的一道笔试题. Node包含50个字符.

从一道面试题说去

    有一道面试题: 给定n个整型数,怎样让这n个数的使用空间最小.      ok,我们都知道在32位的机器下,int类型的数占4个字节,因此n个数总的使用空间应该是4n.(64位不做解释)那我们怎么样才能使得n个数字的使用空间最小呢?     一. 我们先来看一个例子           假设现在有3个数,1,2,3.           我们都知道数字最后都是以二进制的方式存储的,我们可以表示出1,2,3的二进制           1: 0000 0000 0000 0000 0000

《Wireshark网络分析就这么简单》—从一道面试题开始说起

从一道面试题开始说起Wireshark网络分析就这么简单从一道面试题开始说起我每次当面试官,都要伪装成无所不知的大牛. 这当然是无奈的选择--现在每封简历都那么耀眼,不装一下简直镇不住场面.比如尚未毕业的本科生,早就拿下CCIE认证:留欧两年的海归,已然精通英.法.德三门外语:最厉害的一位应聘者,研究生阶段就在国际上首次提出了计算机和生物学的跨界理论--可怜我这个老实人在一开场还能装装,到了技术环节就忍不住提问基础知识,一下子把气氛从学术殿堂拉到建筑工地.不过就是这些最基础的问题,却常常把简历精

《大咖讲Wireshark网络分析》—从一道面试题开始说起

从一道面试题开始说起大咖讲Wireshark网络分析我每次当面试官,都要伪装成无所不知的大牛. 这当然是无奈的选择--现在每封简历都那么耀眼,不装一下简直镇不住场面.比如尚未毕业的本科生,早就拿下CCIE认证:留欧两年的海归,已然精通英.法.德三门外语:最厉害的一位应聘者,研究生阶段就在国际上首次提出了计算机和生物学的跨界理论--可怜我这个老实人在一开场还能装装,到了技术环节就忍不住提问基础知识,一下子把气氛从学术殿堂拉到建筑工地.不过就是这些最基础的问题,却常常把简历精英们难住.本文要介绍的便

一道面试题:布尔变量

FROM:酷壳 下面这篇文章是从StackOverflow来的.LZ面试的时候遇到了一道面试题:"如果有三个Bool型变量,请写出一程序得知其中有2个以上变量的值是true",于是LZ做了下面的这样的程序: boolean atLeastTwo(boolean a, boolean b, boolean c) { if ((a && b) || (b && c) || (a && c)) { return true; } else { r

mysql一道面试题

mysql> #一道面试题 mysql> #把一张表num 的值[20-30]之间的数全改为20 mysql> #并且把[30-40]之间的数全改为30 mysql> create table mianshi ( -> num int -> ); Query OK, 0 rows affected (1.94 sec) mysql> show tables; +----------------+ | Tables_in_test | +--------------