多态

作者: 难觅的梦 | 来源:发表于2018-01-10 20:21 被阅读0次

    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{}

    -------------------------------------------------------------------------------------------------------------------------------------

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

            System.out.println(a1.show(c));  ② 

            System.out.println(a1.show(d));  ③ 

            System.out.println(a2.show(b));  ④ 

            System.out.println(a2.show(c));  ⑤ 

            System.out.println(a2.show(d));  ⑥ 

            System.out.println(b.show(b));    ⑦ 

            System.out.println(b.show(c));    ⑧ 

            System.out.println(b.show(d));    ⑨

    -------------------------------------------------------------------------------------------------------------------------------------------

    ① A and A

    ②  A and A

    ③  A and D

    ④  B and A

    ⑤  B and A

    ⑥  A and D

    ⑦  B and B

    ⑧  B and B

    ⑨  A and D

    -------------------------------------------------------------------------------------------------------------------------------------------

    这个例子非常的好,对理解多态,转型。作为一个初学者,我自己研究了很久,分享下研究结果,给还在迷茫的童鞋们

    解析:

    ①,②,③调用a1.show()方法,a1 属于A类,A类有两个方法show(D obj)和show(A obj)。①a1.show(b),参数b为A类的子类对象,这里为向上转型,相当于A obj=b;所以调用show(A obj)方法,得到A and A结果。②同理,③参数为d,调用show(D obj),得到A and D。

    ----------------------------------------------------------------------------------

    ④,⑤,⑥调用a2.show()方法,A a2 = new B();是向上转型,所以对a2方法的调用,使用A1类的方法show(D obj)和show(A obj),但此时show(A obj)已经被重写为return ("B and A"), ④a2.show(b),调用show(A obj),得到B and A。⑤同理,⑥调用show(D obj),得到A and D。

    A a2 = new B(); 

    栈中的引用变量是A,堆中的实例变量是B。

    将子类的实例,赋值给父类的引用。就是向上转型。

    向上转型,在运行时,会遗忘子类对象中与父类对象中不同的方法。也会覆盖与父类中相同的方法--重写。(方法名,参数都相同)

    所以a2,可以调用的方法就是,A中有的,但是B中没有的方法,和B中的重写A的方法。

    ------------------------------------------------------------------------------------

    ⑦,⑧,⑨调用b.show()方法,b为B类,B类的show方法有继承的show(D obj),自己的两个show(B obj)、show(A obj)。

    ⑦调用show(B obj),得到B and B,⑧向上转型,调用show(B obj),得到B and B⑨show(D obj),得到A and D

    相关文章

      网友评论

          本文标题:多态

          本文链接:https://www.haomeiwen.com/subject/iskanxtx.html