1)什么是重载?
方法名相同,参数列表不相同
2)为什么会出现多个匹配的方法呢?来看一个例子:
public class Demo5 {
public static void main(String[] args) {
//和test(Object obj)、test(String str)都能匹配
//会调用test(String str)
test("abc");
//和test(Object obj)、test(String str)都能匹配
//会调用test(String str)
test(null);
}
public static void test(Object obj){
System.out.println("obj");
}
//之前我认为test(Object obj)和test(String str)不能重载,后来发现我错了。。。
public static void test(String str){
System.out.println("str");
}
}
可见出现2个匹配方法的原因是:这2个方法的参数是父类和子类的关系。String类是Object类的子类。在调用test(“abc”)时,实参”abc”既能赋给test(Object obj)的形参abc,又能赋给test(String str)的形参str。那么,到底会调用哪个呢?答案是:调用test(String str)。
原因是:当实参能和2个方法的形参匹配时,可能有:一个方法的形参比较具体(子类,例如:示例中的String),另一个方法的形参比较抽象(父类,例如:示例中的Object)。会调用形参更具体的那个方法。
简而言之:String类是Object的子类,重载的时候按照子类的算。
3)基本类型与包装类型
public static void main(String[] args) throws Exception {
//同print(int a),print(Integer a)这2个方法都匹配
//会选择print(int a)。就近原则,避免装箱过程
Test.print(1);
//同print(int a),print(Integer a)这2个方法都匹配
//会选择print(Integer a)。就近原则,避免拆箱过程
Test.print(new Integer(1));
}
class Test{
public static void print(int a){
System.out.println("int");
}
public static void print(Integer a){
System.out.println("Integer");
}
}
4)如果出现2个匹配的方法,但是无法确定选择哪个方法,这时候就会编译出错了。
public class Demo5 {
public static void main(String[] args) {
//和test(Object... obj)、test(String str)都能匹配
//编译出错
test(null);
}
public static void test(Object... obj){
System.out.println("obj");
}
public static void test(String str){
System.out.println("str");
}
}
5)最后再来看一个小例子
public class Demo5 {
public static void main(String[] args) {
test();//正常编译,只能匹配test(String... args)这个方法
test("a");//编译异常,因为2个方法都能精确匹配
}
public static void test(String... args) {
System.out.println("方法一");
}
public static void test(String arg, String... args) {
System.out.println("方法二");
}
}
在上面的基础上稍作修改(把第1个test方法的参数类型由String…改为Object…),就能正常编译了:
public class Demo5 {
public static void main(String[] args) {
//能够正常编译,尽管2个test方法都能匹配,但是会选出最匹配的方法
//如果2个都匹配,选择更为具体的形参,
//会选择test(String arg, String... args)
test("a");
}
public static void test(Object... args) {
System.out.println("方法一");
}
public static void test(String arg, String... args) {
System.out.println("方法二");
}
}