面向对象编程思想--多态实例分析

来源:互联网 发布:js中中jsonarray怎么用 编辑:程序博客网 时间:2024/06/07 03:54

某动物园有一饲养员小李,每天需要给他负责饲养的狮子,猴子,鸽子喂食,请用一个过程来模拟这个过程

面向对象建模----1

三个动物对应三个类,所以新建Linon,Monkey,Bird,每个类定义一个eat()方法,表示吃饲养员喂养的食物


面向对象建模---2

定义一个饲养员类Feeder,其name表示名字,在类中定义三个方法,feedLion, feedMonkey, feedBird,其参数为三种动物的引用


版本一:

Lion.java

public class Lion {    public void eat(){        System.out.println("Lion Eated");    }}

Bird.java

public class Bird {    public void eat(){        System.out.println("Bird Eated");    }}

Monkey.java

public class Monkey {    public void eat(){        System.out.println("Monkey Eated");    }}

Feeder.java

public class Feeder {    public String name;    public Feeder(String name){        this.name = name;    }    public void feedLion(Lion lion){        lion.eat();    }    public void feedMonkey(Monkey monkey){        monkey.eat();    }    public void feedBird(Bird bird){        bird.eat();    }}

TestFeed.java

public class TestFeed {    public static void main(String[] args) {        Feeder feeder = new Feeder("张三");        feeder.feedLion(new Lion());        for(int i = 0; i < 10; i++)            feeder.feedMonkey(new Monkey());        for(int i = 0; i < 5; i++)            feeder.feedBird(new Bird());    }}

版本一问题:

Lion,Monkey,Bird类中只有一个方法eat()

在Feeder中为Lion,Monkey,Bird均单独设一个方法,显得多余



版本二:

可以定义个抽象的Animal类,在其中定义一个抽象方法eet(),让三个子类继承,并且
实现该方法

Lion.java

public class Lion extends  Animal{    public void eat(){        System.out.println("Lion Eated");    }}

Monkey.java  Bird.java做类似修改,省略之。


Animal.java

public abstract  class Animal {    public abstract void eat();}

public class Feeder {    public String name;    public Feeder(String name){        this.name = name;    }    public void feedAnimal(Animal animal){        animal.eat();    }}

TestFeed.java

public class TestFeed {    public static void main(String[] args) {        Feeder feeder = new Feeder("张三");        feeder.feedAnimal(new Lion());        for(int i = 0; i < 5; i++)            feeder.feedAnimal(new Monkey());        for(int i = 0; i < 5; i++)            feeder.feedAnimal(new Bird());    }}



Feeder的三个喂养方法合并为一个feedAnimal()方法,它可以接收一个类型为Animal的参数,而不是三个具体的动物类型

依据多态特性,feedAnimal方法可以接收任意一个派生自Animal类的子类对象


版本三:

让feedAnimal()方法可以处理 喂食一群动物的 操作


Feeder.java

public class Feeder {    public String name;    public Feeder(String name){        this.name = name;    }    //喂食一群动物    public void feedAnimal(Animal[] animal){        for (int i = 0; i < animal.length; i++)            animal[i].eat();    }}
TestFeed.java

public class TestFeed {    public static void main(String[] args) {        Feeder feeder = new Feeder("张三");        Animal[] animals = new Animal[16];        animals[0] = new Lion();        for(int i = 0; i < 10; i++)            animals[i + 1] = new Monkey();        for(int i = 0; i < 5; i++)            animals[11 + i] = new Bird();        feeder.feedAnimal(animals);    }}
版本三的问题:Animal数组长度必须限定,所以无法动态的增删动物个数


版本四:

修改feedAnimal方法,让其接收一个元素数目可变的对象容器

Feeder.java

import java.util.Vector;public class Feeder {    public String name;    public Feeder(String name){        this.name = name;    }    //喂食一群动物    //Vector<T>JDK中提供的一个对象集合,可以随时向其中加入或者删除元素    public void feedAnimal(Vector<Animal> animals){       for(Animal an :animals)           an.eat();    }}

TestFeed.java

import java.util.Vector;public class TestFeed {    public static void main(String[] args) {        Feeder feeder = new Feeder("张三");        Vector<Animal> ans = new Vector<Animal>();        ans.add(new Lion());        for(int i = 0; i < 10; i++)            ans.add(new Monkey());        for(int i = 0; i < 5 ; i++)            ans.add(new Bird());        feeder.feedAnimal(ans);    }}

多态是面向对象的难点,很重要,多敲代码,多思考

以上例子来自:http://www.jinxuliang.com/resource/PPT/Show2/cbb41c18-24fc-4ec9-a358-37f99cc84650

感谢金旭亮老师。

0 0