今天看到了一条这样的题目:

写出以下程序的输出:

public class Overload {

public static void say(long arg) {

System.out.println("hello long");

}

public static void say(Character arg) {

System.out.println("hello character");

}

public static void say(char... arg) {

System.out.println("hello char...");

}

// Serializable 参数

public static void say(Serializable arg) {

System.out.println("hello serializable");

}

public static void main(String[] args) {

say('a');

}

}

答案:

hello long

这条题目考的是重载方法匹配的优先级,那么它的匹配优先级是怎样的呢?

我们可以扩充一下这个程序,加入一些其他的参数,然后测试一下:

public class Overload {

// Object 参数

public static void say(Object arg) {

System.out.println("hello object");

}

// int 参数

public static void say(int arg) {

System.out.println("hello int");

}

// long 参数

public static void say(long arg) {

System.out.println("hello long");

}

// char 参数

public static void say(char arg) {

System.out.println("hello char");

}

// Character 参数

public static void say(Character arg) {

System.out.println("hello character");

}

// 变长参数

public static void say(char... arg) {

System.out.println("hello char...");

}

// Serializable 参数

public static void say(Serializable arg) {

System.out.println("hello serializable");

}

public static void main(String[] args) {

say('a');

}

}

如果直接运行的话,毫无疑问,输出为:

hello char

如果将char参数的函数注释之后,会输出什么呢?

答案是:hello int

因为这期间,字符a发生了一次自动转型,它除了能够表示字符a外,还能表示数字65,于是重载方法匹配了int参数的重载方法。

现在我们再将这个方法注释了,输出的结果大家应该知道是什么了吧?

那就是:hello long

原因就是int自动转型为long。其实还可以转化为float和double的,但不能转化为byte和short,因为char到这两个类型的转化是不安全的,这几个类型的转化优先级为:char->int->long->float->double。

好,我们再继续注释掉这个函数,然后输出是什么呢?

答案:hello character

为什么?大家应该知道Java里面为每种基本数据类型都提供一种封装类型吧?char对应的就是Character,所以调用函数期间,当找不到基本类型转化的匹配之后,char就会发生一次自动装箱,变成了Character类型。

根本停不下来啊,再继续注释了它,看下输出。

输出:hello serializable

这什么东西嘛。。。怎么会输出这个家伙啊。。。。原来是因为Character实现了Serializable接口,当它找不到匹配的类型之后,就会找它所实现的接口。但是,如果我们再增加一个重载函数:

public static void say(Comparable arg) {

System.out.println("hello Comparable");

}

那么就会报错了,

因为Character实现了Serializable和Comparable这两个接口,而接口匹配的优先级是一样的,编译器无法判断转型为哪种类型,提示类型模糊,拒绝编译。

好,继续注释掉Serializable参数的函数,看输出:hello object

接口找不到匹配之后,就会开始找匹配的父类,优先级是顺着继承链,由下往上进行匹配。

最后,连这个函数也注释了的话,大家应该知道输出的是什么了吧?

当然就是:hello char...

由此可见,变长参数的优先级是最低的。

