文章内容选自尚硅谷
方法重载的定义
在同一个类中,允许多个同名的方法,但是同名的方法必须要求其参数列表不同
遵循两同一不同的原则:
- 两同:类相同,方法名相同
- 一不同:参数列表不同(参数类型,参数个数)
代码如下
//如下的4个方法构成了重载
public void getSum(int i,int j){
System.out.println("1");
}
public void getSum(double d1,double d2){
System.out.println("2");
}
public void getSum(String s ,int i){
System.out.println("3");
}
public void getSum(int i,String s){
System.out.println("4");
}
//如下的3个方法不能与上述4个方法构成重载
// public int getSum(int i,int j){
// return 0;
// }
// public void getSum(int m,int n){
//
// }
// private void getSum(int i,int j){
//
// }
以第一个方法作为参照 ,前4个方法彼此构成了方法的重载,而后面三个注释掉的方法与第一个方法相比不是方法的重载.
方法重载的判断
严格遵循两同一不同的原则,前四个方法与第一个方法相比,其参数列表不同,后3个方法错在参数列表相同,与有无返回值,返回值类型,权限修饰符,形参的变量名无关.
重载时的自动类型提升
代码如下
package com.atguigu.java1;
/*
* 方法的重载(overload) loading...
*
* 1.定义:在同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或者参数类型不同即可。
*
* "两同一不同":同一个类、相同方法名
* 参数列表不同:参数个数不同,参数类型不同
*
* 2. 举例:
* Arrays类中重载的sort() / binarySearch()
*
* 3.判断是否是重载:
* 跟方法的权限修饰符、返回值类型、形参变量名、方法体都没有关系!
*
* 4. 在通过对象调用方法时,如何确定某一个指定的方法:
* 方法名 ---> 参数列表
*/
public class OverLoadTest {
public static void main(String[] args) {
OverLoadTest test = new OverLoadTest();
test.getSum(1,2);
}
//如下的4个方法构成了重载
public void getSum(int i,int j){
System.out.println("1");
}
public void getSum(double d1,double d2){
System.out.println("2");
}
public void getSum(String s ,int i){
System.out.println("3");
}
public void getSum(int i,String s){
System.out.println("4");
}
//如下的3个方法不能与上述4个方法构成重载
// public int getSum(int i,int j){
// return 0;
// }
// public void getSum(int m,int n){
//
// }
// private void getSum(int i,int j){
//
// }
}
参数列表为(1,2),默认int类型,采用方法1,输出结果为
1
如果把第一个方法注释掉,参数类型提升到double类型,此时采用的是方法2
输出结果为
2
可变个数的形参
可变个数的形参具有一些特点
- 其类型一般为:参数类型 … 变量名
- 在同一类中,可变个数形参的方法与其他方法依然可以构成重载
代码如下
package come.atguigu.java;
public class MethodArgsTest {
public static void main(String[] args) {
MethodArgsTest test = new MethodArgsTest();
test.show(12);
test.show("hello");
test.show("hello","world");
test.show(); //show()依然被传入可变个数形参列表中,当作参数个数为0的情况
}
public void show(int i){
}
public void show(String s){
System.out.println("show(String)");
}
public void show(String ...strs){
System.out.println("show(String ... strs)");
}
}
其运行结果为
show(String)
show(String … strs)
show(String … strs)
与String[] 的比较
在java8的环境中,如果同时有
public void show(String ...strs){
System.out.println("show(String ... strs)");
}
public void show(String[] strs){
}
//这两种方法,构不成方法的重载,编译器会将他们视作一种方法,报错。
采用String[]时,调用该方法时得采用
test.show(new String[]{"hello","world"});
采用
test.show("hello","world");
test.show();
会报错
故采用可变参数类型时,不用区new一个匿名对象,更为方便。两种方法本质上是一样的,只是表示法不一样,比如,在可变个数形参列表中,若要遍历每个参数,依然采用的是数组的方法。
package come.atguigu.java;
public class MethodArgsTest {
public static void main(String[] args) {
MethodArgsTest test = new MethodArgsTest();
test.show("hello");
test.show("hello","world");
// test.show();
// test.show(new String[]{"hello","world"});
test.show(new String[]{"aa","bb"});
}
public void show(String s){
System.out.println("show(String)");
}
public void show(String ...strs){
for(int i=0;i<strs.length;i++){
System.out.println(strs[i]);
}
System.out.println("show(String ... strs)");
}
// public void show(String[] strs){
//
//
// }
}
结果为
show(String)
hello
world
show(String … strs)
aa
bb
show(String … strs)
可变个数形参还必须要求
- 可变个数形参必须声明在参数的末尾
- 可变个数形参的声明在参数列表中只能有一个
// public void show(String ... strs,int i){
//
//
// }
//这样使用编译器会报错
综上,在使用可变个数形参时,采用参数类型…变量名的方法,相较于数组的方法,有更高的容错性和更高的效率,尽管他们本质上是一样的,但推荐使用类型…变量名的方法。