📜  Java中的方法重载

📅  最后修改于: 2020-09-25 06:39:42             🧑  作者: Mango

Java中的方法重载

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

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

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

因此,我们执行方法重载以快速找出程序。

方法重载的优点

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

重载方法的不同方法

有两种方法可以重载Java中的方法

  • 通过改变参数数量
  • 通过更改数据类型

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

1)方法重载:更改编号论点

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

在此示例中,我们正在创建静态方法,因此我们无需为调用方法创建实例。

"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

2)方法重载:更改参数的数据类型

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

"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

问)为什么仅通过更改方法的返回类型无法重载方法?

在Java中,仅由于模棱两可,才可以通过更改方法的返回类型来实现方法重载。让我们看看歧义可能如何发生:

"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));//ambiguity  
}}  

输出:

Compile Time Error: method add(int,int) is already defined in class Adder

System.out.println(Adder.add(11,11));//这里,java如何确定应该调用哪个sum()方法?

注意:编译时错误比运行时错误要好。因此,如果您声明具有相同参数的相同方法,则Java编译器将呈现编译器时间错误。

我们可以重载java main()方法吗?

是的,通过方法重载。通过方法重载,一个类中可以具有任意数量的主要方法。但是JVM调用main()方法,该方法仅接收字符串数组作为参数。让我们看一个简单的例子:

"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[]

方法重载和类型提升

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

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

使用TypePromotion重载方法的示例

"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);//now second int literal will be promoted to long  
  obj.sum(20,20,20);  
    }  
}  

如果找到匹配项,则使用类型提升进行方法重载的示例

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

"class OverloadingCalculation2{  
  void sum(int a,int b){System.out.println("int arg method invoked");}  
  void sum(long a,long b){System.out.println("long arg method invoked");}  
    public static void main(String args[]){  
  OverloadingCalculation2 obj=new OverloadingCalculation2();  
  obj.sum(20,20);//now int arg sum() method gets invoked  
  }  
}  

在模棱两可的情况下使用类型提升的方法重载示例

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

"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);//now ambiguity  
  }  
}  

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