多态

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

你可能感兴趣的:(多态)