方法重载解析

一,什么叫方法重载?

        当两个或者多个方法名称相同,但参数类型或者个数不相同时,就说方法重载了。

编辑器只能通过方法名以及参数列表来确定调用哪个方法?

二,方法的重载匹配选择

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

重写 与 重载的区别

  • 重写是针对父类与子类间的方法,即必须先得继承父类的方法。而重载则没有这种限制。

  • 重写要求方法的 而方法重载则只需要 方法名相同,参数列表不同就行了。

  • 方法重载时,方法的调用是在编译时期就已经确定了调用那个方法;方法重写,则要在运行时,才能确定调用的是子类还是父类的方法。

Guess you like

Origin blog.csdn.net/Chen_leilei/article/details/121540554