class A {
public String show(D obj){
return ("AD--Class A use func D");
}
public String show(A obj){
return ("AA--Class A use func A");
}
}
class B extends A{
public String show(B obj){
return ("BB--Class B use func B");
}
public String show(A obj){
return ("BA--Class B use func A");
}
}
class C extends B{}
class D extends B{}
public class LeeCode {
public static void main(String[] args) {
A a1 = new A();
A a2 = new B();
B b = new B();
C c = new C();
D d = new D();
//找A类中以B或者B的父类型为参数的方法,
System.out.println("1-->"+a1.show(b)); //AA--Class A use func A
//找A类中以C或者C的父类为参数的方法
System.out.println("2-->"+a1.show(c)); //AA--Class A use func A
//找A类中以D或者D的父类为参数的方法
System.out.println("3-->"+a1.show(d));//AD--Class A use func D
//a2是A类型的,要去找A类中以B或者B的父类为参数的方法,也就是show(A),
//但是子类中重写了父类的方法,所以就去看子类的方法
System.out.println("4-->"+a2.show(b));//BA--Class B use func A
//同上
System.out.println("5-->"+a2.show(c));//BA--Class B use func A
//找A类中以D或者D的父类为参数的方法
System.out.println("6-->"+a2.show(d));//AD--Class A use func D
//找B类中以B或者B的父类为参数的方法,
System.out.println("7-->"+b.show(b));//BB--Class B use func B
//找B类中以C或者C的父类为参数的方法
System.out.println("8-->"+b.show(c));//BB--Class B use func B
//因为B类继承了A类,所以B类包含了A类的方法,B类中有show(D),直接走那个方法
System.out.println("9-->"+b.show(d));//AD--Class A use func D
//可以直接找B类,B中以A或者A的父类为参数的方法
System.out.println("10-->"+d.show(a1));//BA--Class B use func A
//a2还是A类型的,找B中以A或者A的父类为参数的方法
System.out.println("11-->"+d.show(a2));//BA--Class B use func A
//找B中以B为参数的方法
System.out.println("12-->"+d.show(b));//BB--Class B use func B
//找B中以C或者C的父类为参数的方法
System.out.println("13-->"+d.show(c));//BB--Class B use func B
}
}
总结:
对于多态类型的A a2 = new B();对于a2的类型还是要看左边,如果方法没被重写就可以直接使用A类的方法,如果方法被重写了就去找子类的方法。