题目:农场一头小母牛,每年生头小母牛,母牛5岁产母牛,20年上多少牛?

目的:1、考验初学者面向对象设计理念。2、考验初学者的逻辑思维能力以及计算能力。

注:不考虑其他现实中的逻辑,比如没有公牛怎么生母牛,这样的想法。就题论题,主要是用此案例了解面向对象的精髓。

思路:

1、首先想到的是创建一个Cow的母牛类。母牛至少有一个属性,那就是年龄,用年龄类判断后面生的小牛是否在当前年度具备了生小牛的能力。

2、其次会想到,创建一个birthCow或者produceCow的方法。这个方法到底放到Cow类中,还是新建一个农场Farm类,放到农场类中。答案是,都可以。

为了层次显示的更为清晰,本案例就把生产小母牛的方法,写在农场类中。

3、最后,写出核心代码:算法。

在birthCow(int years)运行后发现,报ConcurrentModificationException错了。思维逻辑没有问题,程序抛出了异常,不允许在for循环中修改被循环的对象。

根据报错原因,改装birthCow为:birthCow2(int years);(改装思路,不允许改变For循环的对象,那么我们就建一个临时对象)。

注:核心代码是Fram类中的birthCow(),birthCow2()是在此基础上改装的。birthCow()能看懂,birthCow2()就很容易看懂了。

4、具体实现代码,如下:

a)创建母牛类,一个年龄属性就够用了。

public class Cow {public int age;public Cow() {super();}public Cow(int age) {super();this.age = age;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}}

b)创建农场类,并提供生小母牛的方法。同时给农场初始化一头老母牛(年龄大于等于5就可以)。


//农场类
public class Farm {public static List <Cow> listCow=new ArrayList<Cow>();static {listCow.add(new Cow(5));//初始化一头具有生育能力的母牛}public Farm() {super();}//该方法报:java.util.ConcurrentModificationException//原因:系统不允许for循环的对象的同时,对对象进行修改。比如:给牛的年龄增加1public List <Cow> birthCow(int years) {for(int i=1;i<=years;i++) {//每循环一次,过滤一下具有生育能力的牛,让它生一头牛,且给所有已存在的牛年龄增加1for (Cow cow : listCow) {cow.setAge(cow.getAge()+1);//年龄+1if(cow.getAge()/5>=1) {listCow.add(new Cow(1));//生母牛一头}System.out.println("第"+i+"年牛的个数"+listCow.size());}}return listCow;}//改装后的方法public List <Cow> birthCow2(int years) {for(int i=1;i<=years;i++) {List <Cow> tempCows=new ArrayList<Cow>();//提供一个临时集合存放农场的牛int nowCount=0;//存放每年新生小母牛的数量//每循环一次,过滤一下具有生育能力的牛,让它生一头牛,且给所有已存在的牛年龄增加1for (Cow cow : listCow) {             cow.setAge(cow.getAge()+1);//原有奶牛的年龄+1tempCows.add(cow);if(cow.getAge()/5>=1) {tempCows.add(new Cow(1));//生母牛一头nowCount+=1;}}System.out.println("第"+i+"年原有牛个数:"+""+(tempCows.size()-nowCount)+" ;新增牛个数:"+nowCount+""+" ;牛的总个数:"+tempCows.size());listCow=tempCows;}return listCow;}}

c)创建带有main方法的测试类:MainTest

public class MainTest {public static void main(String[] args) {Farm farm=new Farm();int count=farm.birthCow(20).size();//int count=farm.birthCow2(20).size();System.out.println(count);}
}

特别提示:farm.birthCow2()是最终要的答案。

farm.birthCow是个引子,便于理解。

d1)farm.birthCow运行(报错)结果。

Exception in thread "main" 第1年牛的个数2
java.util.ConcurrentModificationExceptionat java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)at java.util.ArrayList$Itr.next(ArrayList.java:851)at com.xp.cow.model.Farm.birthCow(Farm.java:24)at com.xp.cow.model.MainTest.main(MainTest.java:6)

d2)改装后的farm.birthCow2的正确运行结果。

public class MainTest {public static void main(String[] args) {Farm farm=new Farm();//int count=farm.birthCow(20).size();int count=farm.birthCow2(20).size();System.out.println(count);}
}
第1年原有牛个数:1 ;新增牛个数:1 ;牛的总个数:2
第2年原有牛个数:2 ;新增牛个数:1 ;牛的总个数:3
第3年原有牛个数:3 ;新增牛个数:1 ;牛的总个数:4
第4年原有牛个数:4 ;新增牛个数:1 ;牛的总个数:5
第5年原有牛个数:5 ;新增牛个数:2 ;牛的总个数:7
第6年原有牛个数:7 ;新增牛个数:3 ;牛的总个数:10
第7年原有牛个数:10 ;新增牛个数:4 ;牛的总个数:14
第8年原有牛个数:14 ;新增牛个数:5 ;牛的总个数:19
第9年原有牛个数:19 ;新增牛个数:7 ;牛的总个数:26
第10年原有牛个数:26 ;新增牛个数:10 ;牛的总个数:36
第11年原有牛个数:36 ;新增牛个数:14 ;牛的总个数:50
第12年原有牛个数:50 ;新增牛个数:19 ;牛的总个数:69
第13年原有牛个数:69 ;新增牛个数:26 ;牛的总个数:95
第14年原有牛个数:95 ;新增牛个数:36 ;牛的总个数:131
第15年原有牛个数:131 ;新增牛个数:50 ;牛的总个数:181
第16年原有牛个数:181 ;新增牛个数:69 ;牛的总个数:250
第17年原有牛个数:250 ;新增牛个数:95 ;牛的总个数:345
第18年原有牛个数:345 ;新增牛个数:131 ;牛的总个数:476
第19年原有牛个数:476 ;新增牛个数:181 ;牛的总个数:657
第20年原有牛个数:657 ;新增牛个数:250 ;牛的总个数:907
907

答案:907

5、总结。

本案例是自己摸索,并改装的,然后对比网上提供的答案,大同小异。有的会把生母牛的方法拆分的更细,没有标准答案。

重要的是面向对象的设计思路,和正确的得数907.

java设计模式之—OO面向对象思维 Object Oriented(农场一头小母牛,每年生头小母牛,母牛5岁产母牛,20年上多少牛?)相关推荐

