class A {
public String show(D obj) {
return ("A and D");
}
public String show(A obj) {
return ("A and A");
}
}
class B extends A{
public String show(B obj){
return ("B and B");
}
public String show(A obj){
return ("B and A");
}
}
class C extends B{
}
class D extends B{
}
public class Demo {
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();
//1.先找classA 把b传进去找B 没有show(B obj)方法 就调用show(A obj)方法 输出A and A
System.out.println("1--" + a1.show(b));
//2.先找classA 把c传进去找C 没有show(C obj)方法 就调用show(A obj)方法 输出A and A
System.out.println("2--" + a1.show(c));
//3.先找classA 把d传进去找D 发现有show(D obj)方法 就调用show(D obj)方法输出A and D
System.out.println("3--" + a1.show(d));
/*4.先找classA 把b传进去找B 发现没有show(B obj) 但是classB继承ClassA
classB的show(A obj)方法 重写了classA的show(A obj) 所以就输出
classB的show(A obj)方法 里面的B and A*/
System.out.println("4--" + a2.show(b));
/*5.先找classA 把c传进去找C 发现没有show(C obj) 但是classB继承ClassA
classB的show(A obj)方法 重写了classA的show(A obj)方法 所以就输出
classB的show(A obj)方法 里面的B and A*/
System.out.println("5--" + a2.show(c)); //B and A
/*6.先找classA 把d传进去找D 发现有show(D obj) (但是classB继承ClassA
而classB里面没有show(D obj) 所以ClassB里面的show方法不会
重写ClassA里面的方法) 所以就调用ClassA里面的show(D obj) 输出A and D */
System.out.println("6--" + a2.show(d));
/*7.先找classB 把b传进去找B 发现有show(B obj)方法(classB继承ClassA)
就调用ClassB里面的show(B obj) 输出B and B*/
System.out.println("7--" + b.show(b));
//8.先找classB 把c传进去找C 发现没有show(C obj)方法 (classB继承ClassA) 就调用ClassB里面的show(B obj) 输出B and B
System.out.println("8--" + b.show(c));
/*9.先找classB 把d传进去找D 发现classB没有show(D obj)方法
但是classB继承ClassA 而ClassA里面是有show(D obj)方法 所以classB
会继承ClassA里面是有show(D obj)方法 从而输出A and D*/
System.out.println("9--" + b.show(d));
}
}
面向对象 继承 多态经典案例
最新推荐文章于 2022-05-13 10:04:01 发布