java重载方法的返回类型必须一致,java 重载 返回类型

  java重载方法的返回类型必须一致,java 重载 返回类型

  00-1010为什么不同的返回类型不算方法重载?方法重载的使用场景方法重载匹配原则匹配原则1:精确类型匹配原则2:基本类型自动转换为更大的基本类型匹配原则3:自动打包/解包匹配原则4:按继承路径升序的匹配原则5:可变参数匹配摘要方法重载是指在同一个类中定义了多个同名的方法,但每个方法都重载了不同的参数类型或数目。例如,以下四种方法可以称为方法重载,

  如下代码所示:

  public class overload example { public void method(){//do something } public void method(String name){//do something } public void method(Integer id,String name) { //doSomething }}

  00-1010回答这个问题,首先要对前置内容,方法签名有所了解。方法签名是一个唯一值,由以下几个部分组成:方法名称 + 参数类型 + 参数个数,而这个唯一值就是方法签名,而 JVM(Java 虚拟机)就是通过这个方法签名来决定调用哪个方法的.从方法签名的组成规则中我们可以看出,一个方法的返回类型并不是方法签名的组成部分,所以当同一个类中出现多个方法名称和参数相同但返回值类型不同的方法时,JVM无法通过方法签名判断调用哪个方法,如下图所示:.

  那为什么返回类型不能是方法签名的一部分呢?其实原因很简单。想象一下,如果方法的返回类型也是方法签名的一部分,那么当程序员编写代码调用“重载”的方法时,JVM无法判断要调用哪个方法。

  如下代码所示:

  public class overload example { public static void main(String[]args){ overload example example=new overload example();Example.method(“格雷”);JVM应该调用哪个方法?} public int method(String name){//do something return 666;} public string method(string name){//做点什么返回‘格雷聊天编程’;}}和上面的情况一样,JVM无法推断调用哪个方法,所以方法的返回类型不能作为方法签名的一部分。

  00-1010方法重载的经典使用场景是字符串类型valueOf方法,它有9个实现。

  如下图所示:

  它可以将数组、对象和底层数据类型转换为字符串类型。

  

目录

方法重载的调用顺序是有前后之分的,比如以下代码:

 

  public class overload example { public static void main(String[]args){ overload example example=new overload example();示例方法(12);} public void method(int num){ system . out . println( call int method );} public void method(longnum){ system . out . println(调用long method );} public void method(Integer num){ system . out . println(调用整数方法);}公共无效方法

  d(Object num) { System.out.println("调用 Object 方法"); } public void method(int... num) { // 可选参数 System.out.println("调用 int... 方法"); }}当出现方法重载时,程序要调用哪个方法呢?执行以上程序的执行结果如下:

  

 

  因此我们可以得出以下结论。

  

 

  

匹配原则1:精准类型匹配

方法重载会优先调用和方法参数类型一模一样的方法,这是第一优先匹配原则:精准类型匹配

 

  

 

  

匹配原则2:基本类型自动转换成更大的基本类型

接下来我们把精准匹配方法删掉,观察一下第二匹配顺序是什么?

 

  实现代码如下:

  

public class OverloadExample { public static void main(String[] args) { OverloadExample example = new OverloadExample(); example.method(12); } public void method(long num) { System.out.println("调用 long 方法"); } public void method(Integer num) { System.out.println("调用 Integer 方法"); } public void method(Object num) { System.out.println("调用 Object 方法"); } public void method(int... num) { // 可选参数 System.out.println("调用 int... 方法"); }}

以上程序的执行结果如下图所示:

 

  

 

  因此我们可以得出结论:如果是基本数据类型,那么方法重载调用的第二匹配原则是自动转换成更大的基本数据类型

  

 

  

匹配原则3:自动装/拆箱匹配

接下来将第二匹配原则中的 long 方法也删除掉,实现代码如下:

 

  

public class OverloadExample { public static void main(String[] args) { OverloadExample example = new OverloadExample(); example.method(12); } public void method(Integer num) { System.out.println("调用 Integer 方法"); } public void method(Object num) { System.out.println("调用 Object 方法"); } public void method(int... num) { // 可选参数 System.out.println("调用 int... 方法"); }}

以上程序的执行结果如下图所示:

 

  

 

  从上述执行结果可以看出,方法重载的第三匹配原则是,匹配自动装箱或拆箱的数据类型

  

 

  

匹配原则4:按照继承路线依次向上匹配

此时将第三匹配原则中的 Integer 方法删除,剩下代码如下:

 

  

public class OverloadExample { public static void main(String[] args) { OverloadExample example = new OverloadExample(); example.method(12); } public void method(Object num) { System.out.println("调用 Object 方法"); } public void method(int... num) { // 可选参数 System.out.println("调用 int... 方法"); }}

以上程序的执行结果如下图所示:

 

  

 

  从上述执行结果可以看出,方法重载的第四匹配原则是,依次向上匹配父类的方法调用

  

 

  

匹配原则5:可变参数匹配

最后将代码中的方法删除的只剩一个可选参数,实现代码如下:

 

  

public class OverloadExample { public static void main(String[] args) { OverloadExample example = new OverloadExample(); example.method(12); } public void method(int... num) { // 可选参数 System.out.println("调用 int... 方法"); }}

以上程序的执行结果如下图所示:

 

  

 

  从上述执行结果可以看出,方法重载的第五匹配原则是,匹配可选参数。

  

 

  

总结

在同一个类中定义了多个同名方法,但每个方法的参数类型或者是参数个数不同就是方法重载。方法重载的典型使用场景是 String 中的 valueOf 方法,它有 9 种实现。方法返回类型不能作为方法重载的依据,因为它不是方法签名的组成部分。方法重载有 5 个匹配原则:精准匹配、基本类型自动转换成更大的基本类型匹配、自动装/拆箱匹配、按照继承路线依次向上匹配、可变参数匹配。

 

  到此这篇关于Java中为什么不同的返回类型不算方法重载的文章就介绍到这了,更多相关Java返回类型内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: