所谓多态(Polymorphism)是指同一种行为在不同的对象上有不同的表现形式。
多态是指同一种行为在不同的对象上有不同的表现形式。 比如: 动物都会叫,但是不同的动物有不同的叫声。
实现代码如下:
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();
}
}
运行结果:
喵喵...
汪汪...
嘎嘎...
生活中也经常出现多态性,比如: 同一道菜,不同的厨师有不同的做法。 同一道题,不同的学生有不同的解法。 同一首歌,不同的歌星唱出来味道不同。 同一件衣服,不同的人穿出来效果不同。 .... 正是因为有了多态性,我们的世界才变得如此丰富多彩。
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.父类引用指向子类对象。
==注解:这里指的继承不仅仅是指子类,也可以是接口的实现类(接口的实现类也是一种变向的继承关系,以后章节详解探讨)==