Java方法重载

1 什么是Java的方法重载

如果一个类具有名称相同但参数不同的多个方法,则称为“方法重载”。

如果我们只需要执行一个操作,则使用相同的方法名称可以提高程序的可读性

假设您必须执行给定数字的加法运算,但是可以有任意数量的参数,如果你为两个参数编写方法,例如a(int,int),为三个参数编写b(int,int,int),则其他程序员可能很难理解该方法的行为,因为它们的名称不同。

因此,我们使用方法重载来实现方法的识别度(可读性)。

2 Java方法重载的优点

方法重载提高了程序的可读性。

3 Java方法重载的不同方式

有两种方法可以实现Java的方法重载:

  1. 通过更改参数数量
  2. 通过更改参数数据类型

注意:在Java中,仅通过更改方法的返回类型无法进行方法重载。

4 方法重载:更改参数数量

在下面示例中,我们创建了两个方法,第一个add() 方法实现两个数字的加法运算,第二个add方法执行三个数字的加法运算。

我们使用的是静态方法,因此我们直接调用方法,无需创建对象。

/**
 * 一点教程网 - http://www.yiidian.com
 */
class Adder{
    static int add(int a,int b){
        return a+b;
    }
    static int add(int a,int b,int c){
        return a+b+c;
    }
}
class TestOverloading1{
    public static void main(String[] args){
        System.out.println(Adder.add(11,11));
        System.out.println(Adder.add(11,11,11));
    }
} 

输出结果为:

22
33

5 方法重载:更改参数数据类型

在下面示例中,我们创建了两个数据类型不同的方法。第一个add方法接收两个整数参数,第二个add方法接收两个双精度参数。

/**
 * 一点教程网 - http://www.yiidian.com
 */
class Adder{
    static int add(int a, int b){
        return a+b;
    }
    static double add(double a, double b){
        return a+b;
    }
}
class TestOverloading2{
    public static void main(String[] args){
        System.out.println(Adder.add(11,11));
        System.out.println(Adder.add(12.3,12.6));
    }
}  

输出结果为:

22
24.9

6 为什么更改方法返回类型不能实现方法重载

在Java中,通过更改方法的返回类型是无法实现方法重载的,因为这样会导致方法调用产生歧义。让看看下面的示例就知道了:

/**
 * 一点教程网 - http://www.yiidian.com
 */
class Adder{
    static int add(int a,int b){
        return a+b;
    }
    static double add(int a,int b){
        return a+b;
    }
}
class TestOverloading3{
    public static void main(String[] args){
        System.out.println(Adder.add(11,11));//存在歧义,不知道到底调用哪个add方法?所以会编译报错
    }}

注意:编译时错误比运行时错误要好。因此,如果你声明具有相同参数的相同方法,则Java编译器将在编译时立即报错。

7 Java的main方法可以重载吗

答案是可以的!通过方法重载,一个类中可以具有任意数量的main方法。但是JVM只会调用参数为字符串数组类型的main() 方法。让我们看一个简单的例子:

/**
 * 一点教程网 - http://www.yiidian.com
 */
class TestOverloading4{
    public static void main(String[] args){
        System.out.println("main with String[]");
    }
    public static void main(String args){
        System.out.println("main with String");
    }
    public static void main(){
        System.out.println("main without args");
    }
}

输出结果为:

main with String[]

8 Java方法重载和类型提升

如果找不到匹配的数据类型,则将一种类型隐式提升为另一种类型。让我们通过下图了解概念:

如上图所示,byte类型可以提升为short,int,long,float或double。short数据类型可以提升为int,long,float或double。char数据类型可以提升为int,long,float或double等。

9 使用类型提升的方法重载示例1

/**
 * 一点教程网 - http://www.yiidian.com
 */
//类型自动提示的示例
class OverloadingCalculation1{
    void sum(int a,long b){
        System.out.println(a+b);
    }
    void sum(int a,int b,int c){
        System.out.println(a+b+c);
    }

    public static void main(String args[]){
        OverloadingCalculation1 obj=new OverloadingCalculation1();
        obj.sum(20,20);//第二个int参数将自动提示为long 
        obj.sum(20,20,20);

    }
}

输出结果为:

40
60

10 使用类型提升的方法重载示例2

如果方法中有匹配的类型实参,则不执行类型提升。

/**
 * 一点教程网 - http://www.yiidian.com
 */
//类型自动提示的示例
class OverloadingCalculation2{
    void sum(int a,int b){
        System.out.println("int参数的方法被执行...");
    }
    void sum(long a,long b){
        System.out.println("long参数的方法被执行...");
    }

    public static void main(String args[]){
        OverloadingCalculation2 obj=new OverloadingCalculation2();
        obj.sum(20,20);//第二个参数为int类型的sum方法将被调用
    }
}

输出结果为:

int参数的方法被执行...

11 使用类型提升的方法重载示例3

如果该方法中没有匹配的类型实参,并且每个方法都使用相似数量的实参,则将产生歧义。

/**
 * 一点教程网 - http://www.yiidian.com
 */
//类型自动提示的示例
class OverloadingCalculation3{
    void sum(int a,long b){System.out.println("a method invoked");}
    void sum(long a,int b){System.out.println("b method invoked");}

    public static void main(String args[]){
        OverloadingCalculation3 obj=new OverloadingCalculation3();
        obj.sum(20,20);//这行代码会编译报错,因为没有完全匹配的参数类型,并且参数数量一致,产生歧义!
    }
}  

以上代码会编译报错!
 

注意:不能隐式取消提升一种类型,例如,不能将double隐式提升为任何类型。

热门文章

优秀文章