5.10 abstract类与多态

参考书籍: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());就可以了,这种开闭原则,使程序维护起来更加容易

猜你喜欢

转载自blog.csdn.net/weixin_42717928/article/details/81130041
今日推荐