【Java编程教程】详解Java 重载
整理:Java面试那些事儿
如果一个类有多个名称相同但参数不同的方法,则称为方法重载。
如果我们只需要执行一个操作,使用相同的方法名可以增加程序的可读性。
因此,我们执行方法重载以快速找出程序。
# 方法重载的优点
方法重载增加了程序的可读性。
重载方法的不同方式
java中重载方法有两种方式
通过改变参数的数量
通过改变数据类型
在 Java 中,仅通过更改方法的返回类型是不可能实现方法重载的。
1)方法重载:改变参数的个数
在这个例子中,我们创建了两个方法,第一个 add() 方法执行两个数字的加法,第二个 add 方法执行三个数字的加法。
在这个例子中,我们正在创建静态方法,这样我们就不需要为调用方法创建实例。关注公众号Java面试那些事儿,获取651页Java面试题
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面试那些事儿,获取651页Java面试题,因此,如果您声明具有相同参数的相同方法,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[]
# 方法重载和类型提升
如果未找到匹配的数据类型,则一种类型将隐式提升为另一种类型。让我们通过下图来理解这个概念:
如上图所示,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 方法
在有歧义的情况下使用类型提升方法重载的示例
如果方法中没有匹配的类型参数,并且每个方法都提升相似数量的参数,就会出现歧义。关注公众号Java面试那些事儿,获取651页Java面试题
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
扫码进群记得备注:城市、昵称和技术方向。