Java:方法的重载

方法重载

为什么需要方法重载

在使用方法的过程中我们可能会遇到以下如同例子的情形:

java 复制代码
​
​
public class method1 {
    public static void main(String[] args) {
        int a1 = 10;
        int b1 = 20;
        double ret1 = add(a1, b1);
        System.out.println("ret1 = " + ret1);

        double a2 = 10.0;
        double b2 = 20.0;
        int ret2 = add(a2, b2);
        System.out.println("ret2 = " + ret2);
    }

    public static int add(int x, int y) {
        return x + y;
    }
}

​

​

在计算ret1时我们可以很容易得到结果,但在计算ret2时由于double转换到参数的int会有损失而报错,这里我们一般是再另外写一个方法,然后给两个方法起不同的名字:

java 复制代码
public class method2 {
    public static void main(String[] args) {
        int a1 = 10;
        int b1 = 20;
        int ret1 = addInt(a1, b1);
        System.out.println("ret1 = " + ret1);

        double a2 = 10.0;
        double b2 = 20.0;
        double ret2 = addDouble(a2, b2);
        System.out.println("ret2 = " + ret2);
    }

    public static int addInt(int x, int y) {
        return x + y;
    }

    public static double addDouble(double x, double y) {
        return x + y;
    }
}

​

这样做我们说确实能解决问题,但不友好的地方是:我们需要提供不同的方法名,如果方法一旦变多,给方法起名字显得非常地木乱,那是否能将这里所有表示相加的方法都命名为add呢?可以,这就涉及到了java的方法重载。

方法重载的概念

在自然语言中,一个词语如果有多重含义(就类似文言文的一词多义),那么就是说该词语被重载了,具体代表什么含义需要结合具体的场景。

在Java中如果多个方法的名字相同,参数列表不同,则称该几种方法被重载了。

举个栗子:

java 复制代码
public class method3 {
    public static void main(String[] args) {
        add(2,3);
        add(2,3,4);
        add(2.0, 3.0);
    }

    public static int add(int x, int y) {
        return x + y;
    }

    public static int add(int x, int y, int z) {
        return x + y + z;
    }

    public static double add(double x, double y) {
        return x + y;
    }
}

注意:1.方法名必须相同

2.参数列表必须不同(参数的个数不同,参数的类型不同,参数的顺序不同)。

3.与方法的返回类型无关(仅仅因为返回类型不同是无法构成重载的)

4.无需关心怎么选择调用哪个方法,编译器在编译的时候,会对实参进行推演,根据推演的结果来确定调用哪个方法。

方法签名

在同一个作用域中不能定义两个名字相同的变量,但为什么在同一个类中,能够使用相同名字的方法呢?这就用到了方法签名。

方法签名即:经过编译器修改过之后得到最终的名字。具体方式:方法路径名+参数列表+返回值类型,构成方法完整的名字。

如何查看呢?还是以上面的代码为例:

java 复制代码
public class method3 {
    public static void main(String[] args) {
        add(2,3);
        add(2,3,4);
        add(2.0, 3.0);
    }

    public static int add(int x, int y) {
        return x + y;
    }

    public static int add(int x, int y, int z) {
        return x + y + z;
    }

    public static double add(double x, double y) {
        return x + y;
    }
}

上述代码经过编译之后,然后使用JDK自带的javap反汇编工具查看,具体操作(可用cmd窗口):

1.先对工程进行编译生成.class字节码文件。

2.在控制台中进入到要查看的.class所在的目录

3.输入javap -v 字节码文件名字即可。

相关推荐
假客套3 分钟前
2025 FastExcel在Java的Maven项目的导出和导入,简单易上手,以下为完整示例
java·maven·fastexcel
有梦想的攻城狮4 分钟前
Maven中的settings.xml文件配置详解
xml·java·maven·settings.xml
APItesterCris12 分钟前
Node.js/Python 实战:编写一个淘宝商品数据采集器
大数据·开发语言·数据库·node.js
wearegogog12316 分钟前
液压位置控制源代码实现与解析(C语言+MATLAB联合方案)
java·c语言·matlab
余辉zmh29 分钟前
【C++篇】:LogStorm——基于多设计模式下的同步&异步高性能日志库项目
开发语言·c++·设计模式
艾莉丝努力练剑30 分钟前
【C++STL :list类 (二) 】list vs vector:终极对决与迭代器深度解析 && 揭秘list迭代器的陷阱与精髓
linux·开发语言·数据结构·c++·list
游坦之32 分钟前
基于Java Swing的智能数据结构可视化系统 | 支持自然语言交互的AI算法助手
java·数据结构·交互
王嘉俊92536 分钟前
设计模式--装饰器模式:动态扩展对象功能的优雅设计
java·设计模式·装饰器模式
循着风1 小时前
多种二分查找
java
努力也学不会java1 小时前
【Java并发】深入理解synchronized
java·开发语言·人工智能·juc