一,什么叫方法重载?
当两个或者多个方法名称相同,但参数类型或者个数不相同时,就说方法重载了。
编辑器只能通过方法名以及参数列表来确定调用哪个方法?
二,方法的重载匹配选择
1.基本类型的重载
public static void main(String[] args) {
short s = 4;
m(s);
}
public static void m(int x){//方法一
System.out.println("重载方法一");
}
public static void m(float x){//方法二
System.out.println("重载方法二");
}
结果是 重载方法一,short类型可以默认自动转换成int类型。float类型,但是m(s)真正匹配的是m(int x) 所以基本类型的匹配规则是如果没有匹配到精确类型的形参,则优先匹配存储长度大于且最接近实参存储长度的形参。
2.引用类型的重载
public class Test_3 {
public static void main(String[] args) {
Children children = new Children();
someMethod(children);
}
public static void someMethod(Ancestor an) {//重载方法1
System.out.println("this is Ancestor Method!");
}
public static void someMethod(Parent an) {//重载方法2
System.out.println("this is Parent Method!");
}
}
//3个具有继承关系的类
class Ancestor{//祖先类
}
class Parent extends Ancestor{//父类,继承于Ancestor
}
class Children extends Parent{//子类,继承于Parent
}
结果是:this is Parent Method! 引用类型与基本类型一样,都是选择”最明确的方法“, 引用类型间选择最明确的重载方法的规则是: 如果找不到重载方法的形参的引用类型与实参一致,则实参优先匹配 在继承树结构上,离实参类型最近的形参
3.自动拆箱装箱 可变参数类型
public class Test_3 {
public static void main(String[] args) {
short s = 5;
overloadMethod(s);// test1
Integer i = 10;
overloadMethod(i);//test2
overloadMethod(s,s);//test3
}
public static void overloadMethod(int a) { //m1
System.out.println("调用 overloadMethod(int)");
}
public static void overloadMethod(Short in) {//m2
System.out.println("调用 overloadMethod(short)");
}
public static void overloadMethod(int a,int b) {//m3
System.out.println("调用 overloadMethod(int,int)");
}
public static void overloadMethod(short... s) { //m4
System.out.println("调用 overloadMethod(short...)");
}
public static void overloadMethod(Integer... i) {//m5
System.out.println("调用 overloadMethod(Integer...)");
}
}
最后的结果是 调用 overloadMethod(int),调用 overloadMethod(int),调用 overloadMethod(int,int)
这几种形参匹配规则还是有顺序的:
-
先按照实参的类型(基本类型或引用类型)对应匹配规则,进行查找最相近的形参列表,从而找到最明确的重载方法;找不到,则执行第二步;
-
对实参进行装箱或拆箱转换(前提是实参是基本类型或者是包装类),再安按照转换得到的类型进行匹配形参的类型(形参类型与转换类型要一致,特别注意基本类型);找不到,则执行第三步;
-
匹配形参是可变参数的重载方法,此时,形参的类型可以是 实参的类型以及通过 基本类型的短转长、自动装箱拆箱、祖先类型 得到的转换类型。
当前类型(基本类型或引用类型)的匹配规则 > 自动装箱拆箱 > 可变参数列表
4.泛型方法的重载
泛型方法的重载规则: 将泛型方法的类型变量擦除,然后与非泛型方法一样,按照上面所说的三种规则一一匹配
public static void main(String[] args) {
//创建Runnable对象
Runnable r = new Runnable() { public void run(){} };
//调用泛型方法
m(r);
}
public static <T> void m(T t) {//m1
System.out.println("调用了<T> void m(T)");
}
public static <T extends Runnable> void m(T t) {//m2
System.out.println("调用了<T extends Runnable> void m(T t)");
}
运行结果是调用了 调用了<T extends Runnable> void m(T t)
擦除后两个方法 第一个是object ,第二个是Runnable
重写 与 重载的区别
-
重写是针对父类与子类间的方法,即必须先得继承父类的方法。而重载则没有这种限制。
-
重写要求方法的 而方法重载则只需要 方法名相同,参数列表不同就行了。
-
方法重载时,方法的调用是在编译时期就已经确定了调用那个方法;方法重写,则要在运行时,才能确定调用的是子类还是父类的方法。