在java中同一个类中的2个或2个以上的方法可以有同一个名字,只要它们的参数声明不同即可。这种情况下,该方法就被称为重载,这个过程称为方法重载
public class OverloadDemo{
voidtest(){//test()方法第一次重载,没有参数
System.out.println("No parameters");
}
void test(inta){//test()方法第二次重载,一个整型参数
System.out.println("a: "+a);
}
void test(int a,intb){//test()方法第三次重载,两个整型参数
System.out.println("a and b: "+a+" "+b);
}
double test(doublea){//test()方法第四次重载,一个双精度型参数
System.out.println("double a: "+a);
returna*a;//返回a*a的值
}
}
public class Overload {
public static void main(String args[]){
OverloadDemo ob=new OverloadDemo();
double result;
ob.test();//定义的是test()方法
ob.test(10);//定义的是tes t(int a)方法
ob.test(10,20);//定义的是test(int a,intb)方法
result=ob.test(123.23);//定义的是test(doublea)方法
System.out.println("result of ob.test(123.23):"+result);//输出result的值
}
}
运行结果:No parameters
a: 10
a and b: 10 20
double a: 123.23
result of ob.test(123.23):15185.6329
当一个重载的方法被调用时,Java在调用方法的参数和方法的自变量之间寻找匹配。
这种匹配并不总是精确的 在一些情况下 java的自动类型转换也适用于重载方法的自变量
例如:
public class OverloadDemo{
void test(){
System.out.println("No parameters");
}
void test(int a,int b){
System.out.println("a and b: "+a+" "+b);
}
void test(double a){
System.out.println("Inside test(double) a: "+a);
}
}
public class Overload {
public static void main(String args[]){
OverloadDemo ob=new OverloadDemo();
int i=80;
ob.test();
ob.test(10,20);
ob.test(i);//因为没有定义test(int),在调用参数时没有找到和它匹配的方法,所以java自动将int转换为double类型。只有在找不到匹配的方法时,java的自动转换才其作用。
ob.test(123.23);
}
}
运行结果:No parameters
a and b: 10 20
Inside test(double) a: 80.0
Inside test(double) a: 123.23
例如:Java支持方法重载,所以求绝对值的方法只包含一个,abs()
public class Overload {
public static void main(String args[]){
double aa;
aa=java.lang.Math.abs(-11.11);
System.out.println("Abs is: "+aa);
}
}
运行结果:Abs is: 11.11
重载的价值在于它允许相关的方法可以使用同一个名字来访问,因此abs这个名字代表了它执行的通用动作。当你重载一个方法时,该方法的每个版本都能够执行你想要的任何动作。从风格上来说,方法重载还暗示了一种关系,例如用sqr这个名字创建一种方法,该方法返回一个整数的平方和一个浮点数值得平方根。但是这两种操作中功能上是不同的,这种应用方法就违背了方法重载的初衷。在实际编程中,应该只重载相互之间关系紧密的操作。