zoukankan      html  css  js  c++  java
  • 多态(polymorphism)

    多态指的是同一个方法调用,由于对象不同可能会有不同的行为。现实生活中,同一个方法,具体实现会完全不同。 比如:同样是调用人的“休息”方法,张三是睡觉,李四是旅游,高淇老师是敲代码,数学教授是做数学题; 同样是调用人“吃饭”的方法,中国人用筷子吃饭,英国人用刀叉吃饭,印度人用手吃饭。

          多态的要点:

          1. 多态是方法的多态,不是属性的多态(多态与属性无关)。

          2. 多态的存在要有3个必要条件:继承,方法重写,父类引用指向子类对象。

          3. 父类引用指向子类对象后,用该父类引用调用子类重写的方法,此时多态就出现了。

    【示例5-12】多态和类型转换测试

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    class Animal {
        public void shout() {
            System.out.println("叫了一声!");
        }
    }
    class Dog extends Animal {
        public void shout() {
            System.out.println("旺旺旺!");
        }
        public void seeDoor() {
            System.out.println("看门中....");
        }
    }
    class Cat extends Animal {
        public void shout() {
            System.out.println("喵喵喵喵!");
        }
    }
    public class TestPolym {
        public static void main(String[] args) {
            Animal a1 = new Cat(); // 向上可以自动转型
            //传的具体是哪一个类就调用哪一个类的方法。大大提高了程序的可扩展性。
            animalCry(a1);
            Animal a2 = new Dog();
            animalCry(a2);//a2为编译类型,Dog对象才是运行时类型。
             
            //编写程序时,如果想调用运行时类型的方法,只能进行强制类型转换。
            // 否则通不过编译器的检查。
            Dog dog = (Dog)a2;//向下需要强制类型转换
            dog.seeDoor();
        }
     
        // 有了多态,只需要让增加的这个类继承Animal类就可以了。
        static void animalCry(Animal a) {
            a.shout();
        }
     
        /* 如果没有多态,我们这里需要写很多重载的方法。
         * 每增加一种动物,就需要重载一种动物的喊叫方法。非常麻烦。
        static void animalCry(Dog d) {
            d.shout();
        }
        static void animalCry(Cat c) {
            c.shout();
        }*/
    }

          执行结果如图5-17所示:

    图5-17 示例5-12运行效果图.png

    图5-17 示例5-12运行效果图

          示例5-12给大家展示了多态最为多见的一种用法,即父类引用做方法的形参,实参可以是任意的子类对象,可以通过不同的子类对象实现不同的行为方式。

          由此,我们可以看出多态的主要优势是提高了代码的可扩展性,符合开闭原则。但是多态也有弊端,就是无法调用子类特有的功能,比如,我不能使用父类的引用变量调用Dog类特有的seeDoor()方法。

          那如果我们就想使用子类特有的功能行不行呢?行!这就是我们下一章节所讲的内容:对象的转型。

  • 相关阅读:
    Windows Server 2003 SP2(32位) 中文版 下载地址 光盘整合方法
    用Recycle()方法对Java对象的重要性
    Lotus中千奇百怪的 $$
    Developing a simple application using steps "User Decision" and "Mail"(1) 沧海
    沟通中的情绪管理(演讲稿) 沧海
    人只有在压力之下,才可能成功,没做一件事,都必须成功,不许言败 沧海
    什么是IDOC,以及IDOC的步骤 沧海
    VS2008 Professional Edition CHS中的deffactory.dat读取错误 沧海
    Including custom text in the step "User Decision" 沧海
    SAP Upgrade Strategy 沧海
  • 原文地址:https://www.cnblogs.com/huaxiansheng/p/15312399.html
Copyright © 2011-2022 走看看