Java重载时,存在多个匹配的方法该如何选择?
来源:互联网 发布:python appium 编辑:程序博客网 时间:2024/06/07 08:47
1)什么是重载?
方法名相同,参数列表不相同
2)为什么会出现多个匹配的方法呢?来看一个例子:
public class Demo5 { public static void main(String[] args) { //和test(Object obj)、test(String str)都能匹配 //会调用test(String str) test("abc"); //和test(Object obj)、test(String str)都能匹配 //会调用test(String str) test(null); } public static void test(Object obj){ System.out.println("obj"); } //之前我认为test(Object obj)和test(String str)不能重载,后来发现我错了。。。 public static void test(String str){ System.out.println("str"); }}
可见出现2个匹配方法的原因是:这2个方法的参数是父类和子类的关系。String类是Object类的子类。在调用test(“abc”)时,实参”abc”既能赋给test(Object obj)的形参abc,又能赋给test(String str)的形参str。那么,到底会调用哪个呢?答案是:调用test(String str)。
原因是:当实参能和2个方法的形参匹配时,可能有:一个方法的形参比较具体(子类,例如:示例中的String),另一个方法的形参比较抽象(父类,例如:示例中的Object)。会调用形参更具体的那个方法。
简而言之:String类是Object的子类,重载的时候按照子类的算。
3)基本类型与包装类型
public static void main(String[] args) throws Exception { //同print(int a),print(Integer a)这2个方法都匹配 //会选择print(int a)。就近原则,避免装箱过程 Test.print(1); //同print(int a),print(Integer a)这2个方法都匹配 //会选择print(Integer a)。就近原则,避免拆箱过程 Test.print(new Integer(1)); } class Test{ public static void print(int a){ System.out.println("int"); } public static void print(Integer a){ System.out.println("Integer"); } }
4)如果出现2个匹配的方法,但是无法确定选择哪个方法,这时候就会编译出错了。
public class Demo5 { public static void main(String[] args) { //和test(Object... obj)、test(String str)都能匹配 //编译出错 test(null); } public static void test(Object... obj){ System.out.println("obj"); } public static void test(String str){ System.out.println("str"); }}
5)最后再来看一个小例子
public class Demo5 { public static void main(String[] args) { test();//正常编译,只能匹配test(String... args)这个方法 test("a");//编译异常,因为2个方法都能精确匹配 } public static void test(String... args) { System.out.println("方法一"); } public static void test(String arg, String... args) { System.out.println("方法二"); }}
在上面的基础上稍作修改(把第1个test方法的参数类型由String…改为Object…),就能正常编译了:
public class Demo5 { public static void main(String[] args) { //能够正常编译,尽管2个test方法都能匹配,但是会选出最匹配的方法 //如果2个都匹配,选择更为具体的形参, //会选择test(String arg, String... args) test("a"); } public static void test(Object... args) { System.out.println("方法一"); } public static void test(String arg, String... args) { System.out.println("方法二"); }}
阅读全文
0 0
- Java重载时,存在多个匹配的方法该如何选择?
- 面对多个offer 该如何做出正确的选择
- java重载方法匹配的优先级
- 关于java重载(重载方法匹配优先级)
- java 重载 多个方法的调用顺序
- 存在多个系统临时表空间时,DB2如何选择?
- Java方法重载后的匹配规则的一个例子
- java关于重载带来的难题—方法匹配
- 找到了与该请求匹配的多个操作
- Java编程中在子类重载方法中调用父类中该方法时,该方法包含递归时出现的调用错误
- 元旦快乐,阖家团圆,幸福安康.C#重载示例(有问重载该如何选择?在C#中可很方便地在智能感知弹出中选择不同参数列表进行使用;不像C/C++那样,要记住编译器自动选择最佳匹配参数列表的概念)
- 关于Java重载方法匹配优先级
- Java中的重载方法之匹配优先级
- 我该如何存在?
- Qt中信号存在重载情况下的选择
- c#与java岔路该如何选择
- Python go java该如何选择
- 创建maven项目时的Archetype该如何选择?
- maven构建hibernate项目及其详解
- GCD功能介绍与实践
- Win10如何安装vs2015+cocos2d-x 3.9开发环境?安装配置教程分享
- 数组逆序
- 数据结构(第二天)单向循环链表的创建,插入元素,(删除、查询元素跟单链表操作基本一致)
- Java重载时,存在多个匹配的方法该如何选择?
- 矩阵的奇异值与特征值有什么相似之处与区别之处?
- Windows开发--控制程序运行单一进程
- 下半年的计划
- Github收藏之awesome-android-ui
- oracle中的decode的使用
- CentOS 6上编译安装LAMP
- SQL字段的被包含查询
- CodeForces 197D 搜索