java实验4.docx
- 文档编号:7880401
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:16
- 大小:44.60KB
java实验4.docx
《java实验4.docx》由会员分享,可在线阅读,更多相关《java实验4.docx(16页珍藏版)》请在冰豆网上搜索。
java实验4
实验报告
课程名称:
JAVA程序设计
实验名称:
实验四
实验地点:
N6-103
实验日期:
2018/11/10
常熟理工学院
实验目的
1.掌握Java中类的定义、对象的创建方法;
2.理解封装性及其意义;
3.掌握构造函数的含义与作用、定义方式和实现,能够根据要求正确定义和重载构造函数。
4.能够根据给定的要求定义类并实现类的成员函数;
5.理解类的成员的访问控制的含义,公有、私有和保护成员的区别
实验环境
Windows操作系统
JavaSDK
Eclipse
实验内容
1.理解抽象:
一副扑克由52张牌组成(不含王),对一张牌Card进行抽象,
每张Card有自己的花色suit和点数rank两个属性
根据程序的运行结果补充完整Card类的定义:
classCard{
int[]rank=newrank[13];
char[]suit;
suit=’红桃,草花,方片,黑桃’
}
classCardTest{
publicstaticvoidmain(String[]args){
Cardc1=newCard(“红桃”,13)
System.out。
println(c1);
Cardc2=newCard(“草花”,1);
System。
out。
println(c2);
}
}
请写出程序代码:
publicclassCardTest{
publicstaticvoidmain(String[]args){
//TODOAuto-generatedmethodstub
Cardc=newCard(”红桃",13);
c。
show();
}
}
classCard{
privateintrank;
privateStringsuit;
publicCard(StringSuit,intRank){
this。
suit=Suit;
this.rank=Rank;
}
publicStringgetSuit(){
returnsuit;
}
publicintgetrank(){
returnrank;
}
publicvoidshow(){
System.out。
println(rank+””+suit);
}
}
2.实现交通工具Vehicle类
版本一:
(1)没有数据隐藏的类
创建一个Vehicle类实现上面的UML类图.
A)含有两个public属性:
load—“车辆当前的载货量”
maxLoad-“车辆的最大载货量”。
B)含有一个公有的构造函数用于初始化最大载货量属性maxLoad。
C)含有两个公有的函数:
publicdoublegetLoad();//用于得到当前的载货量
publicdoublegetMaxLoad()//用于取得最大载货量
(注意:
所有的数据都是假定以千克(kilograms)作为单位的。
在这个版本的Vehicle类中,你将把所有成员的属性设置为public,这样在下面测试程序TestVehicle1中可以直接访问这些成员.
请写出Vehicle类的实现代码:
classVehicle{
publicdoubleload;
publicdoublemaxLoad;
publicVehicle(doublemax){
this.maxLoad=max;
}
publicdoublegetLoad(){
returnload;
}
publicdoublegetMaxLoad(){
returnmaxLoad;
}
}
(2)编写下面的程序对Vehicle类进行测试,代码如下:
publicclassTestVehicle1{
publicstaticvoidmain(String[]args){
Vehiclevehicle=newVehicle(10000.0);
System。
out。
println(”Addbox#1(500kg)");
vehicle.load=vehicle.load+500.0;
System.out.println(”Addbox#2(250kg)");
vehicle。
load=vehicle.load+250。
0;
System。
out。
println("Addbox#3(5000kg)");
vehicle。
load=vehicle.load+5000.0;
System.out.println("Addbox#4(4000kg)");
vehicle。
load=vehicle.load+4000。
0;
System。
out.println(”Addbox#5(300kg)");
vehicle.load=vehicle.load+300。
0;
System.out.println("Vehicleloadis”+vehicle.getLoad()+”kg\n");
}
}
应该得到以下的结果:
Addbox#1(500kg)
Addbox#2(250kg)
Addbox#3(5000kg)
Addbox#4(4000kg)
Addbox#5(300kg)
Vehicleloadis10050.0kg
从程序的运行结果来看,你发现了什么问题?
思考如何才能避免?
Vehicle的load已经超过最大载重量maxLoad,应设置一个阈值,当load大于maxLoad时,停止接收数据
版本二:
(1)基本数据隐藏
为了解决第一个版本中的问题,你应该隐藏类中的数据成员(load和maxLoad)并且提供一个方法addBox,来检查车辆是否会发生超载。
创建一个Vehicle类实现上面的UML类图。
A)把load和maxLoad属性修改为private(私有的)。
B)添加addBox方法。
publicbooleanaddBox(doubleweight);//参数为所加箱子重量
这个方法必须检查加上一个箱子后是否会超过车辆的最大载货量。
如果超过了,应该拒绝装载这个箱子并返回false;否则把箱子加到车上并返回true。
注意:
所有的数据都是假定以千克(kilograms)作为单位的。
请写出修改后第二版的Vehicle类的实现代码:
classVehicle{
privatedoubleload;
privatedoublemaxLoad;
publicVehicle(doublemax){
this.maxLoad=max;
}
publicdoublegetLoad(){
returnload;
}
publicdoublegetMaxLoad(){
returnmaxLoad;
}
publicbooleanaddBox(doubleweight){
if(load〈=maxLoad&&(load+weight) load+=weight; returntrue; } else returnfalse; } } (2)编写下面的程序对新版本的Vehicle类进行测试,代码如下: publicclassTestVehicle2{ publicstaticvoidmain(String[]args){ Vehiclevehicle=newVehicle(10000.0); System。 out。 println(”Addbox#1(500kg): "+vehicle.addBox(500.0)); System。 out.println("Addbox#2(250kg): ”+vehicle。 addBox(250.0)); System.out。 println(”Addbox#3(5000kg): "+vehicle。 addBox(5000。 0)); System。 out.println(”Addbox#4(4000kg): "+vehicle。 addBox(4000。 0)); System.out.println("Addbox#5(300kg): ”+vehicle.addBox(300。 0)); System。 out.println("Vehicleloadis"+vehicle.getLoad()+"kg”); } } 阅读并运行下面的测试程序段。 注意代码中不能直接修改load属性的值,现在我们可以使用addBox()方法.这个方法将返回true或false并打印到屏幕上。 应该得到以下的结果: Addbox#1(500kg): true Addbox#2(250kg): true Addbox#3(5000kg): true Addbox#4(4000kg): true Addbox#5(300kg): false Vehicleloadis9750.0kg 版本三: (1)改变重量的内部表示单位为牛顿 现在假设你将要作一些关于车辆发动机和轮胎等磨损的计算,这些计算使用牛顿表示的重量。 创建一个Vehicle类实现上面的UML类图。 修改构造方法,getLoad(),getMaxLoad(),和addBox()方法,使它们使用一个从千克到牛顿的相互转换。 你可以定义下面的私有方法: privatedoublekiloToNewts(doubleweight){。 ..。 。 .} privatedoublenewtsToKilo(doubleweight){。 。 。 ..。 } 注意vehicle对象的内部数据是以牛顿为单位的,而外部数据(在方法中传递的参数)还是以千克为单位. 请写出第三版Vehicle类的实现代码: classVehicle{ privatedoubleload; privatedoublemaxLoad; publicVehicle(doublemax){ this。 maxLoad=max; } publicdoublegetLoad(){ returnload; } publicdoublegetMaxLoad(){ returnmaxLoad; } publicbooleanaddBox(doubleweight){ if(load<=maxLoad&&(load+weight)〈maxLoad){ load+=weight; returntrue; } else returnfalse; } privatedoublekiloToNewts(doubleweight){ returnweight*9。 8; } privatedoublenewtsToKilo(doublenewts){ returnnewts/9.8; } } (2)编写下面的程序对新版本的Vehicle3类进行测试,注意它和版本2中的测试代码是相同的,代码如下: publicclassTestVehicle3{ publicstaticvoidmain(String[]args){ Vehicle3vehicle=newVehicle3(10000.0); System.out.println("Addbox#1(500kg): "+vehicle。 addBox(500。 0)); System。 out.println("Addbox#2(250kg): "+vehicle。 addBox(250。 0)); System。 out.println(”Addbox#3(5000kg): ”+vehicle。 addBox(5000.0)); System。 out.println("Addbox#4(4000kg): "+vehicle.addBox(4000.0)); System.out.println(”Addbox#5(300kg): "+vehicle.addBox(300.0)); System。 out。 println("Vehicleloadis"+vehicle。 getLoad()+"kg"); } } 应该得到以下的结果: Creatingavehiclewitha10,000kgmaximumload. Addbox#1(500kg): true Addbox#2(250kg): true Addbox#3(5000kg): true Addbox#4(4000kg): true Addbox#5(300kg): false Vehicleloadis9750.0kg 对Vehicle类的第二个和第三个版本采用相同的测试代码,输出的结果有没有发生变化? 从代码可维护性的角度谈谈封装的好处。 第一安全。 被封装的类一般包含私有属性.如果要使用实例化它可安全调用无其他访问方法. 3.如果已知一个日期为2007/3/8,求10天后是哪一天,367天后呢? 设计思路: (1)定义一个MyDate类(版本一),成员有: classMyDate { //数据成员 privateintday; private intmonth; privateintyear; //方法成员 public MyDate(inty,intm,intd){…}//构造一个日期 publicMyDatenext(){…}//返回下一天的日期 publicMyDatenext(intx){…}//返回x天后的日期 publicvoiddisplay(){…} //显示当前日期信息 } (2)对MyDate类进行测试,测试代码如下: publicclassTestDate{ publicstaticvoidmain(String[]args){ MyDated1=newMyDate(2007,3,8); MyDated2; d2=d1.dayInc(10); d2.display(); d2=d1。 dayInc(367); d2。 display(); } } 要求: 将MyDate类中的方法代码编写完整,以实现程序所要求的功能. 如果将main方法中的语句 MyDated1=newMyDate(2007,3,8); 改为: MyDated1=newMyDate(2007,33,58);其它语句不变,程序运行结果是什么? 运行结果: (3)修改MyDate类(版本二) 要求: 必须对生成的日期做合法性验证,设定如下规则 A)year: 大于或等于1900年,合法,否则则将year置为1900。 B)Month: 在[1,12]范围内合法,否则将month置1. C)Day: 与month有关,应month所在月有效,否则置1. (设计参考: 在MyDate类中增加两个方法: ) publicvoidSetDate(intd,intm,inty){…}//设置日期 privatevoidCheckDate(inty,intm,intd){…}//对日期的有效性检查 进一步,求两个日期之间的相差的天数,MyDate类又如何改进? (设计参考: 在MyDate类中增加 公有的方法: ) publicintdaysBetweenTowDate(MyDateotherDate){…} 请将MyDate类编写完整: 请写出程序代码: 实验拓展 自己动手编程练习 设计一个数学中的分数类(Fraction),并测试结果是否正确。 要求: (1)一个分数由分子和分母构成,用两个整型成员变量up和down表示 (2)生成的分数对象的分子和分母必须满足的条件: A、分母不为零 B、分子和分母最简(化简后最大公约数只能为1) C、分子和分母异号时分子为负 因此在构造分数时要做合法性检查,且分子、分母改变时亦如此 (3)分类的值可以通过分子改变,相应的方法为setUp,也可以通过分母改变,相应方法为setDown,也可以同时修改分子和分母来改变分数的值,相应的改变方法为重载的两个方法: voidsetFraction(intup,intdown); voidsetFraction(Fractionf); (4)获取分子、分母和分数值的方法如下: intgetUp(); intgetDown(); doublegetValue(); (5)分数对象之间能够完成+、-、*、/四则运算。 Fractionadd(Fractionother); Fractionminus(Fractionother); Fractionmultiply(Fractionother); Fractiondevide(Fractionother); (6)提供a/b的形式打印分数,即重写toString()方法. 用下面的代码进行测试,得下如下图的结果: classFractionTest{ publicstaticvoidmain(String[]args){ Fractiona=newFraction(7,32); Fractionb=newFraction(13,32); Fractionr1=a.add(b); Fractionr2=a。 minus(b); Fractionr3=a.multiply(b); Fractionr4=a.devide(b); System.out。 println(a+"+"+b+”=”+r1); System。 out。 println(a+”-"+b+"=”+r2); System.out.println(a+"*”+b+"=”+r3); System。 out。 println(a+"/"+b+"="+r4); System.out。 println("--———--——----—-———--——-—----—”); System。 out.println(r1+"="+r1。 getValue()); System。 out。 println(r2+"=”+r2。 getValue()); System。 out。 println(r3+”=”+r3.getValue()); System.out.println(r4+”=”+r4.getValue()); } } 请将Fraction类编写完整: 心得体会 成绩 指导教师: (签署)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java 实验