public class Test1 {
static class A{
public String run(D obj) {
return ("A & D");
}
public String run(A obj){
return ("A & A");
}
}
static class B extends A{
public String run(B obj) {
return ("B & B");
}
public String run(A obj){
return ("B & A");
}
}
static class C extends B {}
static class D extends B {}
static class E{
public static void main(String[] args) {
A aa = new A();
A ab = new B();
B b = new B();
C c = new C();
D d = new D();
System.out.println(aa.run(b)); //1, A & A
System.out.println(aa.run(c)); //2, A & A
System.out.println(aa.run(d)); //3, A & D
System.out.println(ab.run(b)); //4, B & A
System.out.println(ab.run(c)); //5, B & A
System.out.println(ab.run(d)); //6, A & D
System.out.println(b.run(b)); //7, B & B
System.out.println(b.run(c)); //8, B & B
System.out.println(b.run(d)); //9, A & D
}
}
}
java的override方法重写不关注左侧类型,只关注new的类型,调用的是new类型中的方法,也就是从子类方法开始向上寻找,参数类型同理