由两道笔试题想到的

今天有网友在群里面发了两道让他“感觉要命”的笔试题,大意如下
题目一

public class Interview{
    public static void fn(String str){System.out.println("String");}
    public static void fn(Object o){System.out.println("Object");}
    public static void main(String[] args) {
        fn(null);
    }
}
请问结果是:
A.编译出错 B.运行出错 C.输出“String” D.输出 "Object"

这道题目可以说是老掉牙了,博主最初在某Java面试宝典上看到过的这道题目,后面在Java解惑中也看到过这道题目。显然这涉及了重载方法调用的选择的问题。JLS中关于方法重载的选择是这么说的:

The remainder of the process is split into three phases, to ensure compatibility with versions of the Java programming language prior to Java SE 5.0. The phases are:

  1. The first phase (§15.12.2.2) performs overload resolution without permitting boxing or unboxing conversion, or the use of variable arity method invocation. If no applicable method is found during this phase then processing continues to the second phase.
  2. The second phase (§15.12.2.3) performs overload resolution while allowing boxing and unboxing, but still precludes the use of variable arity method invocation. If no applicable method is found during this phase then processing
    continues to the third phase.
  3. The third phase (§15.12.2.4) allows overloading to be combined with variable arity methods, boxing, and unboxing.
    If several applicable methods have been identified during one of the three phases of applicability testing, then the most specific one is chosen, as specified in section

翻译过来就是:

1.第一阶段,不允许装拆箱转换,或者变长参数,如果找不到可用的方法则执行第二阶段
2.的二阶段,执行允许装拆箱转换的重载解析,但是不允许变长参数,如果找不到可用的方法则执行第三阶段
3.第三阶段,允许重载与变长参数方法,装拆箱相结合
4.如果在任意一个阶段标识出了若干可运用的方法,则选择最具体的一个。
显然 null既可以转化为 Object 也可以转化为 String类型,确切地说“The null reference can always be assigned or cast to any reference type ”。但是String类型比Object更加具体,所以匹配String类型的方法。即选择 C
当然如果要是匹配的多个方法中一样的精确,那么则会在编译时报错

如:

public class Interview{
    public static void fn(String str){
        System.out.println("String");
    }
    public static void fn(Object o){
        System.out.println("Object");
    }
    public static void fn(Integer i){
        System.out.println("Integer");
    }
    public static void main(String[] args) {
        fn(null);
    }
}

这时,三个函数在第一阶段都可以匹配,String与Integer都比Object要更加精确匹配,但是String与Integer无法区分那个更加精确,编译器就无法判断调用那哪个方法了,因此编译出错。


题目二

public class CompoundAssignment{
    public static void main(String[] args) {
            int x = 10;
            x += x -= x -= x;
           System.out.println("x="+x);
    }
}
输出结果为?

咋一看,结合顺序从右到左,所以应该是 x+= ( x-= ( x-=x ) ) 代入数值应该是 0 += (0 -= (10 -= 10)) 结果应该为 0
好吧,我们运行一下看看
结果:

x=20

什么?怎么是20?-_- 好吧,咱们又得翻一下JLS了。
在JLS中的Example 15.26.2-2.有这么一句话“Value Of Left-Hand Side Of Compound Assignment Is Saved Before Evaluation Of Right-Hand Side”,大意是“复合赋值左端的值是在右端计算之前保存的”,所以结果应该是 10 += (10 -= (10 -= 10)) 即 20
此外为了加深对这句话的理解,在此献上JLS中的例子

class Test{
    public static void main(String[] args) {
        int k = 1;
        k += (k = 4) * (k + 2);
        System.out.println("k = "+k);   
    }
}

您看结果是多少呢?

圉于博主的水平,理解可能有所偏差,还望各位大佬不吝指正!
参考:The Java Language Specification, Java SE 8 Edition

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容