Java实验教学指导书.doc
【精品文档】如有侵权,请联系网站删除,仅供学习与交流Java实验教学指导书.精品文档.Java程序设计实 验 教 学 指 导 书撰写人:软件教研室审核人:河北经贸大学信息技术学院2009年10月18日前 言一、实验总体目标随着Java语言程序设计是信息与计算科学专业的一门专业课,主要是给学生讲授Java语言的语法知识(包括类的知识点)、面向对象的程序设计思想与算法。使学生对面向对象编程有有比较深的了解,并具备这方面的能力。Java程序必须面向对象。由于这方面的内容比较抽象,须经过上机的实践,计算机是注重实践的学科,尤其是对编程语言的学习,要注重实际操作。所以上机实践是很必要的。才能使学生领会面向对象的程序设计思想。 实验教学目的主要是使学生进一步深刻理解Java语言基本概念、语法规则及程序结构,熟练掌握Java语言程序设计的基本方法,提高利用Java在网络环境下开发、设计应用程序的能力,从而进一步培养学生的创新能力和解决实际问题的能力。本课程的实验任务是:1、掌握在利用JDK工具开发一些简单程序。2、掌握JAVA语言的面向对象的概念及编程思想,理解平台无关性。二、适用专业年级本大纲适用于计算机科学与技术和网络工程专业3年级学生使用。三、先修课程C+程序设计、数据结构和操作系统。四、实验环境计算机主频1.7GHz以上,内存512M以上。操作系统为Windows XP或2000,JDK为1.6。五、实验总体要求实验中,实验者必须服从指导教师和实验室工作人员的安排,遵守纪律与实验制度,爱护设备及卫生。在指定的实验时间内,必须到实验室内实验,同时学生应该充分利用课余时间进行对实验内容的分析和程序设计。实验所涉及的Java 程序代码,都要求有较高的可读性和可重用性,符合面向对象的编程思想和规范。实验前要充分做好准备工作,建议如下:1、预习、思考实验内容;2、复习和掌握与本实验有关的知识内容;3、准备好上机所需的程序代码,实验课内时间主要是解决问题、调试程序、运行程序、测试程序和分析结果的时间,不能不编写程序或抄袭别人程序去做实验;4、对程序中自己有不懂或疑问的地方,应做出记录,以便在实验课上集中解决;5、准备好调试和运行所需的数据。实验时一人一组,独立上机。对于上机过程中出现的问题,尽量先独立思考和解决,尤其是语法错误、编译器提示信息,应善于独立分析判断,这是提高程序调试能力最主要的途径;对于难以解决的问题可以和同学交流或问老师;对于一个实验题目,可以先考虑尽可能多的方法,然后再这些方法里面选择一种较为有效的方法来实现。作为实验结果之一的实验代码书写要求规范清晰,如缩进、空行、程序块对齐等;同时应该有必要的注释。实验后,应及时整理出实验报告,提交电子及书面文档的实验报告。实验一 Java程序的编辑、编译和运行一、实验目的1、熟悉安装和配置JDK开发环境2、掌握Java 程序编辑、编译和运行的过程3、掌握Java 程序的构成特点二、实验内容1、JDK 的安装与环境变量的配置安装 JDK,观察安装后的目录体系,并在WindowsXP 环境下分别配置JAVA_HOME、CLASSPATH、PATH 三个环境变量。具体步骤如下所示。(1)JDK 下载安装过程首先,进入JDK1.6 下载网址:其次,选择要下载的项目(此处需要选择Java Development Kit 6.0 Update 5),然后点击“Download”。在下载页面选择下载页面会列出各个平台下的JDK 版本,选择其中Windows 版(32 位);有两种安装方式,一种是完全下载后再安装,一种是在线安装,选择下载后再安装。下载完成后,双击图标进行安装,安装过程中可以自定义安装目录等信息,例如选择安装目录为C:jdk16。(2)配置JDK 环境变量右击“我的电脑”,点击“属性”,如图1-1 所示。图1-1选择属性示意图选择“高级”选项卡,点击“环境变量”,如图1-2 所示。图1-2环境变量选取示意图在“系统变量”中,设置3 个变量:JAVA_HOME,Path,ClassPath(大小写均可)。若已存在则点击“编辑”,不存在则点击“新建”,如图1-3 所示。图1-3需要的属性设置示意图JAVA_HOME 指明JDK 安装路径,就是刚才安装时所选择的路径C,此路径下包括lib,bin,jre 等文件夹。PATH 使得系统可以在任何路径下识别Java 命令,设为:%JAVA_HOME%bin;%JAVA_HOME%jrebin(只设为%JAVA_HOME%bin 也行)。CLASSPATH 为java 加载类(class or lib)路径,设为:.;%JAVA_HOME%lib;%JAVA_HOME%libtools.jar;.;(一定要加“.”号表示当前路径)。(3)JDK 安装与配置的有效性检验打开Dos 窗口:“开始”>“运行”,键入“cmd”,然后点击确定,如图1-4 所示。图1-4打开Dos 窗口示意图键入命令“java version”,出现下图画面,说明环境变量配置成功,如图1-5 所示。图1-5“java version”命令运行结果窗口2、编写一个简单的Java 应用程序程序在命令窗口输出两行文字:“你好,很高兴学习Java”和“We are students”。三、思考题1、程序的主类如果不用public修饰,编译能通过吗?2、程序的主类如果不用public修饰,程序能正常运行吗?实验二 Java基本数据类型一、实验目的1、掌握变量名等标识符的命名方法2、掌握数据类型间的互相转换,同时了解unicode 字符表二、实验内容1、输出俄文字母表编写一个Java 应用程序,该程序可以实现char类型数据和int类型数据之间的互相转换,在命令窗口输出希腊字母表,程序运行效果如图2-1 所示。图 2-1 程序运行结果【程序模板】/ GreekAlphabet.javapublic class Russianpublic static void main(String args)int startPosition=0, endPosition=0;char cStart=, cEnd=;【代码1】 /cStart做int类型转换运算,并将结果赋值给startPosition【代码2】 /cEnd做int类型转换运算,并将结果赋值给endPositionSystem.out.println(“俄文字母共有:”);System.out.println(endPosition-startPosition+1+”个”);for (int i=startPosition; i<=endPosition;i+)char c=0;【代码3】 /i做char类型转换运算,并将结果赋值给cSystem.out.println(“ “+c);2、编写一个Java应用程序,用户从键盘输入一个浮点数据,程序将输出这个数的平方和三次方。【程序模板】/InputFloat.javaimport java.util.*;public class InputFloatpublic static void main(String args) double a,b,c; Scaner reader=new Scaner(System.in); System.out.println(“从键盘输入一个浮点数”);【代码1】 /reader调用方法读取用户从键盘输入的数据,并赋值给ab=a*a;c=a*a*a;【代码2】 /.输出b 【代码3】 /.输出c 三、思考题1、将一个float类型数据直接赋值给int类型变量,程序编译时提示怎样的错误?2、int x=(byte)128; 程序输出变量x的值是多少?3、定义变量的作用是什么?实验三 Java控制结构一、实验目的1、掌握Java程序设计中的表达式的使用。2、掌握Java程序设计中基本控制结构的使用。3、学会进行基本的程序调试。二、实验内容1、猜数字游戏编写一个Java应用程序,实现如下功能:Ø 随机分配给客户一个1100之间的整数。Ø 用户从键盘输入自己的猜测。Ø 程序返回提示信息,提示信息分别是“猜大了”、“猜小了”和“猜对了”。Ø 用户可根据提示信息再次输入猜测,直到提示信息是“猜对了”。【程序模板】/GuessNumber.javaimport java.util.*;public class GuessNumberpublic static void main(String args)System.out.println(“给你一个1100之间的整数,请猜猜这个数”);int realNumber=(int)(Math.random()*100)+1;int yourGuess=0;Scanner reader=new Scanner(System.in);System.out.println(“输入您的猜测:”);【代码1】 /reader调用方法获取用户从键盘输入的整数,并赋值给yourGuesswhile (【代码2】) /循环条件if (【代码3】) /条件代码System.out.println(“猜大了,请再猜:”);【代码4】 /reader调用方法获取用户从键盘输入的整数,并赋值给yourGuesselse if(【代码5】) /条件代码System.out.println(“猜小了,请再猜:”);【代码6】 /reader调用方法获取用户从键盘输入的整数,并赋值给yourGuessSystem.out.println(“猜对了!”);2、回文数编写一个Java 应用程序,用户从键盘输入一个199999之间的整数,程序将判断这个数是几位数,并判断这个数是否是回文数。回文数是将该数含有的数字逆序排列后得到的数和原数相同,如12121和3223都是回文数。让学生掌握if-else if多分支语句。【程序模板】/Number.javaimport java.util.*;public class Numberpublic static void main(String args)int number=0, d5,d4,d3,d2,d1;Scanner reader=new Scanner(System.in);System.out.println(“从键盘输入一个199999之间的数”):while(reader.hasNextInt()number=reader.nextInt();if(【代码1】) /判断number在199999之间的条件【代码2】 /计算number 的万位d5【代码3】 /计算number 的千位d4【代码4】 /计算number 的百位d3d2=number%100/10;d1=number%10;if (【代码5】) /判断number是5位数的条件System.out.printf(“n%d是5位数”,number);if(【代码6】) /判断number是回文数的条件System.out.printf(“n%d是回文数”,number);elseSystem.out.printf(“n%d不是回文数”,number);else if (【代码7】) /判断number是4位数的条件System.out.printf(“n%d是4位数”,number);if(【代码8】) /判断number是回文数的条件System.out.printf(“n%d是回文数”,number);elseSystem.out.printf(“n%d不是回文数”,number);else if (【代码8】) /判断number是3位数的条件System.out.printf(“n%d是3位数”,number);if(【代码9】) /判断number是回文数的条件System.out.printf(“n%d是回文数”,number);elseSystem.out.printf(“n%d不是回文数”,number);else if (d2!=0) System.out.printf(“n%d是2位数”,number);if(d1=d2) System.out.printf(“n%d是回文数”,number);elseSystem.out.printf(“n%d不是回文数”,number);else if (d1!=0) System.out.printf(“n%d是1位数”,number);System.out.printf(“n%d是回文数”,number);else System.out.printf(“n%d不在199999之间”,number);System.out.printf(“n可继续输入整数,或输入非整数结束程序%n”);System.out.printf(“你输入的数据不是整数”);三、思考题1、在猜数字的程序中,语句“System.out.println(“猜对了!”);”为何要放在while语句之后?放在while语句的循环体中合理吗?2、在运行回文数程序时,用户从键盘输入1221,程序提示怎样的信息? 3、Java 运算符的优先级与结合性是怎样的?4、使用if 语句实现单分支、两分支和使用switch 语句实现多分支的程序程序结构和流程分别是什么?5、使用if 语句和switch 语句都可以实现多分支,它们之间的区别是什么?6、使用while、do-while 和for 语句实现循环的程序程序结构和流程分别是什么?实验四 类的封装和继承一、实验目的1、掌握使用类来封装对象的属性和功能。2、掌握子类的继承性。3、掌握子类对象的创建过程。4、掌握成员变量的继承和隐藏。5、掌握方法的继承。二、实验内容1、三角形、梯形和圆形的类封装编写一个 Java 应用程序,该程序中有3 个类:Trangle,Lader 和Circle,分别用来刻画“三角形”、“梯形”和“圆形”。具体要求如下:(1)Trangle 类具有类型为double 的三个边以及周长、面积属性,Trangle 类具有返回周长、面积以及修改三个边的功能,另外,Trangle 还具有一个boolean 类型的属性,该属性用来判断三个数是否构成一个三角形;(2)Lader 类具有类型为double 的上底、下底、高、面积属性,就有返回面积的功能;(3)Circle 类具有类型为double 的半径、周长和面积属性,具有返回周长、面积的功能。【程序模板】/ AreaAndLength.javaclass Trangle double sideA,sideB,sideC,area,length;boolean boo;public Trangle(double a,double b,double c) 【代码1】 / 参数a,b,c 分别赋值给sideA,sideB,sideC。if(【代码2】) / a,b,c 构成三角形的条件表达式。【代码3】 / 给boo 赋值。else 【代码4】 / 给boo 赋值。double getLength() 【代码5】 / 方法体,要求计算出length 的值并返回。public double getArea() if(boo) double p=(sideA+sideB+sideC)/2.0;area=Math.sqrt(p*(p-sideA)*(p-sideB)*(p-sideC) ;return area;else System.out.println("不是一个三角形,不能计算面积");return 0;public void setABC(double a,double b,double c) 【代码6】 / 参数a,b,c 分别赋值给sideA,sideB,sideC。if(【代码7】) / a,b,c 构成三角形的条件表达式。 【代码8】 / 给boo 赋值。else 【代码9】 / 给boo 赋值。class Lader double above,bottom,height,area;Lader(double a,double b,double h) 【代码10】 / 方法体。double getArea() 【代码11】 / 方法体,,要求计算出area 返回。class Circle double radius,area;Circle(double r) 【代码12】 / 方法体。double getArea() 【代码13】 / 方法体,要求计算出area 返回。double getLength() 【代码14】 / 方法体,要求计算出length 返回。void setRadius(double newRadius) radius=newRadius;double getRadius() return radius;public class AreaAndLength public static void main(String args) double length,area;Circle circle=null;Trangle trangle;Lader lader;【代码15】 / 创建对象circle。【代码16】 / 创建对象trangle。【代码17】 / 创建对象lader。【代码18】 / circle 调用方法返回周长并赋值给length。System.out.println("圆的周长:"+length);【代码19】 / circle 调用方法返回面积并赋值给area。System.out.println("圆的面积:"+area);【代码20】 / trangle 调用方法返回周长并赋值给length。System.out.println("三角形的周长:"+length);【代码21】 / trangle 调用方法返回面积并赋值给area。System.out.println("三角形的面积:"+area);【代码22】 / lader 调用方法返回面积并赋值给area。System.out.println("梯形的面积:"+area);【代码23】 / trangle 调用方法返修改三个边的代码,要求将三个边修改为12,34,1。【代码24】 / trangle 调用方法返回面积并赋值给area。System.out.println("三角形的面积:"+area);【代码25】 / trangle 调用方法返回周长并赋值给length。System.out.println("三角形的周长:"+length);2、继承编写一个 Java 程序,除了主类外,该程序中还有4 个类People、ChinaPeople、AmericanPeople和BeijingPeople 类。要求如下:(1) People 类含有访问权限为protected、类型为double 的成员变量:height 和weight,以及public void speakHello()、public void averageHeight()和public void averageWeight()方法。(2) ChinaPeople 类是People 的子类,新增了public void chinaGongfu()方法。要求chinaPeople重写父类的public void speakHello()、public void averageHeight()和public void averageWeight()方法。(3) AmericanPeople 类是People 的子类,新增了public void americanBoxing()方法。要求AmericanPeople 重写父类的public void speakHello()、public void averageHeight()和public void averageWeight()方法。(4) BeijingPeople 类是ChinaPeople 的子类,新增了public void beijingOpera()方法。要求ChinaPeople 重写父类的public void speakHello() 、public void averageHeight() 和public void averageWeight()方法。【程序模板】/ Example.javaclass Peopleprotected double weight,height;public void speakHello() System.out.println("yayawawa");public void averageHeight() height=173;System.out.println("average height:"+height);public void averageWeight() weight=70;System.out.println("average weight:"+weight);class ChinaPeople extends People【代码1】 / 重写public void speakHello()方法,要求输出类似“你好,/吃了吗”这样的 汉语信息。【代码 2】 / 重写public void averageHeight()方法,要求输出类似/ “中国人的平均身高:168.78 厘米”这样的汉语信息。【代码 3】 / 重写public void averageWeight()方法,/ 要求输出类似“中国人的平均体重:65 公斤”这样的汉语信息。public void chinaGongfu() 【代码4】 / 输出中国武术的信息,例如:"坐如钟,站如松,睡如弓"等。class AmericanPeople extends People【代码5】 / 重写public void speakHello()方法,要求输出类似/“How do you do”这样的英语信息。【代码 6】 / 重写public void averageHeight()方法。【代码7】 / 重写public void averageWeight()方法。public void americanBoxing() 【代码8】 / 输出拳击的信息,例如,“直拳”、“钩拳”等。class BeijingPeople extends ChinaPeople 【代码9】 / 重写public void speakHello()方法,要求输出类似“您好”这样的汉语信息。【代码10】 / 重写public void averageHeight()方法。【代码11】 / 重写public void averageWeight()方法。public void beijingOpera() 【代码12】 / 输出京剧的信息。public class Examplepublic static void main(String args) ChinaPeople chinaPeople=new ChinaPeople();AmericanPeople americanPeople=new AmericanPeople();BeijingPeople beijingPeople=new BeijingPeople();chinaPeople.speakHello();americanPeople.speakHello();beijingPeople.speakHello();chinaPeople.averageHeight();americanPeople.averageHeight();beijingPeople.averageHeight();chinaPeople.averageWeight();americanPeople.averageWeight();beijingPeople.averageWeight();chinaPeople.chinaGongfu();americanPeople.americanBoxing();beijingPeople.beijingOpera() ;beijingPeople.chinaGongfu();三、思考题1、一个方法或一个块内定义的变量是否可以在方法外或块外使用?这种变量称为什么?方法的形式参数是否可以在方法之外使用?2、为什么说构造函数是一种特殊的方法?特殊在哪里?构造函数什么时候执行?被谁调用?3、子类重新定义与父类方法的方法头完全相同的方法,这种情况称为什么?4、同名的不同方法共存的情况称为什么?如何区分这些同名方法?5、定义一个类实现银行帐户的概念,包括的变量有“帐号”和“存款余额”,包括的方法有“存款”、“取款”和“查询余额”。定义主类,创建帐户类的对象,并完成相应操作。实验五 多态与接口一、实验目的1、了解抽象类和接口的原理。2、能运用抽象类和接口。3、理解多态的概念。4、学习实现多态。二、实验内容1、定义一个接口,用于查询课程定义一个类 Student,包括如下属性:学号(ID)、姓名(name)、性别(Sex)、出生日期(birthDate)、专业(specialty)、课程(course),实现以下方法:每个属性的获取和定义,要求至少包含一个构造函数。定义一个接口类,定义方法query_course_catalog()用来查询课程。编写一个接口,定义相关选课操作,定义Student 实现该接口。【程序模板】/ 定义一个接口,用于查询课程public interface 【代码1】 / 根据专业查询课程public String query_course_catalog (String speciality);/ Student 类,并实现接口public class Student implements 【代码2】 int ID; / 学号String name;/ 姓名char sex; / 性别String birthdate; / 出生日期 yyyy-MM-ddString specialty; / 专业Sting course; / 课程public Student (int ID,String name,char sex,String birthdate ,String specialty ,String course )/ 实现构造函数,用于初始化信息【代码段3】public showInfor() / 输出学生的基本信息【代码段 4】public String query_course_catalog (String speciality)return “welcome to you!”;public static void main(String args)Student student=new Student( 【代码5】 );String str= student. query_course_catalog( 【代码6】 );System.out.println(str);System.out.println(student);2、抽象类和抽象方法(1)定义一个抽象类Shape,类里有一个抽象方法display();(2) 定义一个Cricle 类,继承了Shape 类,并实现抽象方法display();(3) 定义一个Rectangle 类,继承了Shape 类,并实现抽象方法display();(4) 定义一个Triangle 类,继承了Shape 类,并实现抽象方法display();(5) 定义一个类,实例化上述几个类的对角,并提用上述几个类的display 方法。3、改用接口来实现题目2三、思考题1、同名的不同方法共存的情况称为什么?如何区分这些同名方法?2、创建一个类,声明一个无参数的构造函数,打印类已创建的信息;再重载一个具有String 参数的构造函数,打印参数信息;并创建主类验证之。3、定义一个矩形类,再定义接口EqualDiagonal,其中包含方法getDiagonal();由矩形类派生出一个正方形类,自行扩充成员变量和方法,并实现此接口EqualDiagonal。实验六 字符串操作一、实验目的1、掌握String类处理字符串的有关操作。2、掌握StringBuffer类处理字符串的有关操作。二、实验内容1、String类的常用方法编写一个Java应用程序,判断两个字符串是否相同,判断字符串的前缀、后缀是否与某个字符串相同,以及按字典顺序比较两个字符串的大小关系,进行字符串检索,创建字符串,将数字型字符串转化为数字,将字符串存放到数组中,用字符数组创建字符串等。【程序模板】/StringExample.javaclass StringExamplepublic static void main(String args)String s1=new String(“you are a student”);String s2=new String(“how are you”);if(【代码1】) /判断s1与s2是否相同System.out.println(“s1与s2相同”);elseSystem.out.println(“s1与s2不相同”);String s3=new String(“2000202020202345”);if(【代码2】) /判断s3的前缀是否为“2000202”System.out.println(“吉林省的身份证”);String s4=new String(“你”);String s5=new String(“我”);if(【代码3】) /按字典顺序,s4大于s5的表达式System.out.println(“按字典顺序,s4大于s5”);elseSystem.out.println(“按字典顺序,s4小于s5”);int position=0;String path=“C:javajspA.java”;position=【代码4】 /获取path中最后出现目录分隔符号的位置System.out.println(“C:javajspA.java中最后出现的位置:”+position);String fileName=【代码5】 /获取path中“A.java”子字符串System.out.println(“C:javajspA.java中含有的文件名:”+fileName);String s6=new String(“100”);String s7=new String(“123.678”);int n1=【代码6】 /将s6转化成int类型数据double n2=【代码7】 /将s7转化成double类型数据double n=n1+n2;System.out.println(n);String s8=new String(“ABCDEF”);char a=【代码8】 /将s8存放到数组a中for(int i=a.length-1;i>=0;i-)System.out.printf(“%3c”,ai);2、StringBuffer类的常用方法编写一个应用程序,使用StringBuffer对象实现对字符串的编辑操作,如替换字符串中的某些字符、删除字符串中的某些字符、在字符串中插入或尾加新的字符串等。【程序模板】Class StringBufferExamplepublic static void main(String args)StringBuffer str=new StringBuffer(“ABCDEFG”);【代码1】 /向str尾添加“123456789”System.out.println(str); 【代码2】 /将str中的字符B替换为bSystem.out.println(str);【代码3】 /在str中的“123456789”前面插入“Game”System.out.println(str);int index=【代码4】 /获取str中首次出现“1”的位置【代码5】 /删除str中“1234”int n=【代码6】 /获取str中字符个数【代码7】 /将str中“789”替换为“七八九”System.out.println(str);StringBuffer otherStr=new StringBuffer(“we love you”);int start=0;char c=0;while(start!=-1)if(start!=0)start=start+1;c=otherStr.charAt(start);if(Character.isLowerCase(c)c=Char