在 同一个类 中,允许存在多个同名方法,只要它们的参数个数或者参数类型不同即可,这就叫方法重载。
格式为:修饰符 返回值类型 方法名(参数类型1 变量名称1,参数类型2 变量名称2,……….)
为什么要用方法重载呢?(以成员方法为例进行说明)
//定义一个求两个int类型数值之和的方法:
public int sumInt(int a,int b){};
//定义一个求两个double类型数值之和的方法:
public double sumDouble(double a,double b){};
//定义一个求三个int类型数值之和的方法:
public int sumIntThree(int a,int b,int c){};
上面定义方法的格式完成正确,但是从代码易读性及简洁性的角度考虑,都是求和用sum来统一命名不是更合理吗?调用方法的时候虽然方法名相同,但是参数类型或参数个数不同,虚拟机仍然可以识别不同的方法,完全不影响程序的正常运行。
所以,相同功能下的代码我们这么写:
public int sum(int a,int b){};
public double sum(double a,double b){};
public int sum(int a,int b,int c){};
判断是否为方法重载需注意三点:
1、方法重载与返回值类型无关
//定义一个无返回值类型的求和方法
public void sum(int a, int b){
System.out.println(a+b);
}
//定义一个返回值为int类型的求和方法
public int sum(int a,int b){
int sum = a+b;
return sum;
}
一个无返回值,一个返回值类型为int,但是对于虚拟机来说两个方法是同一个方法,因为方法调用时是通过类名调用,即sum(a,b),此时就无法判断到底调用的是void类型的sum方法,还是返回值为int类型的方法,此时会出现编译报错。
2、参数类型比较需一一对应,顺序不同即是参数类型不同
public static void sum(int a,double b){};
public static void sum(double a,int b){};
第一个方法先传入一个int类型的数值,再传入一个double类型的数值;第二个方法正好相反,所以这两个方法属于参数类型不同,为方法重载。
3、变量名称与方法重载无关
public int sum(int a,int b){};
public int sum(int x,int y){};
变量名称a,b,x,y可以为任意符合Java代码规则的标识符,所以以上代码在Java语法规则上是完全相同的两段代码,故不是方法重载。
总结: 我们在判断是否为方法重载时,第一看方法名称,相同再看参数类型和参数个数。