我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java中为什么不同的返回类型不算方法重载

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java中为什么不同的返回类型不算方法重载

方法重载是指在同一个类中,定义了多个同名方法,但每个方法的参数类型或者是参数个数不同就是方法重载。 比如以下 4 个 method 方法就可以称之为方法重载,

如下代码所示:

public class OverloadExample {
    public void method() {
        // doSomething
    }
    public void method(String name) {
        // doSomething
    }
    public void method(Integer id) {
        // doSomething
    }
    public void method(Integer id, String name) {
        // doSomething
    }
}

为什么不同返回类型不算方法重载?

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

那为什么返回类型不能做为方法签名的一部分呢? 原因其实很简单,试想一下,如果方法的返回类型也作为方法签名的一部分,那么当程序员写了一个代码去调用“重载”的方法时,JVM 就不能分辨要调用哪个方法了,

如下代码所示:

public class OverloadExample {
    public static void main(String[] args) {
        OverloadExample example = new OverloadExample();
        example.method("磊哥"); // JVM 应该调用哪个方法?
    }
    public int method(String name) {
        // doSomething
        return 666;
    }
    public String method(String name) {
        // doSomething
        return "磊哥聊编程";
    }
}

像以上情况,JVM 就推断不出来要调用哪个方法了,所以方法的返回类型不能作为方法签名的一部分。

方法重载的使用场景

方法重载的经典使用场景是 String 类型的 valueOf 方法,valueOf 方法重载有 9 种实现,

如下图所示: 

 它可以将数组、对象和基础数据类型转换成字符串类型。

方法重载匹配原则

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

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 方法");
    }
    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... 方法");
    }
}

当出现方法重载时,程序要调用哪个方法呢?执行以上程序的执行结果如下: 

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

匹配原则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返回类型内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java中为什么不同的返回类型不算方法重载

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Java中为什么不同的返回类型不算方法重载

这篇文章主要介绍了Java中为什么不同的返回类型不算方法重载,方法重载是指在同一个类中,定义了多个同名方法,但每个方法的参数类型或者是参数个数不同就是方法重载,下文详细介绍,需要的小伙伴可以参考一下
2022-11-15

为什么不能根据返回类型区分重载?

重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类型进行区分?答:方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。重载发生在一个类中,同名的方法如果有不同
2023-06-03

为什么 Go 函数不能返回带有约束类型参数的类型?

为什么Go函数不能返回带有约束类型参数的类型?这是一个经常引发疑惑的问题。在Go语言中,函数的返回类型不能是带有约束类型参数的类型,这主要是由于Go语言对泛型的支持较为有限所导致的。在Go语言中,没有类似于Java或C#中的泛型机制,也没有
为什么 Go 函数不能返回带有约束类型参数的类型?
2024-02-09

java中使用BeanUtils.copyProperties方法对象复制同名字段类型不同赋值为空问题解析

项目场景: 对象之间的复制,dto对象中字段类型为String,model中字段类型为BigDecimal。使用BeanUtils.copyProperties方法进行对象批量复制。 问题描述 提示:这里描述项目中遇到的问题: 使用Spr
2023-08-17

vue开发中不同浏览器的类型判断方式是什么

这篇文章将为大家详细讲解有关vue开发中不同浏览器的类型判断方式是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、通过navigator.userAgent来进行浏览器类型判断定义和用法userAg
2023-06-29

Java中将接口返回的字节串转为文件的方法是什么

本篇内容主要讲解“Java中将接口返回的字节串转为文件的方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java中将接口返回的字节串转为文件的方法是什么”吧!讲一下现在的需求场景最近公司
2023-06-25

类型无法实现“X”,因为它具有非导出方法并且是在不同的包中定义的

php小编柚子,你好!关于实现"X"类型的问题,由于它具有非导出方法并且是在不同的包中定义的,所以无法直接实现。在PHP中,不同的包之间的方法和属性是无法直接访问的。如果要实现"X"类型,可以考虑使用接口或者继承来间接实现所需的功能。通过定
类型无法实现“X”,因为它具有非导出方法并且是在不同的包中定义的
2024-02-09

断言:模拟:我不知道要返回什么,因为方法调用是意外的 在 Go 中编写单元测试时出错

php小编小新在这篇文章中将为您介绍在Go语言中编写单元测试时出现的一种常见错误,即断言错误。当我们在编写单元测试时,有时会遇到无法确定返回值的情况,这会导致意外的方法调用错误。在本文中,我们将讨论这个问题的原因和解决方法,帮助您更好地处理
断言:模拟:我不知道要返回什么,因为方法调用是意外的 在 Go 中编写单元测试时出错
2024-02-10

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录