前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java方法的精确度

Java方法的精确度

作者头像
一觉睡到小时候
发布2019-07-03 17:34:18
4760
发布2019-07-03 17:34:18
举报
文章被收录于专栏:国产程序员国产程序员

在抖音上看到一道题,觉得挺有意思,以前也没仔细琢磨过,在这里跟大家分享一下。

代码语言:javascript
复制
public class TestObjectString {
    public void myMethod(String str){
        System.out.println("String");
    }
    public void myMethod(Object obj){
        System.out.println("Object");
    }

    public static void main(String[] args) {
        TestObjectString t =new TestObjectString();
            t.myMethod(null);
    }
}

咋一看,传递给方法的参数是一个空的对象引用,因此,初看起来,该程序好像应该调用参数类型为Object 的重载版本,

并且将打印出Object。另一方面,String也是引用类型,因此null 也可以应用于类型为String的重载版本。

你由此可能会得出结论:这个调用是模棱两可的,该程序应该不能编译。如果你试着去运行该程序,

就会发现这些直观感觉都是不对的:该程序打印的是String。 ava 的重载解析过程是以两阶段运行的。第一阶段选取所有可获得并且可应用的方法或构造器。第二阶段在第一阶段选取的方法或构造器中

选取最精确的一个。如果一个方法或构造器可以接受传递给另一个方法或构造器的任何参数,那么我们就说第一个方法比第二个方法缺乏精确性。

在我们的程序中,两个方法都是可获得并且可应用的。方法构造器myMethod(Object)可以接受任何传递给myMethod(String)的参数,

因此myMethod(Object)相对缺乏精确性。(每一个String都是一个Object,但是每一个Object 并不一定是一个String。)因此,

最精确的方法就是myMethod(String),这也就解释了为什么程序会产生这样的输出。如何想输出Object 你可以这样调用myMethod((Object)null).

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-04-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 国产程序员 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档