参考书籍:Java面向对象程序设计(第二版)--耿祥义 张跃平编著
使用多态进行程序设计的核心技术之一是使用上转型对象,即将Abstract类声明对象作为其子类的上转型对象,那么这个上转型对象就可以调用子类重写的方法
利用多态进行程序设计可以体现程序设计的“开闭”原则(有其他文章会详细解说这个原则)
当然,在程序设计好后,首先应当对abstract类的修改进行“关闭”,一旦修改Abstract类(比如,为它新增一个abstract方法),该abstract类的所有子类都要做出修改(因为继承抽象类要重写抽象类的方法)。
在程序设计好后,应当对增加Abstract的子类“开放”,即在程序增加abstract子类时,不用修改其他重要的类。
案例
要设计一个动物声音模拟器,模拟器可以模仿动物的叫声
Animal类
package lianxi3;
public abstract class Animal { //抽象类Animal
public abstract void cry(); //抽象方法:动物叫声
public abstract String getAnimalName(); //抽象方法:动物名字
}
//Animal的子类要实现这两个抽象非法,
// 即要给出具体的动物叫声和动物名字的方法体
Simulator 类
package lianxi3;
public class Simulator { //模拟器类Simulator
public void playSound(Animal animal){
System.out.println("现在播放"+animal.getAnimalName()+"类的声音");
animal.cry();
}
}
//playSound方法的参数是Animal类型,
// 显然animal可以是Animal的任何一个子类对象的上转型对象,
//也就是说这个animal可以调用Animal子类重写的cry()方法
Dog类
package lianxi3;
public class Dog extends Animal{
public void cry(){
System.out.println("汪汪");
}
public String getAnimalName(){
return "狗";
}
}
//抽象类的子类,要重写Animal的抽象方法
Cat类
package lianxi3;
public class Cat extends Animal{
public void cry(){
System.out.println("喵喵");
}
public String getAnimalName(){
return "猫";
}
}
//抽象类的子类,要重写Animal的抽象方法
主类
package lianxi3;
public class Lianxi3 {
public static void main(String args[]){
Simulator simulator = new Simulator();
simulator.playSound(new Dog());
simulator.playSound(new Cat());
}
}
//最后两个就是把子类的引用放到父类里面
//就是Animal animal = new Dog();
//animal是上转型对象
结语
如果在增加一个java源文件(对拓展开放),该源文件有一个Animal的子类Tiger(负责老虎声音),那么Simulator 类不要修改,只要在主类加 simulator.playSound(new Tiger());就可以了,这种开闭原则,使程序维护起来更加容易