Java教程-详解Java 重载

什么是方法重载?
方法重载是指一个类中存在多个名称相同但参数不同的方法。
使用相同的方法名可以增加程序的可读性,使代码更清晰易懂。
假设我们需要执行加法操作,但是参数的数量可以是任意的。如果我们为两个参数编写名为 add(int, int)
的方法,为三个参数编写名为 add(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
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[]
方法重载和类型提升
如果未找到匹配的数据类型,则一种类型将隐式提升为另一种类型。让我们通过下图来理解这个概念:
如上图所示,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