浙江大学城市学院实验报告课程名称面向对象程序设计实验项目名称类的设计与封装实验(一)学生姓名专业班级学号一. 实验目的和要求1.掌握使用类将对象的属性与功能封装在类中的特点2.掌握实例方法与构造方法二. 实验内容1. 分析Time类的设计2. 分析并设计Product类3. 分析并设计Fraction类4. 设计Rectangle类5. 设计Student类及其测试类School类三. 实验结果与分析(可将程序运行结果截屏,也可分析运行结果)1. 阅读以下关于Time类的代码,分析程序并回答相关的问题import java.text.DecimalFormat;public class Time{private int hour;private int minute;private int second;Time(){hour=0;minute=0;second=0;}Time(int h){ hour=h;minute=0;second=0;}Time(int h,int m){hour=h;minute=m;second=0;}Time(int h,int m,int s){hour=h;minute=m;second=s;}Time(Time time){this.hour=time.getHour();this.minute=time.getMinute();this.second=time.getSecond();}public int getHour(){return hour;}public int getMinute(){ return minute;}public int getSecond(){return second;}public String toUniversalString(){DecimalFormat twoDigits=new DecimalFormat("00");return twoDigits.format(getHour())+":"+twoDigits.format(getMinute())+":"+twoDigits.format(getSecond());}public String toStandardString(){DecimalFormat twoDigits=new DecimalFormat("00");return ((getHour()==12|| getHour()==0)? 12:getHour()%12)+":"+、twoDigits.format(getMinute())+":"+twoDigits.format(getSecond())+(getHour()<12?"AM":"PM");}}(1) Time类共有几个构造器(即构造方法),作用有什么不同?构造方法有5个第一个是不知道hour、minute、second三个的时候初始化时间为0:0:0 第二个是知道hour=h,而不知道minute、second的情况下初始化时间为h:0:0第三个是知道hour=h,minute=m,而second未知,则初始化时间为h:m:0第四个为hour=h,minute=m,second=s,初始化时间为h:m:s(2) getTime(),getMinute(),getSecond()方法的作用是什么?如果去掉这些方法,程序可以完成同样的功能吗?如何修改?分别是返回小时数,分钟数以及秒数,不能,如若删掉,要改成Time(Time time){this.hour=return hour;this.minute=return minute;this.second=return srcond;}(3) 如果以下代码段出现在Time类的测试程序的main方法中,输出结果是什么?Time t1=new Time(5);System.out.println("The time is "+t1.toStandardString());5 :0:AM输出“The time is 4AM”(4) 如果以下代码段出现在Time类的测试程序的main方法中,输出结果是什么?Time t2=new Time(13,59,60);System.out.println("The time is"+t2.toStandardString());1:59:PM输出“The time is 1:59:60PM”(5) 如果以下代码段出现在Time类的测试程序的main方法中,输出结果是什么?Time t3=new Time(13,30,0);Time t4=new Time(t3);System.out.println("The time is"+t4.toUniversalString());13:30:0输出“The time is 1:30:00PM”2. 确定以下代码段中是否存在错误,如果有错误,指出是逻辑错误还是语法错误,请在程序中用“~~~~~”标出错误的地方,并在第个练习的空白处写下正确的代码。
如果代码中没有错误,则在答案中写上“没有错误”。
注意:在每个程序段中可能包含多处错误。
(1) 以下代码定义了Product类,它有一个不带参数的构造器,将产品的名称设置为一个空的String,将price设置为0.00;该类还有一个toProductString方法,它返回一个包含产品的name和price的Stringimport java.text.*;public class Product{private String name;private double price;private static DecimalFormat money=new DecimalFormat("$0.00");public Product(){name=" ";price=0.00;}public String toProductString(){return name+" costs "+money.format(price);}}//end class Product答案:没有错误(2) 如下代码定义了Product类的另一个构造器,它有2个参数,并将这些参数赋给相应的实例变量public Product(String name, double price){name= name;price=price;}答案:逻辑错误= name;this.price=price;//重名的时候用this.域名访问当前域名,因为如果域名和方法中的局部变量同名的时候,名称指向的是局部变量。
(3) 如下代码定义了两个set方法,用于设置Product类的name和pricepublic setName( ){=name;}public setPrice( ){this.price=price;}答案:语法错误public setName( string name){=name;}public setPrice( double price ){this.price=price;}(4) 如下代码位于测试Product类的应用程序的main方法中,创建一个Product对象,并显示一个包含对象的实例变量值的StringProduct p1=new Product("Milk", 5.5);System.out.println(+ " "+p1.price);答:语法错误缺少程序段public Product(string name,double price){=name;this.price=price;}(5) 如下代码位于测试Product类的应用程序的main方法中,创建一个Product对象,设置其实例变量的值,并显示一个包含实例变量值的StringProduct p1=new Product();p1.setName();p1.setPrice();System.out.println(p1.toProductString("Eggs",3));答案:语法错误Product p1=new Product();p1.setName(“name”);p1.setPrice(price);System.out.println(p1.toProductString("Eggs",3));3.补充以下代码,完成对一个分数类Fraction的定义,并测试这个类public class Fraction{private int nume; //分子private int deno; //分母Fraction();//无参构造器public Fraction( ){this.nume=0;this.deno=0;}//初始化实例变量//有参构造器public Fraction( int n, int d ){If(d==0){Throw new Exception(“分母为0是不可用的!”)}This.nume=n;This.deno=d;}//初始化实例变量//化简分数方法void FracSimp( ){//求分数的分子和分母的最大公约数//化简分数Int min=Math.min(num,deno);If(num%2==0&&deno%2==0){For(int i=min;i>2;i-=2){If(nume%i==0&&deno%i==0){Nume=nume/i;Deno=deno/i;Break;}}}Esle{if(min%2==0)min--;for(int i=min;i>=2;i-=2){If(nume%i==0 && deno%i==0){nume = nume/i;deno = deno/i;break;}}}}/*欧几里德算法定理:gcd(a,b) = gcd(b,a mod b),以下是c语言的代码,可以参考void swap(int & a, int & b) { int c = a; a = b; b = c; } int gcd(int a,int b) {if(0 == a ) { return b; }if( 0 == b) { return a; }if(a > b) { swap(a,b); }int c;for(c = a % b ; c > 0 ; c = a % b) { a = b; b = c; }return b;} *///分数输出方法void FracOutput( ){//输出分数的分子和分母If(nume==0)System.out.println(0);ElseSystem.out.println(nume+"/"+deno);}public static void main(String args[]){//定义第1个Fraction类的对象引用f1,调用无参构造方法// 定义第2个Fraction类的对象引用f2,调用有参构造方法//调用化简分数方法//调用分数输出方法Fraction f1 = new Fraction();f1.FracSimp();f1.FracOutput();Fraction f2 = new Fraction(363,4569);F2.FracSimp();f2.FracOutput();}4.构造一个Rectangle类(矩形类),它有两个浮点型属性length(长)和width(宽)。