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

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

面向对象建模----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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值