• 关于多态


      多态是面向对象的核心思想之一,多态的实现有三要素: 1、 存在继承 2、子类对父类的方法进行了重写 3、父类引用指向子类对象。

      前面说的还是有点虚,下面通过一个例子来深入理解多态。

      程序代码如下,给出对应的输出:

     1 public class Polymorphism {
     2     public static void main(String[] args) {
     3         A a1 = new A();
     4         A a2 = new B();
     5         B b = new B();
     6         C c = new C();
     7         D d = new D();
     8 
     9         a1.show(b);
    10         a1.show(c);
    11         a1.show(d);
    12         a2.show(b);
    13         a2.show(c);
    14         a2.show(d);
    15         b.show(b);
    16         b.show(c);
    17         b.show(d);
    18         b.show(a1);
    19         a1.show(a1);
    20         a2.show(a1);
    21     }
    22 }
    23 
    24 class A {
    25     public void show(A a) {
    26         System.out.println("A and A");
    27     }
    28 
    29     public void show(D d) {
    30         System.out.println("A and D");
    31     }
    32 }
    33 
    34 class B extends A {
    35     public void show(B b) {
    36         System.out.println("B and B");
    37     }
    38 
    39     public void show(A a) {
    40         System.out.println("B and A");
    41     }
    42 }
    43 
    44 class C extends B {
    45 }
    46 
    47 class D extends B {
    48 }
    Polymorphism

      下面我就来依次说说每一行的输出并给出为什么:

    1. 对于a1.show(b)  因为a1的类型是A,所以只能调用A中的show(A a)方法 ----> 输出是 A and A

    2. 对于a1.show(c) 理由同上 ------> 输出也是 A and A

    3. 对于a1.show(d),此时a1的类型是A,但是此时因为传入的参数是D类型的,所以此时调用的是show(D d)方法 ----> 输出是A and D

    4. 对于a2.show(b),此时a2是父类的引用指向子类的对象,虽然a2的实际类型是B,但是在方法调用上只能调用A的方法。所以此时调用的是A中的show(A a)方法,但是这时候又存在多态:A中的show(A a)在B中被重写了,所以此时实际调用的是B中的show(A a)方法。 -----> 输出是 B and A

    5. 对于a2.show(c).理由同上 -----> 输出是 B and A

    6. 对于a2.show(d).此时调用的是A中的show(D d)方法 ----->输出是 A and D

    7. 对于b.show(b). 此时b是B类型对象,此时应该调用B中的show(B b)方法 ------> 输出是 B and B

    8. 对于b.show(c). 理由同上 ------> 输出是 B and B

    9. 对于b.show(d).此时B是B类型的对象,父类是可以调用子类中的方法,在方法调用的时候,会去找最匹配的方法,发现A中的show(D d)最匹配。 -----> 输出时 A and D

    10. 对于b,show(a1). 此时最匹配的是B中的show(A a)方法 ------> 输出是 B and A

    11. 对于a1.show(a1). 不用想直接调用的是A中的show(A a)方法 -----> 输出是 A and A

    12. 对于a2.show(a1). 根据多态可得 ------> 输出是 B and A

    黎明前最黑暗,成功前最绝望!
  • 相关阅读:
    后CIO人如何规划职业生涯
    数据库设计三大范式应用实例剖析
    一个女孩从软件测试工程师到主管的成长
    一本适合测试初学者阅读的中文译著
    再看微软团队文化
    阳光的测试工作历程(转载)
    hdu 2795
    hdu 2426
    hdu 2255+hdu 3395
    hdu 3729
  • 原文地址:https://www.cnblogs.com/Kidezyq/p/5469882.html
Copyright © 2020-2023  润新知