面向对象编程思想--多态实例分析
来源:互联网 发布: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
感谢金旭亮老师。
- 面向对象编程思想--多态实例分析
- 从实例面向对象的编程思想
- 基于结构;基于对象;面向对象;基于接口四种C++编程思想的实例分析
- 面向对象编程思想
- 面向对象编程思想
- 面向对象思想编程
- 面向对象编程思想
- 面向对象编程思想
- 面向对象编程思想
- 面向对象编程思想
- 面向对象编程思想
- 面向对象编程思想
- 面向对象思想编程
- 面向对象思想编程
- 面向对象编程思想
- 面向对象编程思想
- 【设计分享】一个面向对象思想的perl编程实例
- JAVA 编程思想之面向对象 生活实例理解
- CSAPP学习笔记——Fraction Binary Numbers
- 编写高效的C程序与C代码优化
- 怎样让函数返回数组
- asp.net(C#)利用QRCode生成二维码
- angularjs中常见错误
- 面向对象编程思想--多态实例分析
- Memcached常用命令及使用说明
- android 联系人数据库一些知识点
- linux系统安装IBM WebSphere Application Server(简称WAS)报错:JVM terminated. Exit code=1 ....
- kernel 中 sscanf和sprintf()函数使用说明
- Component Object Model
- Java处理验证码图片类问题:com.sun.image.codec.jpeg.JPEGCodec;等包报错
- 邻接矩阵无向图 之 Java详解
- 通过javascirptBridge与手机端进行交互