《Java实验指导.pdf》由会员分享,可在线阅读,更多相关《Java实验指导.pdf(19页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Java语言程序设计实验指导书东北大学软件学院2 实验要求由于 Java语言程序设计是一门实践性较强的课程,课堂教学应该与实践环节紧密结合,因此,Java语言程序设计课程的实验环节在整个Java语言程序设计课程的学习过程中占据着重要的位置。Java语言程序设计课程实验的目的是为了使学生在课堂学习的同时,通过一系列的实验,使学生加深了解和更好地掌握Java语言程序设计课程教学大纲要求的内容。在Java语言程序设计的课程实验过程中,要求学生做到:(1)预习实验指导书有关部分,认真做好实验内容的准备,就实验可能出现的情况提前作出思考和分析。(2)仔细观察调试程序过程中出现的各种问题,记录主要问题,作
2、出必要说明和分析。(3)认真书写实验报告。实验报告模板见实验报告格式。(4)遵守机房纪律,服从辅导教师指挥,爱护实验设备。(5)实验课程不迟到。如有事不能出席,所缺实验一般不补。(6)本实验可以采用的开发工具有JDK,Jcreator和Eclipse等,同学在做实验之前要求熟悉开发环境。实验的验收将分为两个部分。第一部分是上机操作,包括检查程序运行和即时提问。第二部分是提交书面的实验报告。3 实验 1 Java 类和对象(一)(4 学时)1.实验目的(1)掌握 JDK 的安装步骤,理解环境变量PATH,CLASSPATH 的作用,以及它们的设置方法。掌握如何在命令行下编译和运行Java程序,掌
3、握Editplus 编辑器的使用方法。(2)通过编程和上机实验理解Java 语言如何体现面向对象编程基本思想,了解类的封装方法,以及如何创建类和对象,掌握对象和对象引用之间的关系,了解成员变量和成员方法的特性,掌握数组的定义方法,掌握类构造方法的定义和构造方法的使用,掌握OOP 方式进行程序设计的方法。2.实验类型设计型3.实验基本要求1(Java基本语法练习)编写35 选 7 的彩票程序,随机产生7 个 1-35 之间的中奖号码,产生的 7 个号码应保证互不相同,采用冒泡排序将7 个号码排序,从键盘输入7 个 1-35 之间的号码(必须为整数),输入的 7 个号码要保证互不相同,将用户输入的
4、号码与中奖号码进行比较,判断有几个号码相同,根据中奖号码的个数,判断用户中了几等奖。2(Java类和对象练习,与上课实例类似).编写一个银行客户类,客户属性有:姓名,编号,取款密码,存款余额,提供的方法包括存钱、取钱、查询余额。编写一个测试类,要求用户输入密码,如果密码正确,进入操作界面,操作界面提供一个菜单,提示用户如何进行存款,取款和查询,能够循环存款、取款和查询,存款金额和取款金额需要从键盘输入,输入的存款金额和取款金额大于0,取款金额小于等于存款余额,否则重新输入。3(Java类和对象练习).编写一个学生类,每个学生属性有:学号、姓名、年龄,创建5个学生对象,给一个学生数组赋值,完成以
5、下功能:将学生按学号排序输出;给所有学生年龄加1;统计大于20 岁的学生人数。4(选做)实现一个复数类,实现复数的加法和乘法,并编写测试类测试它。4 5(选做)编写一个三角形类,能根据3 个实数构造三角形对象,如果三个实数不满足三角形的条件,则自动构造以最小值为边的等边三角形。输入任意三个数,求构造的三角形面积。注:三角形面积s=sqrt(p*(p-a)*(p-b)*(p-c)其中,a,b,c为三条边,p=(a+b+c)/2。4.编程技巧1(1)如何根据构造方法的要求创建对象;(2)如何给对象数组赋值。(3)如何通过数组元素操作访问各对象的属性。(4)输出对象会自动调用对象的toString(
6、)方法。(5)通过数组管理学生对象,由于要多次输出学生数组,所以程序中编写了一个output 方法。2两个字符串的比较要用equals方法。5.实验思考题1 以下程序的运行结果?public class A static int k=3;static int m;public static void main(String args)k+;if(m=0)System.out.println(k);else System.out.println(B.k);k+;class B static int k=6;A.3 B.4 C.5 D.编译错误E.6 2以下程序的运行结果?public class
7、 A static int k=3;public static void main(String args)int k=4;A x1=new A();x1.k+;A x2=new A();5 x2.k+;k+;System.out.println(x1.k);A.3 B.4 C.5 D.6 E.7 3以下程序的运行结果为?class ValHold public int i=10;public class ObParm public static void main(String argv)ObParm o=new ObParm();o.amethod();public void ametho
8、d()int i=99;ValHold v=new ValHold();v.i=30;another(v,i);System.out.print(v.i);public void another(ValHold v,int i)i=0;v.i=20;ValHold vh=new V alHold();v=vh;System.out.print(v.i);System.out.print(i);A10030 B.20030 C.209930 D.10020 6 实验 2 Java 类和对象(二)(4 学时)1.实验目的理解面向对象与面向过程在编程思想上的差异,掌握如何定义一个类,熟练掌握构造方法
9、的定义和调用,掌握包的概念,掌握类中修饰符(public,protected,private)的使用方法和意义,掌握this 关键字的使用,掌握static 关键字的使用方法,理解静态变量、静态方法和静态代码块的意义,掌握一维数组和二维数组的定义和使用方法,掌握集合类Vector 和ArrayList的使用方法,并理解如何将集合类使用为动态数组,掌握String,StringBuffer和StringTokenizer 的使用方法。2.实验类型设计型3.实验基本要求1(完善银行顾客例子,与上课实例类似).具体满足如下要求:(1)为顾客类创建一个带有4 个参数的构造函数,初始化类中的4 个成员变
10、量;(2)为了去掉冗余,将顾客的业务放到顾客类的run()方法中;(3)在测试类中创建4 个顾客对象,存储在一个对象数组中,提示用户输入账号,根据账号确定执行哪个顾客的业务,即执行相应顾客的run 方法(使用for 循环);(4)顾客类中添加一个静态变量allNum,统计该银行一共有多少位顾客,在构造方法中将变量的值+1。(5)在顾客类中添加一个转账的方法,在顾客数组的4个对象之间转账,提示用户输入想转入的账号,在顾客对象的数组中查找是否有该账号,如果有该账号,提示用户输入转账金额,如果转账金额为正数,并且大于剩余金额,提示转账成功,否则提示余额不足,如果转账金额为负数,则执行反转账(从对方账
11、户向自己账户转账),反转账要求知道对方密码(可以调用之前编写的isPass()方法),否则不允许反转账。(6)将顾客的数组改为动态数组,可使用Vector 或者 ArrayList。(7)创建一个管理员类,类中包括id,name,password 等数据,类中提供添加顾客、删除顾客、计算储蓄总额、打印某个顾客的信息等方法,具体定义及功能列举如下:添加顾客:方法头可以定义为void addCust(Vector st),方法中提示管理员输入账号,密码,开户金额,顾客名字,用这些信息创建一个Cutomer 类,并添加到st 参数传进来的 Vector 中。7 删除顾客:方法头可以定义为void d
12、eleteCust(Vector st),方法中提示输入想要删除的顾客的账号,遍历st 参数传进来的Vector,找到后,将其删除。计算储蓄总额:方法头可以定义为void sum(Vector st),遍历 st 参数传进来的Vector,将所有账号的金额加起来。打印某个顾客的信息:方法头可以定义为void printOnePerson(Vector st),提示输入想要查询顾客的账号,遍历st 参数传进来的Vector,找到后,将该顾客的信息打印出来。2定义一个名为MyRectangle 的矩形类,类中有4 个私有的整型域,分别是矩形的左上角坐标(xUp,yUp)和右下角坐标(xDown,y
13、Down);类中定义没有参数的构造方法和有4 个int 参数的构造方法,用来初始化类对象。类中还有以下方法:getW()计算矩形的宽度;getH()计算矩形的高度;area()计算矩形的面积;toString()把矩形的宽、高和面积等信息作为为字符串返回。编写应用程序使用MyRectangle 类。3.小镇的图书馆需要一个新的电子租借系统。该小镇有两个图书馆,每个图书馆提供很多书让客户去租赁。客户可以打印出所有的图书清单,包括现存的,已经借出的和归还的。现在我们需要提供两个类,Book 类和 Library 类,有这两个类提供图书数据库的功能。请补充缺少的方法去完成类的功能。步骤:(1)补充完
14、成Book 类的定义。这个类需要定义获取图书标题的方法,查看图书的作者,查看是否可用的方法,是否借出方法。图书的状态用“available”和“borrowed”表示。现在的结构框架内缺少这些方法的执行内容,请用合适的功能代码补充方法体的内容。用main 方法测试方法,当你运行程序时应该输出的内容:图书名称:Java 程序设计教程图书作者:丁一出租状态:出租中可用状态:不可用public class Book String title;/图书名称String author;/作者boolean borrowed;/图书状态,初始状态为可用/使用给定的图书名称,创建一个新的Book 对象,并置该
15、对象的初始状态为可用public Book(String bookTitle,String author)/Implement this method 8/借书,标记该书为借出状态public void borrowed()/Implement this method /还书,标记该书为可用状态public void returned()/Implement this method /Returns true if the book is rented,false otherwise public boolean isBorrowed()/Implement this method /Retu
16、rns true if the book is available,false otherwise public Boolean isAvailable()/Implement this method /返回图书的名称public String getTitle()/Implement this method public static void main(String arguments)Book example=new Book(Java 程序设计教程);System.out.println(图书名称:+example.getTitle();System.out.println(图书作者:
17、+example.getAuthor();System.out.println(出租状态:+example.isBorrowed();System.out.println(可用状态:+example.isAvailable();(2)完成 library 类:我们应该建立一个类用于表示每个图书馆,并且管理每个图书馆的图书,他们有不同的地址和图书数目。建立一个Library 类。复制下面的结构代码。我们提供一个 main 方法用于建立两个图书馆,然后执行一些对书目的操作,图书入库、出借图书和图书归还,当一本处于出租中的图书被借阅时,输出“图书已被出租”,如果没有要借的图书,输出“没有发现要借的图
18、书”。当然,这些所有的方法成员和变量成员都是缺少的,你需要填充这些缺省的部分。解读下面的main 方法检查编译错误,填充缺少的方法和成员内容。9 public class Libaray /Add the missing implementation to this class public static void main(String args)/Create two libraries Library firstLibrary=new Library(文化路 80号);Library secondLibrary=new Library(建设路 22号);/Add four books t
19、o the first library firstLibrary.addBook(new Book(飞鸟集,泰戈尔);firstLibrary.addBook(new Book(安妮日记,弗兰克);firstLibrary.addBook(new Book(红楼梦,曹雪芹);firstLibrary.addBook(new Book(希腊的神话和传说,斯威布);secondLibrary.addBook(new Book(安妮日记,弗兰克);secondLibrary.addBook(new Book(红楼梦,曹雪芹);secondLibrary.addBook(new Book(希腊的神话和
20、传说,斯威布);System.out.println(图书馆地址:);firstLibrary.printAddress();secondLibrary.printAddress();System.out.println();System.out.println(从两个图书馆借【飞鸟集】);firstLibrary.borrowBook(飞鸟集);firstLibrary.borrowBook(飞鸟集);secondLibrary.borrowBook(飞鸟集);System.out.println();/输出两个图书馆各自可外借的图书System.out.println(first libr
21、ary可外借的图书:);firstLibrary.printAvailableBooks();System.out.println();System.out.println(second library 可外借的图书:);secondLibrary.printAvailableBooks();System.out.println();/向first library 归还【飞鸟集】System.out.println(向first library 归还【飞鸟集】:);firstLibrary.returnBook(飞鸟集);System.out.println();/输出 first libra
22、ry 图书馆可外借的图书System.out.println(first library可外借的图书:);firstLibrary.printAvailableBooks();10 4.(选做).链表的每个结点定义如下:class Node int data;Node next;定义一个链表类,创建一个初始为10 个结点的单向链表,结点数据用随机函数产生。输出该链表:分别在首部,中间和尾部增加一个数据为100的结点,输出链表。4.实验思考题1.以下程序的运行结果?class StaticDemo static int x;int y;public static int getX()return
23、 x;public static void setX(int newX)x=newX;public int getY()return y;public void setY(int newY)y=newY;public class EXP3_4 public static void main(String args)System.out.println(静态变量 x=+StaticDemo.getX();StaticDemo a=new StaticDemo();StaticDemo b=new StaticDemo();a.setX(1);a.setY(2);b.setX(3);b.setY(
24、4);System.out.println(静态变量 a.x=+a.getX();System.out.println(实例变量 a.y=+a.getY();System.out.println(静态变量 b.x=+b.getX();System.out.println(实例变量 b.y=+b.getY();11 2以下程序的运行结果?import java.util.Calendar;class Time private Calendar t;private int y,m,d,hh,mm,ss;Time()t=Calendar.getInstance();y=t.get(t.YEAR);m
25、=t.get(t.MONTH)+1;d=t.get(t.DATE);hh=t.get(t.HOUR_OF_DAY);mm=t.get(t.MINUTE);ss=t.get(t.SECOND);public String getDate()return y+年+m+月+d+日;public String getTime()return hh+时+mm+分+ss+秒;public class EXP3_3 public static void main(String args)Time t=new Time();System.out.println(当前日期:+t.getDate();System
26、.out.println(当前时间:+t.getTime();实验 3 Java 继承与接口(4 学时)1.实验目的掌握继承、抽象类、抽象方法和接口的概念,理解Java 继承的优势,掌握extends、implements、super 和 final 关键字的使用,掌握继承过程中构造方法的调用顺序,掌握继承体系中方法覆盖的机制,掌握抽象类和接口的区别,理解类与接口,接口与接口之间的实现与继承关系。2.实验类型设计型12 3.实验基本要求1.(与上课例子一致)假定要为某个公司编写员工工资支付程序,这个公司有各种类型的员工员(Employee),不同类型的员工按不同的方式支付工资:(1)经理(Ma
27、nager)每月获得一份固定的工资(2)销售人员(Salesman)在基本工资的基础上每月还有销售提成。(3)一般工人(Worker)则按他每月工作的天数计算工资。根 据 上 述 要 求 试 用 类 的 继 承 和 相 关 机 制 实 现 这 些 功 能,设 计 一 个 测 试 类EmployeeDemo,分别创建经理、销售人员和一般工人这三个类的对象,并输出每种员工的工资。(提示:应设计一个抽象的员工类(Employee)描述所有雇员的共同特性,这个类应该提供一个计算工资的抽象方法ComputeSalary(),使得可以通过这个类计算员工的工资。经理、销售人员和一般工人对应的类都应该继承这个
28、类,并给出每种员工工资的计算方法,进而给出它的具体实现。)2.假定根据学生的3 门学位课程的分数决定其是否可以拿到学位,对于本科生,如果3 门课程的平均分数超过60 分即表示通过,而对于研究生,则需要平均超过80 分才能够通过。根据上述要求,请完成以下Java 类的设计:(1)设计一个基类Student 描述学生的共同特征(包括的属性:名字(name),A 课程的成绩(classA),B 课程的成绩(classB),C 课程的成绩(classC),包括的方法:getAverage(),计算 3 门课的平均成绩)。(2)设计一个描述本科生的类Undergraduate,该类继承并扩展Studen
29、t 类(除了继承父类的属性和方法外,还包括一个方法isPass(),判断该本科生是否可以拿到学位。提示:调用从父类继承来的getAverage()方法获得 3 门课程的平均成绩)。(3)设计一个描述研究生的类Graduate,该类继承并扩展Student 类(除了继承父类的属性和方法外,还包括一个方法isPass(),判断该研究生是否可以拿到学位。提示:调用从父类继承来的getAverage()方法获得3 门课程的平均成绩)。(4)设计一个测试类StudentDemo,分别创建本科生和研究生这两个类的对象,并输出相关信息。3编写程序,定义一个计算面积的接口Area,其中包含一个计算面积的抽象方
30、法calculateArea()。然后设计圆Circle 和矩形 Rectan 两个类实现这个接口中的方法。最后定义一个计算圆和矩形的面积的测试类AreaDemo。提示:Circle 类包含的属性包括:常量 PI(定义为public static final double PI=3.14159),成员变量半径:radius,要实现接口中的方法calculateArea();Rectan 类 包 含 的 属 性 包 括:矩 形 的 长 和 宽,要 实 现 接 口 中 的 方 法calculateArea()。4.实验思考题1阅读如下所示的3 个 Java类的定义,分析它们之间的关系,写出运行结果
31、。class SuperClass int x;SuperClass()x=3;System.out.println(in SuperClass:x=+x);13 void doSomething()System.out.println(in SuperClass.doSomething();class SubClass extends SuperClass int x;SubClass()super();/调用父类的构造方法x=5;/super()要放在方法中的第一句System.out.println(in SubClass:x=+x);void doSomething()super.do
32、Something();/调用父类的方法System.out.println(in SubClass.doSomething();System.out.println(super.x=+super.x+sub.x=+x);public class Inheritance public static void main(String args)SubClass subC=new SubClass();subC.doSomething();2以下程序的运行结果?public class EXP3_7 protected String xm;/具有保护修饰符的成员变量protected int xh
33、;void setdata(String m,int h)/设置数据的方法 xm=m;xh=h;public void print()/输出数据的方法 System.out.println(xm+,+xh);class EXP3_8 extends EXP3_7 protected String xy;protected String xi;public static void main(String args)EXP3_7 p1=new EXP3_7();14 p1.setdata(李四,12321);p1.print();EXP3_8 s1=new EXP3_8();s1.setdata(
34、张三,12345);/调用父类的成员方法s1.xy=成都信息工程学院;/访问本类的成员变量s1.xi=计算机系;/访问本类的成员变量s1.print();System.out.print(s1.xm+,+s1.xy+,+s1.xi);3以下程序的运行结果?class Point protected int x,y;Point(int a,int b)setPoint(a,b);public void setPoint(int a,int b)x=a;y=b;class Line extends Point protected int x,y;Line(int a,int b)super(a,b
35、);setLine(a,b);public void setLine(int x,int y)this.x=x+x;this.y=y+y;public double length()int x1=super.x,y1=super.y,x2=this.x,y2=this.y;return Math.sqrt(x2-x1)*(x2-x1)+(y2-y1)*(y2-y1);public String toString()return 直线端点:+super.x+,+super.y+x+,+y+直线长度:+this.length();public class EXP3_10 public static
36、 void main(String args)Line line=new Line(50,50);System.out.println(n+line.toString();15 4以下程序的运行结果?interface NL/定义接口int year=2004;int age();void output();public class EXP3_13 implements NL/实现接口String xm;/类自己的成员变量(姓名)int csrq;/类自己的成员变量(出生日期)public EXP3_13(String n1,int y)/类构造方法xm=n1;csrq=y;public in
37、t age()/实现接口的方法return year-csrq;/这里直接使用了接口中的常量year public void output()/实现接口的方法System.out.println(this.xm+今年的年龄是+this.age()+岁);public static void main(String args)/类自己的成员方法 NL a=new EXP3_13(张三,1990);a.output();实验 3 Java 多态与异常处理(4 学时)1.实验目的掌握类的多态性、异常和错误的概念,掌握多态的使用方法,掌握instanceof、throw 和throws 关键字的含义,
38、掌握子类对象与父类对象的关系,掌握异常的捕获和抛出,掌握使用try-catch-finally结构进行异常处理,学会用 throws 从函数中抛出异常,学会创建自定义异常,以及手工抛出(产生)异常的throw 语句。2.实验类型设计型16 3.实验基本要求1.(与上课例子一致)基于员工工资支付的程序(参看实验3),创建一个Employee 类的对象数组,数组中的对象引用分别指向不同的子类(Manager、Salesman 和 Worker 等)对象,通过数组中的对象调用每个子类对象的ComputeSalary()方法,计算每种员工的工资。体验多态为程序带来的灵活性和可维护性。2.在一个类中编写
39、4 个两数相加的重载方法,参数分别为整整,整实、实整、实实。并在另一个类中编程测试这些方法的运行结果。3在程序中主动产生一个ArithmeticException 类型被 0 除的异常,并用catch 语句捕获这个异常。最后通过ArithmeticException 类的对象e 的方法 getMessage 给出异常的具体类型并显示出来。4.(选做)下面是一个名称为NegativeAmountException的自定义异常类,表示一个不正常的银行账目事件类。填充下面的语句,完成该类的编写。class NegativeAmountException _ _/NegativeAmountExcep
40、tion异常:用消息 s创建异常NegativeAmountException(String s)super(s);class Account doublebalance;/构造函数,余额为 0;public Account()balance =0;/构造函数,余额为 n,如果初始余额小于 0抛出异常public Account(double n)throws NegativeAmountException if(n0)this.balance =n;else _;/查询余额方法,返回当前余额publicdouble getBalance()return this.balance;/存款方法,
41、存款数额 amount;如果存款数目小于 0抛出异常publicvoid deposit(double amount)_ if(amount=0)balance+=amount;else 17 throw new NegativeAmountException(存款出错);/取款方法,取款数额 amount;如果取款数目小于 0抛出异常publicvoid withdraw(double amount)_ _ if(amount0)throw new NegativeAmountException(操作错误);elseif(balance amount)throw new NegativeAm
42、ountException(取款出错);else balance-=amount;5.(选做)模仿上题中NegativeAmountException 自定义异常的写法,根据下面要求写程序。自定义异常 OnlyOneException 与NoOprandException,并补充各自类的构造函数,参数用于保存异常发生时候的信息;添加 main方法,从命令行参数读入两个数据,计算这两个数据的和并输出。如果参数的数目只要一个,抛出OnlyOneException 异常并退出程序的执行;如果没有参数,抛出 NoOprandException 异常并退出程序的执行。4.实验思考题(1)思考以下程序的运
43、行结果public class EXP5_2 public static void main(String args)System.out.println(“这是一个异常处理的例子n”);try int i=10;i/=0;catch(IndexOutOfBoundsException e)System.out.println(异常是:+e.getMessage();finally System.out.println(finally 语句被执行);(2)以下程序的运行结果?public class EXP5_3 public static void main(String args)try
44、int a=args.length;18 System.out.println(na=+a);int b=42/a;int c=1;c42=99;catch(ArithmeticException e)System.out.println(发生了被0 除:+e);catch(ArrayIndexOutOfBoundsException e)System.out.println(数组下标越界:+e);(3)以下程序的运行结果?public class EXP5_4 static void throwProcess()try throw new NullPointerException(空指针异常
45、);catch(NullPointerException e)System.out.println(n 在 throwProcess方法中捕获+e.getMessage();throw e;public static void main(String args)try throwProcess();catch(NullPointerException e)System.out.println(再次捕获:+e);(4)以下程序的运行结果?public class EXP5_4 static void throwProcess()try throw new NullPointerException(空指针异常);catch(NullPointerException e)System.out.println(n 在 throwProcess方法中捕获+e.getMessage();throw e;19 public static void main(String args)try throwProcess();catch(NullPointerException e)System.out.println(再次捕获:+e);(5)编译运行如下程序,写出程序的运行结果。理解trycatchfinally 的使用。
限制150内