当前位置: 首页 > news >正文

java篇 类的进阶0x02:方法重载

文章目录

  • 方法重载 overload
    • 方法签名
        • 返回值不属于方法签名的原因:
    • 重载的参数匹配规则

方法重载 overload

多个方法功能很相似,但不完全一样,可以考虑使用方法的重载。

同一个类中,方法可以重名,但是签名不可以重复。一个类中如果定义了名字相同,签名不同的方法,就叫方法的重载。

方法签名

方法签名:方法名 + 依次参数类型。

  • 注意:
    • 返回值不属于方法签名。
    • 是依次的参数类型,参数名是没有影响的,只和参数的数据类型有关。比如 buy(String food, double weight)buy(String food, double price) 是同一个方法签名。
    • 参数类型的排列顺序如果调换了,就不是同一个方法签名,比如 buy(String food, double weight)buy(double weight, String food) 是两个不同的方法签名 。
  • 方法签名是一个方法在一个类中的唯一标识。

返回值不属于方法签名的原因:

因为调用方法时,只使用到方法名和参数,如果存在两个方法名和参数都类型相同,但返回值类型不同的方法,java就不知道到底是调用哪个方法。因此方法签名并不包括返回值。方法签名是 java 在调用方法时用来识别唯一方法的。

重载的方法可以调用别的重载方法,也可以调用别的不重载的方法。

public double buy(){return buy(1);          // 调用别的重载方法
}public double buy(int count){return buy(count,false);	// 像这里补充部分缺省的参数值(false),然后调用重载的方法,是重载的重要的使用场景。
}public double buy(int count, boolean isViIP){xxx;
}

重载的参数匹配规则

方法调用时,传入的参数实际上并不一定要和方法定义的形参的数据类型严格相同,只需要能实现自动类型转换即可。

// 类中方法
public double buy(double count){System.out.println("buying "+ count);
}// 调用
a.buy(3);   // int 可以自动转换为 double

重载方法的调用当然也是符合这个逻辑的,但会优先匹配参数类型与方法签名中形参类型一致的方法。

// 类中方法
public double buy(double count){System.out.println("buying "+ count);
}
public double buy(int count){System.out.println("buying "+ count + "!");
}// 调用
a.buy(3);   // 优先会调用 buy(int count)// 假如用 short 调用呢?
short ab = 3;
a.buy(ab);  // 优先还是会调用 buy(int count)

即自动类型转换的参数匹配,也会匹配自动类型转换(类型精度上)最近的那个类型。

byte、short、int、long、float、double

当然,是往右的最靠近,而不是往左边靠近。因为自动类型转换本来就只能往更大(/精度更高)的数据类型去自动转换。

并且,实际上虽然 java 支持这种规则,但程序员编写代码时尽量不要让这种情况出现(甚至故意这么做),因为即便 java 自己本身清楚怎么去调用,但程序员可能会被自己搞蒙掉。

带泛型类型参数的方法重载
若方法重载还涉及到形参为泛型的情况,优先级先找确定类型,按确定类型的参数类型匹配规则找,都找不到才会最后去调用形参为泛型的重载方法。
详见:泛型方法的重载问题(待更新)

http://www.lryc.cn/news/95731.html

相关文章:

  • Android11 相机拍照权限,以及解决resolveActivity返回null
  • MAXENT模型的生物多样性教程
  • CISA学习笔记-第一章、信息系统审计过程
  • 回调函数的使用:案例一:c语言简单信号与槽机制。
  • python matplotlib库 设置字体字号等
  • 【MySQL】SQL性能分析 (七)
  • 超越想象的GPT医疗 20230723
  • 【N32L40X】学习笔记03-gpio输出库
  • WebClient,HTTP Interface远程调用阿里云API
  • 飞书ChatGPT机器人 – 打造智能问答助手实现无障碍交流
  • React、Vue框架如何实现组件更新,原理是什么?
  • 常见面试题之设计模式--策略模式
  • redis多key问题
  • kafka第三课-可视化工具、生产环境问题总结以及性能优化
  • 2_Apollo4BlueLite中断控制器NVIC
  • WAIC2023:图像内容安全黑科技助力可信AI发展
  • 微信小程序quickstartFunctions中云函数的应用
  • Go学习 2、程序结构
  • SpringBoot整合JavaMail
  • Spring6——入门
  • 【计算机视觉 | 目标检测 | 图像分割】arxiv 计算机视觉关于目标检测和图像分割的学术速递(7 月 17 日论文合集)
  • 为什么需要GP(Global Platform)认证?
  • eclipse 格式化代码 快捷键
  • 深入探索Socks5代理与网络安全
  • 【NLP】如何使用Hugging-Face-Pipelines?
  • 网络安全(黑客)自学笔记
  • spring数据校验
  • 因材施教,有道发布“子曰”教育大模型,落地虚拟人口语教练等六大应用
  • golang waitgroup
  • 单列模式多学两遍