java重载方法匹配的优先级

时间:2021-10-22 05:51:49

1.由于定义了同名的方法,不同参数列表导致的重载。
2.由于继承导致的重载:父类有非私有方法的方法A,子类又定义了同名的方法A,此时如果二者参数列表相同,会发生方法的重写(Override),此时调用子类对象的方法A只能是子类的方法,父类方法在子类中相当于不存在;如果二者参数列表不同,会发生重载(Overload),父类方法和子类方法同时存在于子类中,和单独在子类中定义重载方法效果一样,匹配的优先级也是相同的。
3.重载方法的优先级:
a.先匹配参数个数
b.参数类型的最佳匹配:直接所属类
c.如果没有找到直接所属类,会发生向上转型,直至找父类参数,直观上查找顺序为:包装类-》父类-》接口(不一定准确,《深入理解Java虚拟机》有更详细的描述)
d.如果向上转型仍无法匹配,则查找可变参数列表
e.以上无法匹配返回找不到方法错误。

参考示例:

public class OverloadTest {

    public static void main(String[] args) {

        A a = new A();
        B b = new B();
        C c = new C();

        a.show(c);
        b.show(b);
        b.show(c);
        c.show(a);
        c.show(b);
        c.show(new Integer(10));
    }

}

class A {
    public void show(B b) {
        System.out.println("b in A");
    }
}

class B extends A {
    public void show(A a) {
        System.out.println("a in B");
    }

    public void show(C... c) {
        System.out.println("c... in B");
    }

}

class C extends B {
    public void show(A a) {
        System.out.println("a in c");
    }

    public void show(C c) {
        System.out.println("c in c");
    }

    public void show(Object obj) {
        System.out.println("obj in c");
    }
}

结果输出:
b in A
b in A
b in A
a in c
b in A
obj in c