类的设计与封装实验报告.docx
《类的设计与封装实验报告.docx》由会员分享,可在线阅读,更多相关《类的设计与封装实验报告.docx(13页珍藏版)》请在冰豆网上搜索。
类的设计与封装实验报告
浙江大学城市学院实验报告
课程名称面向对象程序设计
实验项目名称类的设计与封装实验
(一)
学生姓名高宁雯专业班级计算1005学号31001221
一.实验目的和要求
1.掌握使用类将对象的属性与功能封装在类中的特点
2.掌握实例方法与构造方法
二.实验内容
1.分析Time类的设计
2.分析并设计Product类
3.分析并设计Fraction类
4.设计Rectangle类
5.设计Student类及其测试类School类
三.实验结果与分析(可将程序运行结果截屏,也可分析运行结果)
1.阅读以下关于Time类的代码,分析程序并回答相关的问题
importjava.text.DecimalFormat;
publicclassTime{
privateinthour;
privateintminute;
privateintsecond;
Time(){hour=0;minute=0;second=0;}
Time(inth){hour=h;minute=0;second=0;}
Time(inth,intm){hour=h;minute=m;second=0;}
Time(inth,intm,ints){hour=h;minute=m;second=s;}
Time(Timetime){
this.hour=time.getHour();
this.minute=time.getMinute();
this.second=time.getSecond();
}
publicintgetHour(){returnhour;}
publicintgetMinute(){returnminute;}
publicintgetSecond(){returnsecond;}
publicStringtoUniversalString(){
DecimalFormattwoDigits=newDecimalFormat("00");
returntwoDigits.format(getHour())+":
"+
twoDigits.format(getMinute())+":
"+
twoDigits.format(getSecond());
}
publicStringtoStandardString(){
DecimalFormattwoDigits=newDecimalFormat("00");
return((getHour()==12||getHour()==0)?
12:
getHour()%12)+":
"+、twoDigits.format(getMinute())+":
"+twoDigits.format(getSecond())+(getHour()<12?
"AM":
"PM");
}
}
(1)Time类共有几个构造器(即构造方法),作用有什么不同?
5种
Time(){hour=0;minute=0;second=0;}
无参数构造,初始化hour,minute,second;
Time(inth){hour=h;minute=0;second=0;}
定义参数h,将其赋值给hour;
Time(inth,intm){hour=h;minute=m;second=0;}
定义参数h和m,将其赋值给hour,minute;
Time(inth,intm,ints){hour=h;minute=m;second=s;}
定义参数h,m和s,将其赋值给hour,minute,second;
(2)getTime(),getMinute(),getSecond()方法的作用是什么?
如果去掉这些方法,程序可以完成同样的功能吗?
如何修改?
以实例的方法,在Time(Timetime)为hour,minute,second赋值,
去掉后改为Time(Timetime){
this.hour=hour;
this.minute=minute;
this.second=second;
}
(3)如果以下代码段出现在Time类的测试程序的main方法中,输出结果是什么?
Timet1=newTime(5);
System.out.println("Thetimeis"+t1.toStandardString());
输出“The time is 4AM”
(4)如果以下代码段出现在Time类的测试程序的main方法中,输出结果是什么?
Timet2=newTime(13,59,60);
System.out.println("Thetimeis"+t2.toStandardString());
输出“The time is 1:
59:
60PM”
(5)如果以下代码段出现在Time类的测试程序的main方法中,输出结果是什么?
Timet3=newTime(13,30,0);
Timet4=newTime(t3);
System.out.println("Thetimeis"+t4.toUniversalString());
“The time is 1:
30:
00PM”
2.确定以下代码段中是否存在错误,如果有错误,指出是逻辑错误还是语法错误,请在程序中用“~~~~~”标出错误的地方,并在第个练习的空白处写下正确的代码。
如果代码中没有错误,则在答案中写上“没有错误”。
注意:
在每个程序段中可能包含多处错误。
(1)以下代码定义了Product类,它有一个不带参数的构造器,将产品的名称设置为一个空的String,将price设置为0.00;该类还有一个toProductString方法,它返回一个包含产品的name和price的String
importjava.text.*;
publicclassProduct{
privateStringname;
privatedoubleprice;
privatestaticDecimalFormatmoney=newDecimalFormat("$0.00");
publicProduct(){
name="";
price=0.00;
}
publicStringtoProductString(){
returnname+"costs"+money.format(price);
}
}//endclassProduct
答案:
没有错误。
(2)如下代码定义了Product类的另一个构造器,它有2个参数,并将这些参数赋给相应的实例变量
publicProduct(Stringname,doubleprice){
name=name;
price=price;
}
答案:
this.name=name;
this.price=price;
(3)如下代码定义了两个set方法,用于设置Product类的name和price
publicsetName(){
this.name=name;
}
publicsetPrice(){
this.price=price;
}
答案:
publicStringsetName(){
returnname;
}
publicdoublesetPrice(){
returnprice;
}
(4)如下代码位于测试Product类的应用程序的main方法中,创建一个Product对象,并显示一个包含对象的实例变量值的String
Productp1=newProduct("Milk",5.5);
System.out.println(p1.name+""+p1.price);
(5)如下代码位于测试Product类的应用程序的main方法中,创建一个Product对象,设置其实例变量的值,并显示一个包含实例变量值的String
Productp1=newProduct();
p1.setName();
p1.setPrice();
System.out.println(p1.toProductString("Eggs",3));
答案:
3.补充以下代码,完成对一个分数类Fraction的定义,并测试这个类
publicclassFraction{
privateintnume;//分子
privateintdeno;//分母
//无参构造器
publicFraction(){
this.nume=0;
this.deno=1;
//初始化实例变量
}
//有参构造器
publicFraction(intn,intd){
//初始化实例变量
}
//化简分数方法
voidFracSimp()
{
//求分数的分子和分母的最大公约数
//化简分数
}
/*欧几里德算法定理:
gcd(a,b)=gcd(b,amodb),以下是c语言的代码,可以参考
voids&a,int&b) { intc=a; a=b; b=c; }
intgcd(inta,intb) {
if(0==a) { returnb; }
if(0==b) { returna; }
if(a>b) { s); }
intc;
for(c=a%b;c>0 ;c=a%b) { a=b; b=c; }
returnb;
}*/
//分数输出方法
voidFracOutput(){
}
publicstaticvoidmain(Stringargs[]){
}
4.构造一个Rectangle类(矩形类),它有两个浮点型属性length(长)和width(宽)。
该类具有两个构造函数(无参和有参),perimeter()和area()方法分别返回矩形的周长和面积,编写相应的main方法测试Rectangle类。
程序结构如下:
publicclassRectangel{
//实例变量的声明
//构造器的定义
//perimeter方法定义
//area方法定义
publicstaticvoidmain(String[]args){
//定义Rectangle类的对象引用r
//调用perimeter方法,并显示周长
//调用area方法,并显示面积
}
}
5.设计一个学生类Student,程序框架如下:
publicclassStudent{
//设计一个类变量(静态变量)记录学生人数
private
//设计基本属性有“学号”、“班号”、“姓名”、“性别”、“年龄”、“成绩”(用数组表示6门课的成绩)
private
//设计构造器,传递学生的个人信息
publicStudent(){
}
//设计方法“获得学号”、“获得班号”、“获得姓名”、“获得成绩”
//设计方法“修改年龄”、“修改班号”
//设计类方法“获得学生人数”
}
//设计一个类School,用于测试以上Student类
publicclassSchool{
publicstaticvoidmain(String[]args){
//创建新学生对象
//输出学生的基本信息
//测试类变量值的变化
}
}
classStudent{
//设计一个类变量(静态变量)记录学生人数
privatestaticintcount=0;
//设计基本属性有“学号”、“班号”、“姓名”、“性别”、“年龄”、“成绩”(用数组表示6门课的成绩)
privateintnum;
privateintclass_num;
privateStringname;
privateStringsex;
privateintage;
privateintscore[]=newint[6];
//设计构造器,传递学生的个人信息
publicStudent(){
}
publicStudent(intnum,intclass_num,Stringname,Stringsex,intage,int[]score){
this.num=num;
this.class_num=class_num;
this.name=name;
this.sex=sex;
this.age=age;
this.score=score;
}
//设计方法“获得学号”、“获得班号”、“获得姓名”、“获得成绩”
publicintnum(){
returnnum;
}
publicintgetClass_num(){
returnclass_num;
}
publicStringgetName(){
returnname;
}
publicint[]getScore(){
returnscore;
}
//设计方法“修改年龄”、“修改班号”
publicvoidsetAge(intage){
this.age=age;
}
publicvoidsetClass_num(intclass_num){
this.class_num=class_num;
}
//设计类方法“获得学生人数”
}
//设计一个类School,用于测试以上Student类
publicclassSchool{
publicstaticvoidmain(String[]args){
inta[]={91,92,93,94,95,96};
//创建新学生对象
Students=newStudent(3,3,"abc","F",2,a);
//输出学生的基本信息
intm[]=s.getScore();
System.out.println("班级为:
"+s.getClass_num()+"\n姓名为:
"+s.getName());
System.out.println("学生成绩为:
");
inti;
for(i=0;iSystem.out.println(m[i]);
}
//测试类变量值的变化
}
}