面向对象:方法重载、重写、继承、多态,方法的参数类型匹配问题

点击查看代码
public class A {
    public String show(D obj) {//表示能够接收D类及D的子类对象
        return ("A and D");
    }

    public String show(A obj) { //表示能够接收A及A的子类对象
        return ("A and A");
    }

    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();

        System.out.println(a1.show(b)); // ①   A and A  //A and A A类中有show(D)以及show(A )方法,b是A的子类,是D的父类,b 是可以做为show(A)方法传入进去,故 A and A
        System.out.println(a1.show(c)); // ②  A and A  //实参c是B的子类,也是A的间接子 类,C和D是都继承自b,但show(D) 只能接收D及D的子类,因此只能调用show(A)方法,故 A and A
        System.out.println(a1.show(d));// ③   A and D  //实参d与show(D)方法参数最为 匹配,因此调用show(D)方法。java以就近的原则找最匹配的方法调用,故 A and D

        System.out.println(a2.show(b)); // ④  B and A  //声明的类型为A,new出来的类型为 B,在调用方法时(a2只能调用到A类中声明方法),但程序运行时会检查子类(new出来的对象)有没有重写该方 法,有则调用重写的方法,故 B and A
        System.out.println(a2.show(c));// ⑤  B and A  //与④同理,故 B and A
        System.out.println(a2.show(d));// ⑥  A and D  //实参d与A类中的show(D) 方法最 匹配,但new 出来的B没有重写show(D) 方法,因此调用A类中的show(D)方法,故 A and D

        //以下代码都是调用B类及B类所继承下来的方法
        System.out.println(b.show(b)); // ⑦  B and B  //因为实参b与B类中的show(B)方法 最匹配,故 B and B
        System.out.println(b.show(c)); // ⑧  B and B  //因为c是b的子类,c也是a的间接子 类,b类中有两个方法show(B),show(A) 都可以接收实参c,Java还是以就近的原则 (先找有没有C类型形参 的方法,没有就找C类弄形参的方法 C-->B--A),故 B and B
        System.out.println(b.show(d)); // ⑨  A and D  //因为B继承自A,把A类的show(D)方 法继承下来的,因此还以就近的原则找与实参d最匹配方法,就是show(D),故 A and D
    }

}

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 {
}
posted @ 2022-01-07 10:49  shark_zzz  阅读(31)  评论(0)    收藏  举报