java 重载匹配_关于Java重载方法匹配优先级相关推荐

  1. java方法重载编程_学java教程之普通方法重载

    学编程吧学java教程之普通方法重载发布了,欢迎通过xuebiancheng8.com来访问 先来看什么是普通方法重载呢,先来看一个例子 public class Person{ String use ...

  2. bigint对应java什么类型_「JAVA」从格式化输出到扫描输入,深究Java正则表达式匹配之道

    字符串是不可变的 字符串是不可变的,也就是说当字符串的内容发生改变的时候,会创建一个新的String对象:但是如果内容没有发生改变的时候,String类的方法会返回原字符串对象的引用. 而正则表达式往 ...

  3. java skip函数_【Java必修课】图说Stream中的skip()和limit()方法及组合使用

    1 简介 本文将讲解Java 8 Stream中的两个方法:skip()和limit().这两个方法是Stream很常用的,不仅各自会被高频使用,还可以组合出现,并能实现一些小功能,如subList和 ...

  4. java解析字符串_用Java解析字符串有哪些不同的方法?

    用Java解析字符串有哪些不同的方法? 对于解析播放器命令,我最常使用split方法通过定界符对字符串进行分割,然后再通过一系列ifs或switches找出其余部分. Java中解析字符串的几种不同方 ...

  5. java matcher函数_在Java正则表达式中使用Matcher.end()方法

    方法java.util.regex.Matcher.end()返回根据正则表达式从序列中匹配最后一个字符后的偏移值.此方法不需要任何参数.如果没有匹配发生,或者匹配操作失败,则抛出IllegalSta ...

  6. java 正则 空白字符_关于JAVA正则匹配空白字符的问题

    今天遇到一个字符串,怎么匹配空格都不成功!!! 我把空格复制到test.properties文件 显示"\u3000" ,这是什么? 这是全角空格!!! 查了一下    \s   ...

  7. java 子类 复制_关于java子类继承来的属性与方法究竟是完全复制还是共用使用...

    关于java子类继承来的属性与方法究竟是完全复制还是共用使用 关于java子类继承来的属性与方法究竟是完全复制还是共用使用 今天在学习java的面向对象时,无意间发现一个问题. public clas ...

  8. java正则表达式 匹配()_学习Java正则表达式(匹配、替换、查找)

    import java.util.ArrayList; import java.util.regex.Matcher; import java.util.regex.Pattern; public c ...

  9. java图片叠加_[原创]JAVA中图片上叠加文字的方法

    --sunfruit JDK:1.3.x以上 功能:下面是一个简单在图片上面叠加文字的方法,有朋友如果有这方面的问题,就起个了解的作用 代码如下: import java.io.IOException ...

最新文章

  1. pcb成型板aoi检测_一种PCB板的AOI检测控制系统的制作方法
  2. 哪里可以找到python的免费教程-哪里有免费的python3教程啊?最好是有例子的视频教学...
  3. unity怪物攻击玩家减血_热血传奇:游戏里要千万小心的小怪,玩家稍有不慎就要吃大亏...
  4. qsort()函数详解
  5. 华为抢购助手_华为荣耀20系列手机采用的五项新科技,科普简介
  6. 微软应提前发布专用于ARM处理器的Windows 8平板电脑系统
  7. 频谱扩展 matlab,语音信号频谱扩展
  8. python mro文件_Python MRO
  9. Dart基础第4篇:运算符、条件判断、类型转换
  10. Storm实验 -- 单词计数2
  11. NBU备份数据库时的ORA-27211错误分析解决
  12. php有的图片显示不出来,图片显示不出来,但是数据库里有显示
  13. SPSS新手教程——进行距离分析的方法
  14. linux小红帽系统改时间,怎样更改linux小红帽系统时区由mst改成cst
  15. [解决方案]ios用fd抓包进app无网络
  16. 南通市城管局推动“数字化城管”向“智慧城管”升级
  17. linux 强制结束任务管理器,结束拒绝访问的进程 cmd下结束进程 强行结束进程
  18. 对移动社交类产品的追问
  19. 河南农信社数字化转型实践方案
  20. Java——图片格式转换

热门文章

  1. studying and learning
  2. [翻译 EF Core in Action 2.3] 理解EF Core数据库查询
  3. 安装fail2ban
  4. UI音乐播放之入门篇AudioSerVicesPlay
  5. 寻虫记:BOM头制造的冤案,无故多出空白行
  6. python版本的快速排序
  7. 聊聊 | 他在Google Play安全奖励计划贡献榜单上排名第一
  8. Oracle_linux_lesson_p2
  9. RHEL7.0时间同步设置
  10. C++ 之父即将开始直播,请就位!