Java的多态和向上转型

那么什么是多态呢?

首先我们要知道多态性的三个必要满足的条件:

1.有继承(或实现接口)

2.有方法的重写

3.有父类引用指向子类对象(向上转型)

经典demo分析

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

        System.out.println("1--" + a1.show(b));
        System.out.println("2--" + a1.show(c));
        System.out.println("3--" + a1.show(d));
        System.out.println("4--" + a2.show(b));
        System.out.println("5--" + a2.show(c));
        System.out.println("6--" + a2.show(d));
        System.out.println("7--" + b.show(b));
        System.out.println("8--" + b.show(c));
        System.out.println("9--" + b.show(d));
    }
}
//结果:
//1--A and A
//2--A and A
//3--A and D
//4--B and A
//5--B and A
//6--A and D
//7--B and B
//8--B and B
//9--A and D

//能看懂这个结果么?先自分析一下。

回顾之前继承链中对象方法的调用的优先级

优先级1:this.方法名(参数)
优先级2:super.方法名(参数) 这一点是因为子类从父类继承了方法。
优先级3:this.方法名((super)参数)
优先级4:super.方法名((super)参数)
如果本方法被子类覆盖,则调用子类的方法

以第四个输出结果为例:这里有创建对象的多态,向上转型时,编译期时根据引用类型(左边)调用方法,而运行期是根据实例对象的类型(右边)调用方法。第一第二优先级都不满足,首先他满足第三优先级,但是被方法被重写,所以调用B类被重写的方法。

第六个:因为this代表的是A的对象。因为A类中偶对应的参数,满足第一优先级,所以输出为”A and D“

总结:事实上,当你使用向上转型的时候,你就使用了多态,多态是设计模式的基础。

你可能感兴趣的:(Java的多态和向上转型)