  1. Python编程基础:第三十九节 面向对象编程Object Oriented Programming

    第三十九节 面向对象编程Object Oriented Programming 前言 实践 前言 到目前为止我们都是函数式编程,也即将每一个功能块写为一个函数.其实还有一种更常用的编程方式被称为面向对 ...

  2. 农场有头大母牛,每年生头小母牛,小母牛五年后生小母牛,问20年后农场一共有多少头牛?(用面向对象的思想)

    笔试题 代码如下: package cn.edu.test;import java.util.ArrayList; import java.util.List;/*** 农场有头大母牛,每年生头小母牛 ...

  3. 【Java】有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?

    有一头母牛,它每年年初生一头小母牛.每头小母牛从第四个年头开始,每年年初也生一头小母牛.请编程实现在第n年的时候,共有多少头母牛? 输入 输入数据由多个测试实例组成,每个测试实例占一行,包括一个整数n ...

  4. python, 面向对象编程Object Oriented Programming(OOP)

    把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 面向过程的程序设计把计算机程序视为一系列的命令集合,即一组函数的顺序执行.为了简化程序设计,面向过程把函数继续切分为子函数,即把大块函数 ...

  5. 面向对象编程 object oriented programming(OOP)

    面向对象编程,是一种编程方式,这种编程方式需要使用"对象"来实现 对象的特征 世间万物皆对象 每个对象都是唯一的 对象具有属性和行为(对象的行为包括具有的功能及具体的实现) 对象具 ...

  6. 面向对象编程 object oriented programming(OOP)(第二篇)

    函数装饰器 对于某个函数,如果我们希望在不改变该函数代码的前提下,为该函数增加额外的功能,那么就可以使用装饰器来装饰该函数. 装饰器是一个函数,装饰器接收一个函数作为参数(传入的实参是被装饰的函数) ...

  7. BioPython ② | 面向对象编程Object Oriented Programming

    BioPython ② | Python面向对象编程 题目要求 定义分子类(Molecule)作为基类,包含集合elements和weight作为其属性,用初始化函数,将elements初始化为空集, ...

  8. SystemVerilog HVL:面向对象编程(Object Oriented Programming, OOP)

    目录 1. 封装 1.1. 构造函数 new 与句柄 1.2. 调用句柄 1.3. 静态属性 与 静态方法 1.4. 权限(local和protected) 2. 继承 2.1. 子类的构造函数 3. ...

  9. Java SE 008 理解面向对象程序设计 (Inside Object Oriented Programming)

    Java SE 008 理解面向对象程序设计 (Inside Object Oriented Programming) 前言:此笔记为圣思园张龙老师讲述的java视频课程笔记,自己看视频学习时记录的, ...

最新文章

  1. Spring mvc Data Redis—Pub/Sub(附Web项目源码)
  2. 云上人第七代产品简单的代码
  3. 使用字符代替圆角尖角研究(转)
  4. iOS开发日记4-第三方登录(ShareSDK)
  5. 【机器视觉】 close_measure算子
  6. 剑指Offer09. 用两个栈实现队列
  7. Linux驱动(3)--单片机驱动与Linux驱动的区别
  8. 视频当道的时代,这些珍藏的优质 Python 播客值得推荐
  9. 在微信小程序中打造 MQTT 连接测试工具
  10. 本地文件无法复制到VMware虚拟机
  11. MSOCache(转载)
  12. 记一次蛋疼的App 调用su 之旅
  13. 编程之美 2.1 求二进制中1的个数
  14. 如何实现受管控的安全文件传输MFT?
  15. ifconfig命令手册
  16. Linux实战教学笔记42:squid代理与缓存实践(一)
  17. 英语基础句型结构------起源
  18. 可满足性问题 SAT、3SAT
  19. X线DR医学图像 --- DR医用滤线栅及摩尔纹详解 (四) 摩尔纹的频点计算
  20. 【Windows】一款优秀的CMD替代软件-cmder

热门文章

  1. 系统分析与设计 选课系统
  2. 程序员怒怼外包公司HR:1万块钱还想招C语言开发,简直石乐志!
  3. 第十二届蓝桥杯D题 货物摆放
  4. erp沙盘采购总监的心得_erp沙盘模拟实验采购总监个人总结
  5. 微信有没有免费提现服务器,微信终于可以免费提现了,速领!
  6. android探索宇宙app,AR研学星系探索app
  7. 为特斯拉车主构思设计的一款刹车踩踏数据监测器
  8. 央行:居民购房意愿仍持续上升
  9. 一位Java老铁的经历分享
  10. HTML 媒体、表单和音视频笔记