




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、JavaJava 实验报告实验报告 课程名称:Java 语言面向对象程序设计(第 2 版) 指导教师:卢乃辰 院系班级:通信 12-1 学号: 姓名: 日期:2015 年 12 月 21 日星期一 2/41 目录目录 Java 面向对象特性实验. 3 实验 1 对象的创建和使用.3 实验 2 类的静态成员与实例成员.6 实验 3 变量的作用域和 this 关键字.9 实验 4 方法重载.12 实验 5 子类的派生与方法覆盖.15 实验 6 多态性与动态绑定.21 实验 8 包的使用与访问控制.26 实验 9 接口的实现与运用.29 Java 异常处理及输入输出流技术.33 实验 3 异常处理的
2、链式搜索.33 实验 4 文本浏览器.36 实验 6 成绩排队.38 3/41 Java 面向对象特性实验面向对象特性实验 实验实验 1 对象的创建和使用对象的创建和使用 实验任务:实验任务: 编写一个圆环类 Ring 的 Java 程序。圆环类有 3 个数据成员,分别是内圆半径 innerRadius,外半 径 outerRadius 和颜色 color,这些属性可以查看 get 亦可以重新设置 set,另外。圆环还可以返回其面 积 area。 实验程序:实验程序: 完成思考题 4 之后总的源代码如下:Ring.java package sy1; public class Ring priv
3、ate double innerRadius; private double outerRadius; public String color; public Ring(double iRadius,double oRadius,String c) innerRadius = iRadius; /代码1初始化外半径 outerRadius = oRadius; color = c; public double getInnerRadius() return innerRadius;/代码2返回内半径 public double getOuterRadius() return outerRadi
4、us; public void setInnerRadius(double iRadius) innerRadius = iRadius; public void setOuterRadius(double oRadius) outerRadius = oRadius; 4/41 public void setColor(String c) color = c;/代码3设置颜色 public double getArea() return (outerRadius * outerRadius - innerRadius * innerRadius) * 3.1415; public doubl
5、e getcircleI()/思考题4添加的方法2,得到内圆的周长 return 2 * 3.1415 * innerRadius; public double getcircleO()/思考题4添加的方法2,得到外圆的周长 return 2 * 3.1415 * outerRadius; public static void main(String args) Ring ring = new Ring(5,8,red); Ring ring1 = new Ring(5,8,red); Ring ring2 = new Ring(5,8,red); System.out.println(内圆周
6、长: + ring1.getcircleI(); System.out.println(外圆周长: + ring2.getcircleO() +n); System.out.println(圆环的内半径:+ ring.getInnerRadius(); System.out.println(圆环的外半径:+ ring.getOuterRadius(); System.out.println(圆环的颜色:+ ring.color); System.out.println(圆环的面积:+ ring.getArea() + n); ring.setInnerRadius(4); ring.setOu
7、terRadius(6);/代码4设置圆环ring的外半径为6 ring.setColor(blue); System.out.println(圆环的内半径:+ ring.getInnerRadius(); System.out.println(圆环的外半径:+ ring.getOuterRadius(); System.out.println(圆环的颜色:+ ring.color); System.out.println(圆环的面积:+ ring.getArea() + n); 实验结果:实验结果: 5/41 思考题思考题: (1) 将 Ring.java 中的语句 Ring ring=ne
8、w Ring(5,8,”red”);改成 Ring ring=new Ring();修改之后 编译运行,此时有错误发生吗?分析错误原因。 答:会发生错误,错误如下图所示。 原因分析: 因为 Ring ring=new Ring(5,8,”red”);是有参数的方法,而 Ring ring=new Ring();中 Ring()是无 参数的方法,两个方法可以同时存在,但属于不同的方法,通过有无形参来区分,但是源程序中 没有定义 Ring()方法,所以会出现“未定义错误” 。 (4)现将圆环类 Ring 中再添加两个方法以便能返回内圆和外圆的周长,然后在主函数 main 中分别 创建两个对象 ri
9、ng1 和 ring2 以显示周长。 答:代码如下图示。 6/41 实验实验 2 类的静态成员与实例成员类的静态成员与实例成员 实验任务:实验任务: 编写一个圆类 Circle,其中有圆周率,半径和圆对象个数,其中圆周率和对象个数为 static 成员, 此外,Circle 中还有两个 static 方法分别是设置圆周率和显示当前圆对象个数的,其余都是实例成员, 仔细体会静态成员与实例成员的使用方法和区别。 实验程序:实验程序: 程序源代码:StaticTest.java class Circle static double pi=3.14; static int objectNo=0; in
10、t radius; Circle(int r) radius=r; objectNo+; Circle() radius=2; objectNo+; double getArea() return pi*radius*radius; static void setPI(double p) pi=p; void setRadius(int r) radius=r; static void displayNo() System.out.println(当前的圆对象个数是:+objectNo); public class StaticTest public static void main(Stri
11、ng args) 7/41 Circle cir1=new Circle(5); System.out.println(cir1的圆周率是:+cir1.pi); System.out.println(cir1的半径是:+cir1.radius); System.out.println(cir1的面积是:+cir1.getArea(); cir1.displayNo(); cir1.setRadius(10); Circle cir2=new Circle(); cir2.setPI(3.1415); System.out.println(cir1的圆周率是:+cir1.pi); System.
12、out.println(cir1的半径是:+cir1.radius); System.out.println(cir2的半径是:+cir2.radius); System.out.println(cir2的面积是:+cir2.getArea(); cir2.displayNo(); 实验结果:实验结果: 思考题思考题: (1)请将程序中的语句: 8/41 System.out.println(cir1 的圆周率是:+cir1.pi); cir1.displayNo(); 改成 System.out.println(cir1 的圆周率是:+Circle.pi); Circle.displayNo
13、(); 修 改 后 编 译 运 行 , 程 序 会 报 错 吗 ? 为 什 么 ? 接 着 如 果 将 语 句cir1.setRadius(10); 改 成 Circle.setRadius(10);情况又会怎么样呢? 答:Circle.displayNo();修改之后不会报错。因为displayNo();为static类型,可以直接使用类名进行引 用,不需要实例化对象。 Circle.setRadius(10);修改之后会报错。因为setRadius(10)不是static类型的成员函数,错误如下图所 示。 (2) 现在将圆周率 pi 的 static 修饰符去掉,使之成为实例变量,修改后编
14、译运行,会报错吗?产生 错误的原因是什么?可以试着同时将方法 setPI(double p)前面的 static 去掉, 看编译是否仍有错 误? 答:修改之后会报错,错误原因同上。使用 static 修饰的成员变量和成员函数可以使用类名直接引用, 而无需实例化对象进行引用;未使用 static 修饰的成员变量和成员函数必须实例化对象之后才可以用 实例化的对象进行引用。 (3)程序中的数据成员 objectNo 为什么要设置成 static 类型,它的作用是什么? 答:因为 objectNo 要供不同的实例化对象引用使用,所以 objectNo 的内存必须是对象共享内存,所 以需要加 stati
15、c 修饰。 使用 static 修饰的成员变量为该类所有的实例化对象共享内存。 如果未使用 static 修饰,则不同的类对象会拥有不同的 objectNo 副本,占用不同的内存空间,其值自然也会不一致。 9/41 实验实验 3 变量的作用域和变量的作用域和 this 关键字关键字 实验任务:实验任务: 编写一个 Java 程序 ScopeTest 以反应变量的种类及其作用范围,类 ScopeTest 中既有类的成员变 量,又有方法中的局部变量和参数,甚至还有在方法内的块中声明的变量,仔细体会这些变量的差异 及其用法。 实验程序:实验程序: 程序源代码:ScopeTest.java class
16、 ScopeTest int x;/类的成员变量 static int m=0; /类的所有实例化对象共享该内存 void show() int x=8,y;/方法中的局部变量 for(y=0;y2;y+) int z=5;/方法内部的块中声明的变量 System.out.println(z=+z); z=10; System.out.println(z=+z); System.out.println(方法域中的X=+x+在块内显示);/在块内输出x值,值为方法内的x的值 /z = 20; System.out.println(方法域中的X=+x+在块外显示);/值为方法内x的值 System
17、.out.println(类域中的X=+this.x+在块外显示);/值为方法外类内的x的值 System.out.println(类域中的m=+this.m+在块外显示);/值为类成员变量m的值 void setx(int x) this.x=x;/设置类成员变量 static void setm(int m) ScopeTest.m=m; public static void main(String args) ScopeTest application=new ScopeTest(); application.setx(2); application.setm(3); applicati
18、on.show(); 10/41 实验结果:实验结果: 思考题思考题: (1) 运行程序之前分心程序运行结果,然后运行程序查看输出结果与分析结果是否一致。 答:程序结果如上图所示,与分析结果一致。 (2) 将程序中的语句 z=20;前面的注释去掉,编译会报错吗?为什么? 答:程序会报错,错误如下图所示。 因为 z 变量是在 show 成员方法内部的 for 程序块中定义并初始化的变量,其变量作用域仅限于 该 for 程序块内,如果在其作用域外使用该变量,必然会出现错误。 (3)程序中有两个方法 setx()与 setm(),他们分别对类中的数据 x 和 m 进行设置,但是在方法 setm()
19、中试用的是 ScopeTest.m=m;现在将它改为 this.m=m,编译是否会报错,将 setm()方法前面 的 static 修饰符去掉,是否会报错?解释其中的原因。 答:改为 this.m=m 之后程序会报错,错误如下图所示。 11/41 如图中所示, this 关键字不能用在 static 环境下, 即 this 关键字不能用在 static 修饰的成员函数之 中。 但是,将成员函数 setm()前面的 static 修饰符去掉之后,编译会通过,程序可以正常运行,如 下图所示。 12/41 实验实验 4 方法重载方法重载 实验任务:实验任务: 编写一个 Java 程序,反映出方法重载
20、的使用特点,该程序包含多个重载的加法运算,例如:整 形加法、实型加法、以及混合加法运算等。从中体会方法重载的用法和优点。 实验程序:实验程序: 实现思考题(2)之后的总的源程序如下: class Overload int m,n; /Overload ov1=new Overload(); Overload() m=0; n=0; Overload(int a,int b) m=a; n=b; int add() System.out.println(无参加法+m+n+=+(m+n); return m+n; int add(int a,int b) System.out.println(整型
21、加法+a+b+=+(a+b); return a+b; double add(double a,double b) System.out.println(实型加法+a+b+=+(a+b); return a+b; /* double add(int a,int b) System.out.println(整型加法但返回实型值+a+b+=+(a+b); return (double)(a+b); */ doubleadd(int a,int b,double c) 13/41 System.out.println(混合加法+a+b+c+=+(a+b+c); return a+b+c; Strin
22、g add(double a,double b,double a1,double b1) System.out.println(复数加法 (+a+b+i)+(+a1+b1+i)+=+(a+a1)+(b+b1)+i); return (a+a1)+(b+b1)+i; public static void main(String args) int ix,iy; double dx,dy,di; String fushu; Overload ov=new Overload(); ix=ov.add(); iy=ov.add(3, 6); dx=ov.add(2.1, 5.3); dy=ov.add
23、(3, 6, 2.2); di=ov.add(5, 5); fushu=ov.add(2.1, 3.1, 2.1, 3.1); 实验结果:实验结果: 思考题思考题: (1)现在向程序中添加一个如下的新 add()方法 double add(int a,int b) System.out.println(整型加法但返回实型值+a+b+=+(a+b); return (double)(a+b); 编译的时候回出现什么情况,这说明了什么问题? 14/41 答:编译的时候会出现如下图所示的错误。 为什么会出现这样的错误呢?因为方法重载的时候是根据这些方法具有数量不同或类型不同的参数实现的,但仅仅 是返
24、回值的类型不同则不足以构成重载,所以出现上图所示的错误。 (2)程序中的 add()方法,能进行整型,实型等加法,现在添加一个 add()方法使之能进行两个复数之间的加 法。 答:添加方法如下: String add(double a,double b,double a1,double b1) System.out.println(复数加法(+a+b+i)+(+a1+b1+i)+=+(a+a1)+(b+b1)+i); return (a+a1)+(b+b1)+i; 运行结果如下图所示: 15/41 实验实验 5 子类的派生与方法覆盖子类的派生与方法覆盖 实验任务:实验任务: 编写一个 Java
25、 程序,程序中有一个父类 Telephone,Telephone 类中包含有电话品牌、电话号码、 通话时间、 费率等属性, 以及计算话费和显示信息等方法。 另外, 程序中还有另一个类叫做Mobilephone, 它是 Telephone 的子类,除了具有 Telephone 类的属性外,他还有自己的属性如网络类型、被叫时间, 同时它有自己的计算话费和显示信息的方法。 最后程序中应包含一个主类来使用上述两个类并显示它 们的信息。 实验程序:实验程序: 完成思考题后的实验源程序如下: class Telephone String brand,number;/电话品牌和电话号码 double dia
26、lledTime;/主叫时间 double rate;/费率 /无参的构造函数 Telephone() Telephone(String b,String n) brand=b; number=n; Telephone(String b,String n,double r) this(b,n); rate=r; String getBrand()return brand; String getNumber() return number; double getRate()return rate; double getDialledTime()return dialledTime; void s
27、etBrand(String b) brand=b; void setNumber(String n) number=n; void setRate(double r)rate=r; void setDialledTime(double d) dialledTime=d; 16/41 double callCost()return dialledTime*rate; void display() System.out.println(电话品牌:+brand+电话号码+number); System.out.println(通话时间:+dialledTime+费率+rate); System.o
28、ut.println(话费:+callCost(); class Mobilephone extends Telephone String network; double receivedTime; Mobilephone(String b,String num,String net) super(b, num); network=net; String getNetwork() return network; double getReceivedTime() return receivedTime; void setNetwork(String n) network=n; void setR
29、eceivedTime(double d) receivedTime=d; double callCost() return (dialledTime+0.5*receivedTime)*rate; void display() System.out.println(电话品牌:+brand+电话号码:+number+网络:+network); System.out.println(主叫时间:+dialledTime+被叫时间:+receivedTime+费率:+rate); System.out.println(话费:+callCost(); class XiaoLingTong extend
30、s Telephone int yuezu; XiaoLingTong(String b,String num,int y) super(b,num); yuezu=y; void setYueZu(int y) yuezu=y; int getYueZu() return yuezu; 17/41 double callCost() return yuezu+dialledTime*rate; void display() System.out.println(电话品牌:+brand+电话号码:+number); System.out.println(通话时间:+dialledTime+费率
31、:+rate); System.out.println(月租:+getYueZu(); System.out.println(话费:+callCost(); public class Inheritance public static void main(String args) Telephone telephone; Mobilephone mobile; /telephone=new Telephone(TCL, 8309600); telephone=new Telephone(TCL, 8309600,0.5);/思考题3修改的 mobile=new Mobilephone(Noki
32、a, CDMA); /telephone.setRate(0.2);/思考题3修改的 telephone.setDialledTime(150); mobile.setRate(0.4); mobile.setDialledTime(80); mobile.setReceivedTime(120); telephone.display(); System.out.println(); mobile.display(); /下面为思考题4的修改 Telephonetelephone2=new Telephone(iPhone, 0.6); te
33、lephone2.setDialledTime(100); telephone2.display(); XiaoLingTong p1=new XiaoLingTong(小灵通, 12345678, 20); p1.setRate(0.2); p1.setDialledTime(100); p1.display(); 实验结果:实验结果: 18/41 思考题思考题: (2)子类 Mobilephone 的构造函数中有语句 super(b,m) ,请指出该语句的作用。然后请将该语句删掉,分析错 误原因。 答:会出现下图所示错误: 通过上图,我们可以知道,隐式使用 super 来调用父类的构造函数
34、 Telephone()时,系统将自动调用父类的无参或 默认的构造函数,而程序中没有给出无参的构造函数,所以会出现上图所示的错误。 在程序中加入无参构造函数后的输出结果如下图所示: 19/41 如图所示,因为我们无参的构造函数里面没有初始化“电话品牌”和“电话号码” ,所以在输出的时候该项为“null” 。 (3)要调用父类的构造函数可以使用 super 关键字,而要调用本类自己的构造函数可以用 this 关键字,请试着在 Telephone 类中加入一个构造函数如下: Telephone(String b,String n,double r) this(b,n); rate=r; 然后在主程
35、序中用这个构造函数来创建一个 Telephone 对象,看看它能否起作用。 答:修改的地方如下图所示: 20/41 运行结果如下图所示: 通过图示发现,this 关键字确实调用了本类中的构造函数。 (4)现在以 Telephone 类为父类,设计一个新的子类叫做“小灵通” ,这个小灵通继承了 Telephone 类的属性,但 又与移动电话又所区别。 修改后的运行结果如下图所示: 21/41 实验实验 6 多态性与动态绑定多态性与动态绑定 实验任务:实验任务: 设计 3 个类, 分别是学生类 Student, 本科生类 Undergaduate, 研究生 Postgraduate, 其中 Stu
36、dent 类是一个抽象类,它包含一些基本的学生信息如姓名、所学课程、课程成绩等,而 Undergaduate 类 和 Postgraduate 类都是 Student 类的子类, 他们之间的主要差别是计算课程成绩等级的方法有所不同, 研究生的标准要比本科生的标准高一些,如表 1 所示。 表 1课程成绩等级 本科生标准研究生标准 80-100优秀90-100优秀 70-80良好80-90良好 60-70一般70-80一般 50-60及格60-70及格 50 以下不及格60 以下不及格 假设某班同学里既有本科生也有研究生,请编写程序统计出全班学生的成绩等级并显示出来。此 题关键是设计一个学生数组,
37、既能存放本科生对象,又能存放研究生对象。 实验程序:实验程序: 完成思考题之后的源代码:Polymorphism.java /Polymorphism.java abstract class Student final static int CourseNo=3;/课程数 String name;/学生姓名 String type;/学生类型:本科,研究生 int course;/各科课程成绩数组 String courseGrade;/学生最终综合成绩:优秀、良好、一般、及格、不及格 public Student(String name)/构造函数 =name; cours
38、e=new intCourseNo; courseGrade=;/补充的代码1 public abstract void calculateGrade(); public String getName() 22/41 return name; public String getType() return type;/补充代码2 public String getCourseGrade() return courseGrade; public int getCourseScore(int courseNumber) return coursecourseNumber; public void s
39、etName(String name) =name; public void setType(String type) this.type=type; public void setCourseScore(int courseNumber,int courseScore) coursecourseNumber=courseScore;/补充代码3 class Undergraduate extends Student public Undergraduate(String name) super(name); type=本科生; public void calculateGr
40、ade() int total=0; double average=0; for(int i=0;i=80 else courseGrade=不及格; class Highgraduate extends Student public Highgraduate(String name) super(name); type=高中生; public void calculateGrade() int total=0; double average=0; for(int i=0;i=80 else courseGrade=差; class Postgraduate extends Student p
41、ublic Postgraduate(String name) super(name); type=研究生; public void calculateGrade() int total=0; double average=0; for(int i=0;i=90 24/41 else courseGrade=不及格; public class Polymorphism public static void main(String args) Student students=new Student8; /Student st=new Student(李明); students0=new Und
42、ergraduate(赵军涛); students1=new Undergraduate(赵美容); students2=new Postgraduate(覃正梅); students3=new Undergraduate(张也); students4=new Postgraduate(段明菊); students5=new Undergraduate(曹旭东); students6=new Undergraduate(杜文越); students7=new Undergraduate(陈娜); for(int i=0;i8;i+) studentsi.setCourseScore(0, 87); studentsi.setCourseScore(1, 90); studentsi.setCourseScore(2, 78);
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高效节能电机项目可行性研究报告(参考范文)
- 文明工地管理制度
- 2025年湿法稀磷酸项目建议书
- 异步电机控制策略
- 2025年智能电网配电设备项目建议书
- 2025年互联网医疗平台在线问诊平台与患者健康档案管理对接报告
- 2025年工业碳捕获与封存(CCS)技术在节能减排中的应用案例研究
- 基于大数据的2025年智慧交通流量预测模型构建与分析报告
- 2025年绿色药品生产技术现状与市场推广路径研究报告
- 城市污水处理厂智能化升级改造中的能源管理优化策略报告
- 自尊主题班会课件
- 海洋经济政策效果评估
- 徳龙全自动咖啡机ECAM 22.110.SB 中文使用说明书
- 劳动教育与数学作业深度融合 全面培养学生的劳动素养
- 中国质谱仪行业发展趋势及发展前景研究报告2025-2028版
- 2025至2030中国直联式真空泵行业市场现状分析及竞争格局与投资发展报告
- 2025至2030中国无源光分路器行业发展趋势分析与未来投资战略咨询研究报告
- 痛风治疗与护理课件
- T/CCBD 19-2022品牌餐厅评价规范
- 2025 秋外研英语八上单元重点知识清单Unit 1
- 河南省南阳市内乡县2025届数学七下期末调研试题含解析
评论
0/150
提交评论