什么是方法重载?

方法重载是指一个类中存在多个名称相同但参数不同的方法。

使用相同的方法名可以增加程序的可读性,使代码更清晰易懂。

假设我们需要执行加法操作,但是参数的数量可以是任意的。如果我们为两个参数编写名为 add(int, int) 的方法,为三个参数编写名为 add(int, int, int) 的方法,那么对于您和其他程序员来说,可能很难理解这些方法的行为,因为它们的名称不同。

因此,通过方法重载,我们可以更快地找到程序中所需的方法。

方法重载的优点

方法重载可以增加程序的可读性,使代码更易于理解。

方法重载的不同方式

在 Java 中,方法重载有两种方式:

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

需要注意的是,在 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

Q) 为什么仅通过改变方法的返回类型是不可能实现方法重载的?

在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));
}}  

输出:

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() 方法吗?

是的,我们可以通过方法重载来创建多个main()方法。但是,JVM调用主类的main()方法,该方法必须接收一个字符串数组作为参数。下面是一个示例,演示如何在同一类中创建多个 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[]

方法重载和类型提升

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

java-type-promotion.png

如上图所示,byte 可以提升为 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);//现在第二个 int 文字将被提升为 long 
  obj.sum(20,20,20);  
  
  }  
}  

输出:

40
60

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

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

class OverloadingCalculation2{  
  void sum(int a,int b){System.out.println("调用 int arg 方法");}  
  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);//现在调用 int arg sum() 方法 
  }  
}  

输出:

调用 int arg 方法

在有歧义的情况下使用类型提升方法重载的示例

如果方法中没有匹配的类型参数,并且每个方法都提升相似数量的参数,就会出现歧义。

class OverloadingCalculation3{  
  void sum(int a,long b){System.out.println("a 方法被调用");}  
  void sum(long a,int b){System.out.println("b 方法被调用");}  
  
  public static void main(String args[]){  
  OverloadingCalculation3 obj=new OverloadingCalculation3();  
  obj.sum(20,20);//now ambiguity  
  }  
}  

输出:

Output:Compile Time Error

标签: java, Java面试题, Java下载, java教程, java技术, Java学习, Java学习教程, Java语言, Java开发, Java入门教程, Java进阶教程, Java高级教程, Java笔试题, Java编程思想