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