问题:
农场一头小母牛,
每牛每年生母牛;
母牛5岁产母牛,
20年后多少牛?
解决思路:
既然是利用面向对象的思路来对这道题目进行解决,那么我们首先应该想到的就是面向对象的特点:继承、多态和封装。
利用JAVA来对这道问题进行解决,首先要考虑的就是应该建立的类都有什么。在这里可以建立起两个类,一是母牛类,二是牧场类。农场类里面包含成年母牛和未成年母牛两个母牛类对象的集合。牧场有牧场年龄,随着年龄增长小母牛逐渐长大,而已经成年的 母牛则会生出新的小母牛。牧场类可以读取总的母牛数,其中包括了所有的小母牛和成年母牛。
具体实现:
创建类:母牛类(Cow())、牧场类(Pasture())
类属性:母牛类——年龄(age) 牧场类——oldCows群体(age>=5)、newCows群体(age<5)
类方法:母牛类——产小牛(productCow()) 牧场类——获取牛总数(getNum())
代码编写:
母牛类:
public class Cow {
private int age; //母牛类属性,牛的年龄
public Cow(int age) {
super();
this.age = age;
}
public int getAge() {
return age;
} //获取当前对象的年龄
public void setAge(int age) {
this.age = age;
} //为当前对象设置年龄
public Cow produceCow() {
if(age >= 5) {
return new Cow(0); //若母牛年龄大于或等于5岁,则生产小母牛
}
return null;
}
}
牧场类:
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Pasture {
private static List<Cow> oldcows,newcows; //牧场中成年母牛和小母牛的集合
static {
oldcows = new ArrayList<>();
newcows = new ArrayList<>();
Cow cow=new Cow(5); //最初的5岁母牛
oldcows.add(cow);
}
//设定牧场所过的年份
public static void getNums(int year) {
for(int i=0;i<year;i++) {
for(Cow cow : newcows) {
cow.setAge(cow.getAge()+1);
}
for(Cow cow : oldcows) {
cow.setAge(cow.getAge()+1);
}
for(Cow cow : newcows) {
if(cow.getAge() >= 5) {
oldcows.add(cow);
newcows.remove(cow);
break; //对java.util.ConcurrentModificationException的处理
}
}
for(Cow cow : oldcows) {
Cow babycow = cow.produceCow();
newcows.add(babycow);
}
System.out.printf("第%d年牧场已经有%d只母牛了!%n", i+1, oldcows.size() + newcows.size());
}
}
}
主类:
public class Test {
public static void main(String[] args) {
Pasture.getNums(20);
}
}
总结反思:
最近毕业后开始进行面试,发现在面试笔试题的最后部分会有这样一道题来考察对于面向对象思想的理解和掌握,当时自己对于这类问题没有经验,并没有做出一个满意的答案。回来后开始对这类问题进行查阅和学习,最终在借鉴了前辈的经验的基础上用自己能够方便理解的方式写出了这篇博客,在此特别感谢I_find_it的原贴学习笔记20170312——JAVA解决农场母牛生baby的问题