还剩30页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
《Java程序设计》实验教学指导书撰写人软件教研室审核人河北经贸大学信息技术学院2009年10月18日前言
一、实验总体目标随着Java语言程序设计是信息与计算科学专业的一门专业课,主要是给学生讲授Java语言的语法知识(包括类的知识点)、面向对象的程序设计思想与算法使学生对面向对象编程有有比较深的了解,并具备这方面的能力Java程序必须面向对象由于这方面的内容比较抽象,须经过上机的实践,计算机是注重实践的学科,尤其是对编程语言的学习,要注重实际操作所以上机实践是很必要的才能使学生领会面向对象的程序设计思想实验教学目的主要是使学生进一步深刻理解Java语言基本概念、语法规则及程序结构,熟练掌握Java语言程序设计的基本方法,提高利用Java在网络环境下开发、设计应用程序的能力,从而进一步培养学生的创新能力和解决实际问题的能力本课程的实验任务是
1、掌握在利用JDK工具开发一些简单程序
2、掌握JAVA语言的面向对象的概念及编程思想,理解平台无关性
二、适用专业年级本大纲适用于计算机科学与技术和网络工程专业3年级学生使用
三、先修课程《C++程序设计》、《数据结构》和《操作系统》
四、实验环境计算机主频
1.7GHz以上,内存512M以上操作系统为WindowsXP或2000JDK为
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下载安装过程首先,进入JDK
1.6下载网址http://java.sun.com/javase/downloads/index_jdk
6.jsp其次,选择要下载的项目(此处需要选择JavaDevelopmentKit
6.0Update5),然后点击“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%\jre\bin(只设为%JAVA_HOME%\bin也行)CLASSPATH为java加载类classorlib路径,设为.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar;.;(一定要加“.”号表示当前路径)
(3)JDK安装与配置的有效性检验打开Dos窗口“开始”“运行”,键入“cmd”,然后点击确定,如图1-4所示图1-4打开Dos窗口示意图键入命令“java–version”,出现下图画面,说明环境变量配置成功,如图1-5所示图1-5“java–version”命令运行结果窗口
2、编写一个简单的Java应用程序程序在命令窗口输出两行文字“你好,很高兴学习Java”和“Wearestudents”
三、思考题
1、程序的主类如果不用public修饰,编译能通过吗?
2、程序的主类如果不用public修饰,程序能正常运行吗?实验二Java基本数据类型
一、实验目的
1、掌握变量名等标识符的命名方法
2、掌握数据类型间的互相转换,同时了解unicode字符表
二、实验内容
1、输出俄文字母表编写一个Java应用程序,该程序可以实现char类型数据和int类型数据之间的互相转换,在命令窗口输出希腊字母表,程序运行效果如图2-1所示图2-1程序运行结果【程序模板】//GreekAlphabet.javapublicclassRussian{publicstaticvoidmainStringargs[]{intstartPosition=0endPosition=0;charcStart=’α’cEnd=’Я’;【代码1】//cStart做int类型转换运算,并将结果赋值给startPosition【代码2】//cEnd做int类型转换运算,并将结果赋值给endPositionSystem.out.println“俄文字母共有”;System.out.printlnendPosition-startPosition+1+”个”;forinti=startPosition;i=endPosition;i++{charc=’\0’;【代码3】//i做char类型转换运算,并将结果赋值给cSystem.out.println““+c;}}}
2、编写一个Java应用程序,用户从键盘输入一个浮点数据,程序将输出这个数的平方和三次方【程序模板】//InputFloat.javaimportjava.util.*;publicclassInputFloat{publicstaticvoidmainStringargs[]{doubleabc;Scanerreader=newScanerSystem.in;System.out.println“从键盘输入一个浮点数”;【代码1】//reader调用方法读取用户从键盘输入的数据,并赋值给ab=a*a;c=a*a*a;【代码2】//.输出b 【代码3】//.输出c }}
三、思考题
1、将一个float类型数据直接赋值给int类型变量,程序编译时提示怎样的错误?
2、intx=byte128;程序输出变量x的值是多少?
3、定义变量的作用是什么?实验三Java控制结构
一、实验目的
1、掌握Java程序设计中的表达式的使用
2、掌握Java程序设计中基本控制结构的使用
3、学会进行基本的程序调试
二、实验内容
1、猜数字游戏编写一个Java应用程序,实现如下功能随机分配给客户一个1~100之间的整数用户从键盘输入自己的猜测程序返回提示信息,提示信息分别是“猜大了”、“猜小了”和“猜对了”用户可根据提示信息再次输入猜测,直到提示信息是“猜对了”【程序模板】//GuessNumber.javaimportjava.util.*;publicclassGuessNumber{publicstaticvoidmainStringargs[]{System.out.println“给你一个1~100之间的整数,请猜猜这个数”;intrealNumber=intMath.random*100+1;intyourGuess=0;Scannerreader=newScannerSystem.in;System.out.println“输入您的猜测”;【代码1】//reader调用方法获取用户从键盘输入的整数,并赋值给yourGuesswhile(【代码2】){//循环条件if(【代码3】){//条件代码System.out.println“猜大了,请再猜”;【代码4】//reader调用方法获取用户从键盘输入的整数,并赋值给yourGuess}elseif【代码5】{//条件代码System.out.println“猜小了,请再猜”;【代码6】//reader调用方法获取用户从键盘输入的整数,并赋值给yourGuess}}System.out.println“猜对了!”;}}
2、回文数编写一个Java应用程序,用户从键盘输入一个1~99999之间的整数,程序将判断这个数是几位数,并判断这个数是否是回文数回文数是将该数含有的数字逆序排列后得到的数和原数相同,如12121和3223都是回文数让学生掌握if-elseif多分支语句【程序模板】//Number.javaimportjava.util.*;publicclassNumber{publicstaticvoidmainStringargs[]{intnumber=0d5d4d3d2d1;Scannerreader=newScannerSystem.in;System.out.println“从键盘输入一个1~99999之间的数”:whilereader.hasNextInt{number=reader.nextInt;if【代码1】{//判断number在1~99999之间的条件【代码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;}elseif【代码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;}elseif【代码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;}elseifd2!=0{System.out.printf“\n%d是2位数”number;ifd1==d2System.out.printf“\n%d是回文数”number;elseSystem.out.printf“\n%d不是回文数”number;}elseifd1!=0{System.out.printf“\n%d是1位数”number;System.out.printf“\n%d是回文数”number;}}elseSystem.out.printf“\n%d不在1~99999之间”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.javaclassTrangle{doublesideAsideBsideCarealength;booleanboo;publicTrangledoubleadoublebdoublec{【代码1】//参数abc分别赋值给sideAsideBsideCif【代码2】{//abc构成三角形的条件表达式【代码3】//给boo赋值}else{【代码4】//给boo赋值}}doublegetLength{【代码5】//方法体,要求计算出length的值并返回}publicdoublegetArea{ifboo{doublep=sideA+sideB+sideC/
2.0;area=Math.sqrtp*p-sideA*p-sideB*p-sideC;returnarea;}else{System.out.println不是一个三角形不能计算面积;return0;}}publicvoidsetABCdoubleadoublebdoublec{【代码6】//参数abc分别赋值给sideAsideBsideCif【代码7】//abc构成三角形的条件表达式{【代码8】//给boo赋值}else{【代码9】//给boo赋值}}}classLader{doubleabovebottomheightarea;Laderdoubleadoublebdoubleh{【代码10】//方法体}doublegetArea{【代码11】//方法体,要求计算出area返回}}classCircle{doubleradiusarea;Circledoubler{【代码12】//方法体}doublegetArea{【代码13】//方法体,要求计算出area返回}doublegetLength{【代码14】//方法体要求计算出length返回}voidsetRadiusdoublenewRadius{radius=newRadius;}doublegetRadius{returnradius;}}publicclassAreaAndLength{publicstaticvoidmainStringargs[]{doublelengtharea;Circlecircle=null;Trangletrangle;Laderlader;【代码15】//创建对象circle【代码16】//创建对象trangle【代码17】//创建对象lader【代码18】//circle调用方法返回周长并赋值给lengthSystem.out.println圆的周长:+length;【代码19】//circle调用方法返回面积并赋值给areaSystem.out.println圆的面积:+area;【代码20】//trangle调用方法返回周长并赋值给lengthSystem.out.println三角形的周长:+length;【代码21】//trangle调用方法返回面积并赋值给areaSystem.out.println三角形的面积:+area;【代码22】//lader调用方法返回面积并赋值给areaSystem.out.println梯形的面积:+area;【代码23】//trangle调用方法返修改三个边的代码,要求将三个边修改为12341【代码24】//trangle调用方法返回面积并赋值给areaSystem.out.println三角形的面积:+area;【代码25】//trangle调用方法返回周长并赋值给lengthSystem.out.println三角形的周长:+length;}}
2、继承编写一个Java程序,除了主类外,该程序中还有4个类People、ChinaPeople、AmericanPeople和BeijingPeople类要求如下1People类含有访问权限为protected、类型为double的成员变量height和weight,以及publicvoidspeakHello、publicvoidaverageHeight和publicvoidaverageWeight方法2ChinaPeople类是People的子类,新增了publicvoidchinaGongfu方法要求chinaPeople重写父类的publicvoidspeakHello、publicvoidaverageHeight和publicvoidaverageWeight方法3AmericanPeople类是People的子类,新增了publicvoidamericanBoxing方法要求AmericanPeople重写父类的publicvoidspeakHello、publicvoidaverageHeight和publicvoidaverageWeight方法4BeijingPeople类是ChinaPeople的子类,新增了publicvoidbeijingOpera方法要求ChinaPeople重写父类的publicvoidspeakHello、publicvoidaverageHeight和publicvoidaverageWeight方法【程序模板】//Example.javaclassPeople{protecteddoubleweightheight;publicvoidspeakHello{System.out.printlnyayawawa;}publicvoidaverageHeight{height=173;System.out.printlnaverageheight:+height;}publicvoidaverageWeight{weight=70;System.out.printlnaverageweight:+weight;}}classChinaPeopleextendsPeople{【代码1】//重写publicvoidspeakHello方法,要求输出类似“你好,//吃了吗”这样的汉语信息【代码2】//重写publicvoidaverageHeight方法,要求输出类似//“中国人的平均身高
168.78厘米”这样的汉语信息【代码3】//重写publicvoidaverageWeight方法,//要求输出类似“中国人的平均体重65公斤”这样的汉语信息publicvoidchinaGongfu{【代码4】//输出中国武术的信息,例如坐如钟站如松睡如弓等}}classAmericanPeopleextendsPeople{【代码5】//重写publicvoidspeakHello方法,要求输出类似//“Howdoyoudo”这样的英语信息【代码6】//重写publicvoidaverageHeight方法【代码7】//重写publicvoidaverageWeight方法publicvoidamericanBoxing{【代码8】//输出拳击的信息,例如,“直拳”、“钩拳”等}}classBeijingPeopleextendsChinaPeople{【代码9】//重写publicvoidspeakHello方法,要求输出类似“您好”这样的汉语信息【代码10】//重写publicvoidaverageHeight方法【代码11】//重写publicvoidaverageWeight方法publicvoidbeijingOpera{【代码12】//输出京剧的信息}}publicclassExample{publicstaticvoidmainStringargs[]{ChinaPeoplechinaPeople=newChinaPeople;AmericanPeopleamericanPeople=newAmericanPeople;BeijingPeoplebeijingPeople=newBeijingPeople;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实现该接口【程序模板】//定义一个接口,用于查询课程publicinterface【代码1】{//根据专业查询课程publicStringquery_course_catalogStringspeciality;}//Student类,并实现接口publicclassStudentimplements【代码2】{intID;//学号Stringname[];//姓名charsex;//性别Stringbirthdate;//出生日期yyyy-MM-ddStringspecialty;//专业Stingcourse;//课程publicStudent(intIDStringnamecharsexStringbirthdateStringspecialtyStringcourse){//实现构造函数,用于初始化信息【代码段3】}publicshowInfor{//输出学生的基本信息【代码段4】}publicStringquery_course_catalogStringspeciality{return“welcometoyou!”;}publicstaticvoidmainString[]args{Studentstudent=newStudent【代码5】;Stringstr=student.query_course_catalog【代码6】;System.out.printlnstr;System.out.printlnstudent;}}
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.javaclassStringExample{publicstaticvoidmainStringargs[]{Strings1=newString“youareastudent”;Strings2=newString“howareyou”;if【代码1】{//判断s1与s2是否相同System.out.println“s1与s2相同”;}else{System.out.println“s1与s2不相同”;}Strings3=newString“2000202020202345”;if【代码2】{//判断s3的前缀是否为“2000202”System.out.println“吉林省的身份证”;}Strings4=newString“你”;Strings5=newString“我”;if【代码3】{//按字典顺序,s4大于s5的表达式System.out.println“按字典顺序,s4大于s5”;}else{System.out.println“按字典顺序,s4小于s5”;}intposition=0;Stringpath=“C:\\java\\jsp\\A.java”;position=【代码4】//获取path中最后出现目录分隔符号的位置System.out.println“C:\\java\\jsp\\A.java中最后出现\\的位置”+position;StringfileName=【代码5】//获取path中“A.java”子字符串System.out.println“C:\\java\\jsp\\A.java中含有的文件名”+fileName;Strings6=newString“100”;Strings7=newString“
123.678”;intn1=【代码6】//将s6转化成int类型数据doublen2=【代码7】//将s7转化成double类型数据doublen=n1+n2;System.out.printlnn;Strings8=newString“ABCDEF”;chara[]=【代码8】//将s8存放到数组a中forinti=a.length-1;i=0;i--System.out.printf“%3c”a[i];}}
2、StringBuffer类的常用方法编写一个应用程序,使用StringBuffer对象实现对字符串的编辑操作,如替换字符串中的某些字符、删除字符串中的某些字符、在字符串中插入或尾加新的字符串等【程序模板】ClassStringBufferExample{publicstaticvoidmainStringargs[]{StringBufferstr=newStringBuffer“ABCDEFG”;【代码1】//向str尾添加“123456789”System.out.printlnstr;【代码2】//将str中的字符B替换为bSystem.out.printlnstr;【代码3】//在str中的“123456789”前面插入“Game”System.out.printlnstr;intindex=【代码4】//获取str中首次出现“1”的位置【代码5】//删除str中“1234”intn=【代码6】//获取str中字符个数【代码7】//将str中“789”替换为“七八九”System.out.printlnstr;StringBufferotherStr=newStringBuffer“weloveyou”;intstart=0;charc=’\0’;whilestart!=-1{ifstart!=0start=start+1;c=otherStr.charAtstart;ifCharacter.isLowerCasec{c=Character.toUpperCasec;otherStr.setCharAtstartc;}start=otherStr.indexOf“”start; //查找下一个空格}System.out.printlnotherStr;StringBufferyouStr=newStringBuffer“iLoveTHISGaME”;【代码8】//将youStr中的大写字符替换为小写字符,小写字符替换为大写System.out.printlnyouStr;}}
三、思考题
1、StringBuffer类的length方法和capacity方法有何不同?
2、String类和StringBuffer类有何不同?实验七Java流和文件操作
一、实验目的
1、掌握流的概念
2、掌握字符输入/输出流以及缓冲流的用法
3、掌握使用流读取文件的内容,并将内容写入到内存
4、掌握数据流、对象流的使用
二、实验内容
1、给文件的内容添加行号编写一个Java应用程序,给已存在的.txt文本文件添加行号要求该文本文件事先用文本编辑完毕,保存在C\1000目录中,命名为hello.txt程序运行效果如图7-1所示图7-1程序运行效果【程序模板】importjava.io.*;publicclassReadExample{publicstaticvoidmainStringargs[]{Filefile=newFilec:/1000hello.txt;FiletempFile=newFiletemp.text;try{FileReaderinOne=【代码1】//创建指向文件file的输入流BufferedReaderinTwo=【代码2】//创建指向inOnefile的输入流FileWritertofile=【代码3】//创建指向文件tempFile的输出流BufferedWriterout=【代码4】//创建指向tofile的输出流Strings=null;inti=0;s=【代码5】//inTwo读取一行whiles!=null{i++;out.writei++s;out.newLine;s=【代码6】//inTwo读取一行}inOne.close;inTwo.close;out.flush;out.close;tofile.close;inOne=【代码7】//创建指向文件tempFile的输入流inTwo=【代码8】//创建指向inOnefile的输入流tofile=【代码9】//创建指向文件file的输出流out=【代码10】//创建指向tofile的输出流whiles=【代码11】!=null{//inTwo读取一行out.writes;out.newLine;}inOne.close;inTwo.close;out.flush;out.close;tofile.close;inOne=【代码12】//创建指向文件file的输入流inTwo=【代码13】//创建指向inOnefile的输入流whiles=【代码14】!=null{//inTwo读取一行System.out.printlns;}inOne.close;inTwo.close;tempFile.delete;}catchIOExceptione{System.out.printlne;}}}
2、读写基本数据类型数据编写一个Java应用程序,将若干基本数据写入到一个文件,然后再按顺序读出【程序模板】importjava.io.*;publicclassNumberExample{publicstaticvoidmainStringargs[]{inta1=12a2=1180;longb=808080;floatx1=
3.14Fx2=
12.456F;doubled=
1234.9876;booleanboo1=trueboo2=false;charc=我;Filef=【代码1】//创建文件try{FileOutputStreamfos=【代码1】//创建指向f文件输出流DataOutputStreamout_data=【代码2】//创建指向fos的数据输出流【代码2】//out_data将数据a1写入到文件【代码3】//out_data将数据a2写入到文件【代码4】//out_data将数据b写入到文件【代码5】//out_data将数据x1写入到文件【代码6】//out_data将数据x2写入到文件【代码7】//out_data将数据d写入到文件【代码8】//out_data将数据boo1写入到文件【代码9】//out_data将数据boo2写入到文件【代码10】//out_data将数据c写入到文件}catchIOExceptione{}try{FileInputStreamfis=【代码11】//创建指向f文件输入流DataInputStreamin_data=【代码12】//创建指向fis的数据输入流System.out.println【代码13】;//in_data读取int整数System.out.println【代码14】;//in_data读取int整数System.out.println【代码15】;//in_data读取long整数System.out.println【代码16】;//in_data读取float数System.out.println【代码17】;//in_data读取float数System.out.println【代码18】;//in_data读取double数System.out.println【代码19】;//in_data读取boolean数据System.out.println【代码20】;//in_data读取boolean数据System.out.print【代码21;//in_data读取char数据}catchIOExceptione{}}}
3、对象的写入和读取编写一个Java应用程序,将一个Calendar对象写入文件,然后顺序读出该对象,并验证读出的对象是否是原始对象的克隆【程序模板】importjava.util.*;importjava.io.*;publicclassObjectExample{publicstaticvoidmainStringargs[]{Calendarcalendar1=Calendar.getInstance;//创建一个日历对象Calendarcalendar2=Calendar.getInstance;//创建一个日历对象calendar
1.set194991;//将日历时间设置为1949年10月1日注意9表示十月calendar
2.set200591;try{Filef=【代码1】//创建一个名字为a.txt的文件FileOutputStreamfileOut=【代码2】//创建指向文件f的文件输出流ObjectOutputStreamobjectOut=【代码3】//创建指向文件fileOut的对象输出流【代码4】//objectOut写对象calendar1到文件【代码5】//objectOut写对象calendar2到文件FileInputStreamfileIn=【代码6】//创建指向文件f的文件输入流ObjectInputStreamobjectIn【代码7】//创建指向文件fileIn的对象输入流CalendarcloneCalendar1=【代码8】//objectOut读出对象CalendarcloneCalendar2=【代码9】//objectOut读出对象cloneCalendar
1.setTimenewDate;cloneCalendar
2.set999991;int年=calendar
1.getCalendar.YEAR月=calendar
1.getCalendar.MONTH+1日=calendar
1.getCalendar.DAY_OF_MONTH;System.out.printf\ncalendar1的日期:%d-%d-%d年月日;年=calendar
2.getCalendar.YEAR;月=calendar
2.getCalendar.MONTH+1;日=calendar
2.getCalendar.DAY_OF_MONTH;System.out.printf\ncalendar2的日期:%d-%d-%d年月日;年=cloneCalendar
1.getCalendar.YEAR;月=cloneCalendar
1.getCalendar.MONTH+1;日=cloneCalendar
1.getCalendar.DAY_OF_MONTH;System.out.printf\ncloneCalendar1的日期:%d-%d-%d年月日;年=cloneCalendar
2.getCalendar.YEAR;月=cloneCalendar
2.getCalendar.MONTH+1;日=cloneCalendar
2.getCalendar.DAY_OF_MONTH;System.out.printf\ncloneCalendar2的日期:%d-%d-%d年月日;}catchExceptionevent{System.out.printlnevent;}}}
三、思考题
1、如果准备读取一个文件的内容,应当使用FileInputStream流还是FileOutputStream流?
2、FileInputStream流的read()方法和FileReader流的read()方法有何不同?
3、使用ObjectInputStream类和ObjectOutputStream类有哪些注意事项?实验八多线程
一、实验目的
1、掌握线程的概念、线程的生命周期
2、掌握采用继承Thread类创建子线程
3、掌握使用Runnable接口使类线程化
4、掌握数据间的共享与独有
5、了解wait方法和notifyAll方法的使用
二、实验内容
1、线程的生命周期编写一个Java应用程序,在主线程中在创建2个线程,要求线程经历新建、运行、中断和死亡4个状态程序运行的效果如图9-1所示图9-1程序运行效果【程序模板】classTortoiseextendsThread{intsleepTime=0liveLength=0;TortoiseintsleepTimeStringnameintliveLength{this.sleepTime=sleepTime;this.liveLength=liveLength;setNamename;}publicvoidrun{whiletrue{liveLength--;System.out.print@;try{【代码1】//让线程调用sleep方法进入中断状态,sleepTime毫秒后//线程重新排队等待CUP资源}catchInterruptedExceptione{}ifliveLength=0{System.out.printgetName+进入死亡状态\n;【代码2】//结束run方法的语句}}}}classRabbitextendsThread{intsleepTime=0liveLength;RabbitintsleepTimeStringnameintliveLength{this.sleepTime=sleepTime;this.liveLength=liveLength;setNamename;}publicvoidrun{whiletrue{liveLength--;System.out.print*;try{【代码3】//让线程调用sleep方法进入中断状态,//sleepTime毫秒后线程重新排队等待CUP资源}catchInterruptedExceptione{}ifliveLength=0{System.out.printgetName+进入死亡状态\n;【代码4】//结束run方法的语句}}}}publicclassThreadExample{publicstaticvoidmainStringargs[]{Rabbitrabit;rabit=【代码5】//新建线程rabitTortoisetortoise;tortoise=【代码6】//新建线程tortoise【代码7】//启动线程tortoise【代码8】//启动线程rabit}}
2、线程之间共享数据编写一个Java应用程序,在主线程中用Thread类创建2个线程,2个线程共享一个int型的数据,并各自有自己独占的数据程序运行效果如图3-2所示图3-2程序运行效果【程序模板】classBankimplementsRunnable{【代码1】//声明一个int型变量money,初值为100Threadzhangkeven;Bank{【代码2】//创建zhang,Bank对象为zhang的目标对象zhang.setName会计;【代码3】//创建keven,Bank对象为keven的目标对象keven.setName出纳;}publicvoidrun{【代码4】//声明一个int型变量i,初值为0whiletrue{if【代码5】{//判断线程zhang是否正在占有CUP资源i=i+1;money=money+1;System.out.printlnzhang.getName+将money的值改为+money;System.out.printzhang.getName+的局部变量i=+i;ifi=6{System.out.printlnzhang.getName+线程进入死亡状态;【代码6】//使得线程zhang进入死亡状态}try{Thread.sleep1000;}catchInterruptedExceptione{}}elseif【代码7】{//判断线程keven是否正在占有CUP资源i=i-1;money=money-1;System.out.printlnkeven.getName+将money的值改为+money;System.out.printkeven.getName+的局部变量i=+i;ifi=-6{System.out.printlnkeven.getName+线程进入死亡状态;【代码8】//使得线程keven进入死亡状态}try{Thread.sleep1000;}catchInterruptedExceptione{}}}}}classBankExample{publicstaticvoidmainStringargs[]{Bankbank=newBank;bank.zhang.start;bank.keven.start;}}
3、线程的挂起、恢复与终止编写一个Java应用程序同过单击“开始”按钮启动线程,该线程负责移动一个红色的标签同过单击“挂起”按钮暂时中断线程的执行,单击“恢复”按钮恢复线程通过单击“终止”按钮终止线程程序运行效果如图9-3所示图3-3程序运行效果【程序模板】importjava.awt.*;importjava.awt.event.*;classWinextendsFrameimplementsRunnableActionListener{ThreadmoveOrStop;Buttonstarthangresumedie;LabelmoveLabel;booleanmove=falsedead=false;Win{【代码1】//创建线程moveOrStop,当前窗口为moveOrStop的目标对象start=newButton线程开始;hang=newButton线程挂起;resume=newButton线程恢复;die=newButton线程终止;start.addActionListenerthis;hang.addActionListenerthis;resume.addActionListenerthis;die.addActionListenerthis;moveLabel=newLabel线程负责运动我;moveLabel.setBackgroundColor.red;setLayoutnewFlowLayout;addstart;addhang;addresume;adddie;addmoveLabel;setSize500500;validate;setVisibletrue;addWindowListenernewWindowAdapter{publicvoidwindowClosingWindowEvente{}};}publicvoidactionPerformedActionEvente{ife.getSource==start{try{move=true;【代码2】//启动线程moveOrStop}catchExceptionevent{}}elseife.getSource==hang{move=false;}elseife.getSource==resume{move=true;【代码3】//调用resumeThread方法恢复线程}elseife.getSource==die{dead=true;}}publicvoidrun{whiletrue{while!move{try{【代码4】//调用hangThread方法挂起线程}catchInterruptedExceptione1{}}intx=moveLabel.getBounds.x;inty=moveLabel.getBounds.y;y=y+2;ify=200y=10;moveLabel.setLocationxy;try{moveOrStop.sleep200;}catchInterruptedExceptione2{}ifdead==true{【代码5】//结束run方法终止线程}}}publicsynchronizedvoidhangThreadthrowsInterruptedException{【代码6】//调用wait方法}publicsynchronizedvoidresumeThread{【代码7】//调用notifyAll方法}}publicclassStartOrStop{publicstaticvoidmainStringargs[]{Winwin=newWin;}}
三、思考题
1、简述并区分程序、进程和线程三个概念
2、线程有哪几个基本的状态?Java中线程调度遵循何种原则?
3、实现多线程可以用哪两种基本方法?将这两种方法进行比较实验九Java图形用户界面程序设计
一、实验目的
1、了解Java图形用户界面的基本工作原理和界面设计
2、了解图形用户界面的事件响应机制
3、掌握图形用户界面中各种常用的基本组件的使用方法及其事件响应
4、掌握图形用户界面各种布局策略的设计与使用
二、实验内容
1、算术计算器我们在日常生活中经常使用计算器,能买到的电子计算器也种类繁多设计一个Java应用程序,利用Swing的图形界面实现电子计算器的一些基本功能,如计算器的按键、显示功能,实数的加减乘除的连续顺序计算(比如连续在界面上点击“1”“+”“3”“*”“5”“=”,则输出结果为20)以及开方、清零等功能此外,程序还需提供提供退出按钮供用户退出,或者用户可以点击由上角的关闭符号退出
2、简单文本编辑器编写一个Java应用程序,可以模拟记事本程序,创建一个简单的文本编辑器,包含一些基本功能,如文件打开、保存、关闭,文本的复制、粘贴等参考界面如图8-1所示图8-1程序运行效果
三、思考题
1、一个容器使用了BorderLayout布局,如果CENTER区域添加两个组件,程序能否通过编译?程序能否运行?运行效果怎样?
2、容器中添加组件或移去组件后,容器调用validate方法有什么好处?
3、能把组件直接添加到Jframe窗体吗?应当添加到Jframe窗体的什么容器中?
4、MVC模式中模型、视图和控制器的作用各是什么?。