问题:
农场一头小母牛,
母牛每年生母牛。
母牛5岁产母牛,
20年后多少牛?
PS:前提:第一头母牛已经>=5岁
思路脉络:
面向对象基本思想,注意状态和行为,抽象出对应的属性和方法
1、Object Oriented思想
考虑类:母牛、农场
PS:一开始可能不会想到把农场设计为一个类。但母牛是成长在农场里的,随着时间推移,农场里的母牛数量不断增长。
考虑属性:母牛有age、农场有oldcows群体(age >= 5) 和 newcows群体(age < 5)。
考虑方法:母牛可以生产小母牛:produceCow() ;农场可以得到母牛总数 :getNums()
考虑类之间的关系:农场的属性oldcows、newcows是母牛的对象集合
2、具体实现
类Cow:
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;
}
}
类Farm:
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Farm {
//农场的老母牛集合(age>=5)、小母牛集合(age<5)
private static List oldcows,newcows;
static {
oldcows = new ArrayList<>();
newcows = new ArrayList<>();
Cow cow=new Cow(5); //最初的5岁母牛
oldcows.add(cow);
}
//获取第year年的母牛总数
public static void getNums(int year) {
for(int i=0;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) {
Farm.getNums(20);
}
}
问题反思:
1、在方法produceCow()中,如果将生出的小baby设置为0岁:
return new Cow(0);
2、一开始运行时会报错:java.util.ConcurrentModificationException(并发修改异常)
原因:在对newcows进行遍历的时候,并发地对它进行了remove操作
解决:在remove操作后立即执行break跳出foreach语句。
3、在for(int i=0;i
一开始是将母牛age的++都写到了newcows和oldcows各自的遍历当中去的,但是这样程序就会有bug:新的一年变成5岁的母牛被放入oldcows后,age再次被++。所以要进行一些修改。