Blog-二
对期中考试试题的思考与认识
-
设计一个类表示平面直角坐标系上的点Point,私有属性分别为横坐标x与纵坐标y,数据类型均为实型数,除构造方法以及属性的getter与setter方法外,定义一个用于显示信息的方法display(),用来输出该坐标点的坐标信息,格式如下:
(x,y),数值保留两位小数。为简化题目,其中,坐标点的取值范围设定为(0,200]。若输入有误,系统则直接输出Wrong Format -
设计一个类表示平面直角坐标系上的线Line,私有属性除了标识线段两端的点point1、point2外,还有一个字符串类型的color,用于表示该线段的颜色,同样,除构造方法以及属性的getter与setter方法外,定义一个用于计算该线段长度的方法getDistance(),还有一个用于显示信息的方法display(),用来输出线段的相关信息,输出格式如下:
第一题:简单的类,其中没有继承,也没有多态。
只有类之间的相互调用;
主要测试了我们的基础,对类的调用以及对垒的定义和书写是否是正确的。
在“点与线(类设计)”题目基础上,对题目的类设计进行重构,以实现继承与多态的技术性需求。
- 对题目中的点Point类和线Line类进行进一步抽象,定义一个两个类的共同父类Element(抽象类),将display()方法在该方法中进行声明(抽象方法),将Point类和Line类作为该类的子类。
- 再定义一个Element类的子类面Plane,该类只有一个私有属性颜色color,除了构造方法和属性的getter、setter方法外,display()方法用于输出面的颜色,输出格式如下:
The Plane's color is:颜色 - 在主方法内,定义两个Point(线段的起点和终点)对象、一个Line对象和一个Plane对象,依次从键盘输入两个Point对象的起点、终点坐标和颜色值(Line对象和Plane对象颜色相同),然后定义一个Element类的引用,分别使用该引用调用以上四个对象的display()方法,从而实现多态特性。
第二题:用到了类之间的继承,是一个抽象类(抽象类中可以有非抽象方法,不一定要有抽象方法public abstract,也可以有成员变量),用到了继承与多态。
类属性的实现(static)
私有属性的实现(private)
在“点与线(继承与多态)”题目基础上,对题目的类设计进行重构,增加容器类保存点、线、面对象,并对该容器进行相应增、删、遍历操作。
- 在原有类设计的基础上,增加一个GeometryObject容器类,其属性为
ArrayList<Element>类型的对象(若不了解泛型,可以不使用<Element>) - 增加该类的
add()方法及remove(int index)方法,其功能分别为向容器中增加对象及删除第index - 1(ArrayList中index>=0)个对象 - 在主方法中,用户循环输入要进行的操作(choice∈[0,4]),其含义如下:
- 1:向容器中增加Point对象
- 2:向容器中增加Line对象
- 3:向容器中增加Plane对象
- 4:删除容器中第index - 1个数据,若index数据非法,则无视此操作
- 0:输入结束
相较于第二题:
第三题的题目多了一个类,这个类被用于实现对象的增,删,改,差。以及多次输出。
对于第三次实验(继承与多态一)
(1) 为之前的类添加合适的父类。
(2) 为父类添加适合的属性和方法。并以此为基础修改原有的类,使之与添加的类构成继承关系。
(3) 使用多态改进整个代码,提高代码的复用性。
1、 请画出完整类图,包含每个类的类名、属性、方法以及类与类的关联,并用文字说明关联类的关联关系。
2、 说明你设计的继承关系的理由,为什么不用组合
3、 说明你在哪部分代码中使用了多态,带来了什么好处。
第一: 添加了一个共同的父类,名字是Passager{}
第二: 并且把子类中相同的代码放进了父类中。
第三: 在方法Eat(Passage canbeeat,Passager farmer){} 用到了多态
对于第三次实验(继承与多态二)
实验要求
1、 农夫过河问题,将之前的代码进行如下改进:
(1) 修改程序代码,在游戏中增加胡萝卜、兔子两个角色,过河的规则改为一次可以带两样东西过河。
2、 请画出完整类图,包含每个类的类名、属性、方法以及类与类的关联,并用文字说明关联类的关联关系
3、 实现第一步的功能时,你的代码做了哪些修改。如何避免修改原有代码?
4、 修改系统功能,运行程序后,用户可以选择玩新规则(五个角色、一次两样东西带过河)或者老规则(三个角色、一次一样东西带过河)的游戏。
实验改进 :
实现第一步时我的代码修改:
首先新添加了两个类分别是Carrot(萝卜) Rabbit(兔子)同之前四个类一样都继承自同一个父类Passenger(乘客类)
当然此时在Game类里面也相应的实例化了这两个新添加的类和GameGui里面
添加了 public void showStatus(Farmer farmer,Wolf wolf,Sheep sheep, Cabbage cabbage,Carrot carrot,Rabbit rabbit) {}
过河规则的修改,我在原有的四个选择上新添加了十种情况,还有新规则和旧规则的选择,如果输入0,则选择了新规则,否则就是旧规则。
避免代码修改:
通过使用多态和继承的方式,提高了代码的复用性,如果想要添加新的元素,只要同之前类一样,继承并使用多态即可,这样,代码的修改非常简单,也很通用。
通过这次实验我对java中类间关系的理解更加的深刻了,对与用idea的运用也更加熟练
除此之外,我也发现了自己的不足,我的基础不牢固,对许多的东西都是似懂非懂,每次写代码都要翻笔记,记得不劳且理解不到位。例如此次类的继承,如果使用多态的形式,没有注意到变量的获得是父类的导致浪费了大量时间来发现错误
实验结果
类图
类间关系:
唯一父类Passager{}
父类中的成员变量
int flag = 0;
private boolean hasCross = false;
private boolean isAlive = true;
父类中的方法
Passenger() {
}
public void sethasCross() {
this.flag++;
if (this.flag % 2 == 0) {
this.hasCross = false;
} else {
this.hasCross = true;
}
}
public void setisAlive(boolean p){
this.isAlive = p;
}
public boolean getisAlive(){
return this.isAlive;
}
public boolean gethasCross() {
return hasCross;
}
public boolean Eat(Passenger caneated, Passenger farmer) {
if (caneated.gethasCross() == hasCross && hasCross != farmer.gethasCross()) {
caneated.setisAlive(false);
return true;
} else {
caneated.setisAlive(true);
return false;
}
}//其中Passenger caneated, Passenger farmer利用了多态向上转型
// 简化了代码使之简洁易读
全体子类:Carrot extends {} Cabbage extends {} Farmer extends {}
Wolf extends {} Sheep extends{} Rabbit extends {}
子类除了构造方法不一样外
共同拥有一个方法
public void showStatus(){
System.out.println("Sheep is alive :"+super.getisAlive());
System.out.println("Sheep has Cross : " +super.gethasCross());
}
里面的Sheep根据类的不同而有不同的输出。
船类: Boat{}无实际意义因为Farmer在哪里船就在那里,所以可以用Farmer判断就行
浙公网安备 33010602011771号