← 返回首页
JavaSE系列教程(二十七)
发表时间:2020-01-05 15:13:39
详解什么是多态?出现多态的三个条件

所谓多态(Polymorphism)是指同一种行为在不同的对象上有不同的表现形式。

1.什么是多态

多态是指同一种行为在不同的对象上有不同的表现形式。 比如: 动物都会叫,但是不同的动物有不同的叫声。

实现代码如下:

public class Animal {

    public void bark(){
        System.out.println("动物叫...");
    }
}

public class Cat extends Animal{


    @Override
    public void bark() {
        System.out.println("喵喵...");
    }
}

public class Dog extends Animal {

    @Override
    public void bark() {
        System.out.println("汪汪...");
    }
}

public class Duck extends Animal {

    @Override
    public void bark() {
        System.out.println("嘎嘎...");
    }
}

public class Test {

      public static void main(String[] args) {

        Animal c = new Cat();
        Animal d = new Dog();
        Animal duck = new Duck();

        c.bark();
        d.bark();
        duck.bark();
    }

}

运行结果:
喵喵...
汪汪...
嘎嘎...

生活中也经常出现多态性,比如: 同一道菜,不同的厨师有不同的做法。 同一道题,不同的学生有不同的解法。 同一首歌,不同的歌星唱出来味道不同。 同一件衣服,不同的人穿出来效果不同。 .... 正是因为有了多态性,我们的世界才变得如此丰富多彩。

2.出现多态的三个条件

1)有继承

2)有方法重写

3)父类引用指向子类对象

我们知道歌唱家都会唱歌。歌唱家又分为流行唱法歌唱家、民歌唱法歌唱家,美声唱法歌唱家。 周董为流行唱法歌唱家 宋祖英为民歌唱法歌唱家 毛阿敏为美声唱法歌唱家

以上三个歌星都会唱《传奇》这首歌。客户要听《传奇》这首歌,希望听到三种不同的唱法。请使用OOP的多态来描述该故事。

//歌手类
public class Singer {

    protected String name; //歌星的名字

    public Singer() {

    }

    public Singer(String name) {
        this.name = name;
    }

    protected void song(String songName) {
        System.out.println("我是" + this.name + ",正在演唱" + songName);
    }
}

//流行唱法歌星继承自歌星类,有继承
public class PopSinger extends Singer {

    public PopSinger(String name) {
        super(name);
    }
    //有方法重写
    @Override
    protected void song(String songName) {

        System.out.println("药药,切克闹...");
        super.song(songName);

    }
}

//民歌唱法歌星继承自歌星类,有继承
public class NationSinger extends Singer {

    public NationSinger(String name) {
        super(name);
    }
    //有方法重写
    @Override
    protected void song(String songName) {
        System.out.println("辣妹子辣,拉拉拉....");
        super.song(songName);
    }
}


//美声唱法歌星继承自歌星类,有继承
public class ArtSinger extends Singer {

    public ArtSinger(String name) {
        super(name);
    }
    //有方法重写
    @Override
    protected void song(String songName) {
        System.out.println("啊啊啊啊啊....");
        super.song(songName);
    }
}

//客户类
public class Customer {

    public void listenMusic(Singer singer,String songName){
        singer.song(songName); //一个父类的引用singer调用了子类对象的song方法。
    }
}

//测试类
public class Test {

    public static void main(String[] args) {
        Singer zhouDong = new PopSinger("周杰伦");
        Singer song = new NationSinger("宋祖英");
        Singer mao = new ArtSinger("毛阿敏");
        Customer c = new Customer();
        c.listenMusic(zhouDong,"传奇");
        c.listenMusic(song,"传奇");
        c.listenMusic(mao,"传奇");

    }
}

运行结果:
药药,切克闹...
我是周杰伦,正在演唱传奇
辣妹子辣,拉拉拉....
我是宋祖英,正在演唱传奇
啊啊啊啊啊....
我是毛阿敏,正在演唱传奇

小结:

1)封装、继承、多态是面向对象的三大特征,其中多态才是面向对象思想的精髓。理解了多态性才是真正理解面向对象的精髓。

2)所谓多态就是指同一种行为在不同的对象上有不同的表现形式。

3)出现多态性的三个条件:1.有继承 2.有方法重写 3.父类引用指向子类对象。

==注解:这里指的继承不仅仅是指子类,也可以是接口的实现类(接口的实现类也是一种变向的继承关系,以后章节详解探讨)==