Java方法重载
1 什么是Java的方法重载
如果一个类具有名称相同但参数不同的多个方法,则称为“方法重载”。
如果我们只需要执行一个操作,则使用相同的方法名称可以提高程序的可读性。
假设您必须执行给定数字的加法运算,但是可以有任意数量的参数,如果你为两个参数编写方法,例如a(int,int),为三个参数编写b(int,int,int),则其他程序员可能很难理解该方法的行为,因为它们的名称不同。
因此,我们使用方法重载来实现方法的识别度(可读性)。
2 Java方法重载的优点
方法重载提高了程序的可读性。
3 Java方法重载的不同方式
有两种方法可以实现Java的方法重载:
- 通过更改参数数量
- 通过更改参数数据类型
注意:在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隐式提升为任何类型。
热门文章
优秀文章