java 重载匹配_关于Java重载方法匹配优先级
今天看到了一条这样的题目:
写出以下程序的输出:
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重载方法匹配优先级相关推荐
- java方法重载编程_学java教程之普通方法重载
学编程吧学java教程之普通方法重载发布了,欢迎通过xuebiancheng8.com来访问 先来看什么是普通方法重载呢,先来看一个例子 public class Person{ String use ...
- bigint对应java什么类型_「JAVA」从格式化输出到扫描输入,深究Java正则表达式匹配之道
字符串是不可变的 字符串是不可变的,也就是说当字符串的内容发生改变的时候,会创建一个新的String对象:但是如果内容没有发生改变的时候,String类的方法会返回原字符串对象的引用. 而正则表达式往 ...
- java skip函数_【Java必修课】图说Stream中的skip()和limit()方法及组合使用
1 简介 本文将讲解Java 8 Stream中的两个方法:skip()和limit().这两个方法是Stream很常用的,不仅各自会被高频使用,还可以组合出现,并能实现一些小功能,如subList和 ...
- java解析字符串_用Java解析字符串有哪些不同的方法?
用Java解析字符串有哪些不同的方法? 对于解析播放器命令,我最常使用split方法通过定界符对字符串进行分割,然后再通过一系列ifs或switches找出其余部分. Java中解析字符串的几种不同方 ...
- java matcher函数_在Java正则表达式中使用Matcher.end()方法
方法java.util.regex.Matcher.end()返回根据正则表达式从序列中匹配最后一个字符后的偏移值.此方法不需要任何参数.如果没有匹配发生,或者匹配操作失败,则抛出IllegalSta ...
- java 正则 空白字符_关于JAVA正则匹配空白字符的问题
今天遇到一个字符串,怎么匹配空格都不成功!!! 我把空格复制到test.properties文件 显示"\u3000" ,这是什么? 这是全角空格!!! 查了一下 \s ...
- java 子类 复制_关于java子类继承来的属性与方法究竟是完全复制还是共用使用...
关于java子类继承来的属性与方法究竟是完全复制还是共用使用 关于java子类继承来的属性与方法究竟是完全复制还是共用使用 今天在学习java的面向对象时,无意间发现一个问题. public clas ...
- java正则表达式 匹配()_学习Java正则表达式(匹配、替换、查找)
import java.util.ArrayList; import java.util.regex.Matcher; import java.util.regex.Pattern; public c ...
- java图片叠加_[原创]JAVA中图片上叠加文字的方法
--sunfruit JDK:1.3.x以上 功能:下面是一个简单在图片上面叠加文字的方法,有朋友如果有这方面的问题,就起个了解的作用 代码如下: import java.io.IOException ...
最新文章
- pcb成型板aoi检测_一种PCB板的AOI检测控制系统的制作方法
- 哪里可以找到python的免费教程-哪里有免费的python3教程啊?最好是有例子的视频教学...
- unity怪物攻击玩家减血_热血传奇:游戏里要千万小心的小怪,玩家稍有不慎就要吃大亏...
- qsort()函数详解
- 华为抢购助手_华为荣耀20系列手机采用的五项新科技,科普简介
- 微软应提前发布专用于ARM处理器的Windows 8平板电脑系统
- 频谱扩展 matlab,语音信号频谱扩展
- python mro文件_Python MRO
- Dart基础第4篇:运算符、条件判断、类型转换
- Storm实验 -- 单词计数2
- NBU备份数据库时的ORA-27211错误分析解决
- php有的图片显示不出来,图片显示不出来,但是数据库里有显示
- SPSS新手教程——进行距离分析的方法
- linux小红帽系统改时间,怎样更改linux小红帽系统时区由mst改成cst
- [解决方案]ios用fd抓包进app无网络
- 南通市城管局推动“数字化城管”向“智慧城管”升级
- linux 强制结束任务管理器,结束拒绝访问的进程 cmd下结束进程 强行结束进程
- 对移动社交类产品的追问
- 河南农信社数字化转型实践方案
- Java——图片格式转换