经典Java多态例子

 看了一些多态的例子(下面的代码),也发一篇自己的总结给自己看,当然欢迎各位大神能给出自己的观点能让我们受益,废话不说了,上代码

 

public class A {
    public String show(D obj) {
        return ("A and D");
    }

    public String show(A obj) {
        System.out.println((this instanceof A) + "A this instanceof A");
        System.out.println((this instanceof B) + "A this instanceof B");
        return ("A and A");
    }


}

class B extends A{
    public String show(B obj){
        return ("B and B");
    }

    public String show(A obj){
        System.out.println((this instanceof A) + "B this instanceof A");
        System.out.println((this instanceof B) + "B this instanceof B");
        return ("B and A");
    }
}

class C extends B{

}

class D extends B{

}

class Test {
    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));
    }
}
输出结果
trueA this instanceof A
falseA this instanceof B
1--A and A
2--A and C
3--A and D
trueB this instanceof A
trueB this instanceof B
4--B and A
5--A and C
6--A and D
7--B and B
8--A and C
9--A and D

总结

1。超类引用变量引用子类对象的话,只能调用超类中存在的方法,且如果该方法被子类覆盖的话,则会执行子类的方法。
声明确定可以访问的方法;实例化确定具体访问的方法。

比如a2.show(b),a2是A类,所以在A中找方法去调用,找到了show(A a),B是A的子类,所以可以调用A的show(A a),同时B覆盖重写了show(A a)所以最终调用的是B的show(A a),为什么不是show(B b)呢?因为show(B b)没有在A中声明,没有在A中声明的方法是调用不了的。

2。按优先级顺序判断调用哪个方法:this.show(O)、super.show(O)、this.show((super)O)、super.show((super)O)。但超类必须有声明这个方法。如果子类覆盖了这个方法,就执行子类的,没有就执行超类的

比如第四点,a2.show(b),我在A和B的show(A a)方法里添加了输出,判断this是哪个的对象,结果可以判断出第四点,this是子类B的对象。B中声明了show(B b),但是A中没有声明show(B b),所以不能调用。B中还声明了show(A a),同时A中也有这个方法,所以最后调用的是B的show(A a)

下面是其他的一些文章的总结,主要是给我自己看的

概念(看别的文章说是从书里提出的,但不知道是哪本书,有知道的请告诉我一声,谢谢)

当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。

继承链中方法调用的优先级

在多态中方法的调用机制
1.不发生继承的类调用方法时,调用哪个就用哪个,如果发生了重载,那么,可以根据参数个数,类型,顺序判断到底调用了哪一个方法

2.当发生了继承关系,但是没有向上,向下转型时,子类对象调用的方法,要么是自身独有的,要么就是自身重写的,如果没有重写,那么也会直接调用父类的方法;而父类对象则只能调用自身的方法,而无法使用子类的方法。

3.如果发生了继承,并且有向上转型的对象,那就秉承着一个原则,即:编译看左边,运行看右边。

也就是说,首先看父类中这个被调用的方法在哪里,当父类中存在这个方法时,才可以调用,并且要继续看子类中是否重写了该方法,如果重写了,就调用重写后的方法。

总结:

当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法,但是它仍然要根据继承链中方法调用的优先级来确认方法,该优先级为:this.show(O)、super.show(O)、this.show((super)O)、super.show((super)O)。

this.show(O)本类中是否有该方法

super.show(O)本类的父类中是否有该方法

this.show((super)O)本类中是否有参数父类的方法(即现在参数的父类类型作为参数的方法)

super.show((super)O)本类的父类中是否有参数父类的方法
————————————————
版权声明:本文为CSDN博主「elice_」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/elice_/article/details/82888630

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值