zoukankan      html  css  js  c++  java
  • 关于多态

      多态是面向对象的核心思想之一,多态的实现有三要素: 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

    黎明前最黑暗,成功前最绝望!
  • 相关阅读:
    Extjs Window用法详解 2 打印具体应用
    Extjs Window用法详解
    Ext.util.Format.date与Ext.Date.format区别, 转换时间戳
    Ext.util.Format.date 时间格式的设置与转换
    Singleton单例对象的使用
    C# Message类的属性Msg所关联的消息ID
    C#实现语音朗读功能
    iOS:二叉树多级表格的使用,使用三方库TreeTableView-master实现对json解析数据的递归遍历整理成树状结构
    iOS: 删除真机测试的Provisioning Profile后,在Code Singing中出现entitlements.plist文件无效,解决办法如下:
    iOS:Xcode7以上版本安装镜像文件.dmg
  • 原文地址:https://www.cnblogs.com/Kidezyq/p/5469882.html
Copyright © 2011-2022 走看看