Java实验报告项目一二三.docx
《Java实验报告项目一二三.docx》由会员分享,可在线阅读,更多相关《Java实验报告项目一二三.docx(74页珍藏版)》请在冰点文库上搜索。
Java实验报告项目一二三
Java实验报告
项目一Java语言基础
一、实验学习目标
1.熟悉Java开发环境
2.了解和掌握Java的基本数据类型和基本运算
3.掌握Java语言的条件控制语句,循环语句以及转向语句。
4.理解和掌握数组的基本内容(包括数组声明,初始化,复制等)。
5.掌握多维数组的定义和使用。
二、实验设备
PC
三、实验内容
1.配置JDK运行路径并编译运行第一个Java应用程序。
2.通过求最大值,算术运算,位移运算等小程序体会Java的基本数据类型和基本运算。
3.通过成绩等级判定,九九乘法表等小程序体会Java语言的条件控制语句,循环语句以及转向语句。
4.编写程序实现通过键盘输入10个数字并对这些数字进行排序,然后以从小到大的顺序输出。
5.编写程序实现两个矩阵相乘。
四、实验原理
JDK(JavaDevelopmentToolkit)是Sun公司开发的Java开发工具包,它是一个简单的命令行工具,主要包括软件库、编译Java源代码的编译器、运行Java字节码的解释器,以及测试JavaApplet的Applet阅读器,还有其他一些有用的工具。
JDK主要是通过DOS命令行,在DOS环境下进行Java程序的编译和运行。
常用的JDK工具包括javac、java、javadoc、appletviewer、jar、jdb、javah、javap、extcheck命令。
要了解它们的具体语法描述,可以在设置好JDK路径后,在DOS环境下直接输入相关“工具名称”按回车,就能够看到每种工具的具体使用语法。
五、实验步骤
1.安装好JDK5.0后,如果想在系统的任意目录下编译和运行编写好的Java程序,需要先设置环境变量。
本实验将在Windows系统下的环境变量中设置JDK运行路径(以使用安装程序的默认路径:
C:
\ProgramFiles\Java\jdk1.5.0_06为例)。
(1)鼠标右键单击“我的电脑”,选择“属性”,在弹出对话框中选择“高级”下的“环境变量”,如图1.1所示。
(2)在“系统变量”中选择Path,单击“编辑”按钮,如图1.2所示,在弹出对话框中的“变量值”文本框中添加;C:
\ProgramFiles\Java\jdk1.5.0_06\bin(如果前一个变量值后已有“;”则将路径信息加入即可),单击“确定”按钮,如图1.3所示。
图1.1
图1.2
图1.3
(3)在“环境变量”对话框中单击“新建”按钮,如图1.4所示,在弹出对话框中的“变量名”后输入java_home,“变量值”后输入C:
\ProgramFiles\Java\jdk1.5.0_06,单击“确定”按钮,如图1.5所示。
图1.4
(4)在“环境变量”下单击“新建”按钮,在弹出对话框中的“变量名”后输入classpath,在“变量值”后输入C:
\ProgramFiles\Java\jdk1.5.0_06\lib\tools.jar;C:
\ProgramFiles\Java\jdk1.5.0_06\jre\lib\rt.jar;.;,单击“确定”按钮,如图1.6所示。
图1.5图1.6
至此环境变量设置完毕,可以通过在DOS环境下直接键入javac命令按回车来检查环境变量设置是否成功,如果设置成功则可看到如图1.7所示结果。
图1.7
在以后需要通过DOS命令直接编译和执行Java程序时,只需进入Java程序所在的存放目录,通过javac和Java命令编译和执行相应程序。
内容一:
设置好JDK5.0的路径后,使用任意文本编辑器编写第一个Java程序,程序源代码如图1.8所示。
将文件保存成以HelloWorld.java为文件名的文件。
使用DOS命令进入HelloWorld.java文件所存放的目录(如:
D:
\Example),使用javac命令编译该应用程序,通过编译后在该文件夹中会生成一个名为HelloWorld.class的class文件,该class文件包含程序的字节码(Java字节码中包含的是Java解释程序将要执行的指令码),使用Java命令执行该class文件
运行结果截图如下所示:
内容二:
阅读并分析程序Example1.java,程序源代码如图所示。
请写出分析的结果。
然后新建Example1.java文件,将程序输入并保存。
使用DOS命令进入其所存放的目录,编译运行该程序,看运行结果是否与之前的分析一致。
如果不一致,请分析出错的原因。
以上程序中结果1可看做:
(--i)+i+i=-3,此时i=0
结果2可看作:
i+(++i)=0+1=1,此时i=1
结果3可看作:
i=i+i+(i+4)=6
结果4可看作:
i=3+(3*2)%i=3+0=3
结果5可看作:
x=x+1.2*3+x=8.2
结果6可看作:
x=x%3+4*2+x=2.2+8+8.2=18.4
程序的运行结果如下:
所以程序正确。
内容三:
阅读如图所示程序。
新建CompareTwoNumbers1.java文件,输入程序,将程序中“代码1-4”处补充完整并保存。
使用DOS命令进入其所存放的目录,编译运行该程序。
通过键盘在控制台输入任意2个实数,将完整程序和运行结果截图写入实验报告。
补充后的程序为:
运行结果为:
实验小结:
一开始不知道代码到底应该填什么,试了很多次都没有成功,就像代码1,我开始确实不知道应改怎样实例化一个scanner对象,而且在代码四那也试了很多次。
这次实验让我不再只是认为代码就是数字什么的了。
内容四:
阅读如图所示程序。
新建BitMovement.java文件,输入程序,将程序中“代码1-4”处补充完整并保存。
使用DOS命令进入其所存放的目录,编译运行该程序。
通过键盘在控制台输入任意1个整数,分析运行结果并将完整程序和运行结果截图写入实验报告
补充后程序为:
运行结果为:
结果分析:
这个程序的主要目的是为了实验数的位移,<<5和>>3分别表示向左移5位和向右移3位,也即在原来的基础上分别乘以2的5次方和除以2的三次方,但是如果右移时溢出了则结果为0;结果中8*32即为256,8/8为1,而且因为4<8,所以会溢出,所以结果为0。
内容五:
阅读如图所示程序,该程序要求将10个学生的成绩按等级输出(如>=90:
A,89-90:
B等)。
新建ChineseGrade2.java文件,输入程序,将如图所示程序补充完整并保存。
使用DOS命令进入其所存放的目录,编译运行该程序。
通过键盘在控制台输入10个学生的成绩,并将完整程序和运行结果截图写入实验报告。
补充后程序为:
实验运行结果为:
实验小结:
一开始看到这个程序感觉挺简单的,因为以前这样程序做了很多,但是真正在运行的时候才知道不是想象的那么简单,这次的问题主要是出在返回值上,开始试了很多种方法,但是都不成功,刚突然看见在就就java中字符型用String而不是char。
内容六:
阅读如图所示程序,该程序要求输出一个九九乘法表。
新建MultiplyList1.java文件,输入程序,将如图所示程序补充完整并保存。
使用DOS命令进入其所存放的目录,编译运行该程序。
并将完整程序和运行结果截图写入实验报告。
若直接将程序补充:
运行结果为:
若将output放到括号外:
运行结果为:
实验小结:
由上比较可以看出,第二种情况更加符合九九乘法表的要求,看起来也更加方便一点,这个主要是语句所放的位置的问题。
内容七:
阅读如图所示程序。
新建InsertSort.java文件,输入程序,将程序中“代码1-4”处补充完整并保存。
使用DOS命令进入其所存放的目录,编译运行该程序。
并将完整程序和运行结果截图写入实验报告。
补充后程序为:
运行后的结果为:
实验小结:
整体的来说这个程序相对还是比较简单,最大的问题就是在进行插序程序是没有注意数据类型,使得有的不兼容。
内容八:
阅读如图所示程序,该程序通过键盘输入两个矩阵(前提是作为乘数的矩阵的列数和作为被乘数的矩阵的行数相等),并将它们相乘的结果输出。
新建MatrixMultiply.java文件,输入程序,找出程序中的4处错误并说明错误原因。
使用DOS命令进入其所存放的目录,编译运行该程序。
并将完整程序和运行结果截图写入实验报告。
以上程序四处错误是:
1、
2、
3、
4、
修改后的程序为:
程序运行结果为:
实验小结:
这个程序很容易在数组初始化的时候加上多余的东西,从而使程序出错,这个程序一方面是早教我们如何编程,另一方面是在教我们尽量不要犯“未检查错误”,这种错误很让人吃亏。
项目二Java面向对象程序设计
一、实验学习目标
1.理解类的定义和对象的声明
2.理解掌握构造函数的使用
3.理解静态成员和实例成员的区别
4.理解掌握子类概念和方法覆盖的使用
5.理解掌握多态和动态绑定的含义与使用
二、实验设备
PC
三、实验原理
1.类(class)和对象(object)是面向对象方法的核心概念。
类是对一类事物描述,是抽象的、概念上的定义;对象是实际存在的该类事物的每个个体,因而也称实例(instance)。
2.在Java类中声明变量、方法和内部类时,可使用关键字static做为修饰符。
static标记的变量或方法由整个类(所有实例)共享,如访问控制权限允许,可不必创建该类对象而直接用类名加“.”调用。
static成员也称类成员或静态成员,如:
类属性、类方法、静态方法等。
3.Java语言中变量按被声明的位置划分为局部变量(方法或语句块内部定义的变量)个成员变量(方法外部、类的内部定义的变量)。
局部变量的作用域就是它所在的方法或语句块在程序调用方法(进入语句块)时,局部变量才被创建并可用,随方法(语句块)的退出。
成员变量在类的定义中声明,在创建对象的同时创建有关的成员变量。
成员变量依附于对象存在,具有与对象相同的生存期和作用域。
4.在方法覆盖(又名方法重写)的时候应注意:
在子类中可以根据需要对从父类中继承来的方法进行重写。
重写方法必须和被重写方法具有相同的方法名称、参数列表和返回值类型。
重写方法不能使用比被重写方法更严格的访问权限。
5.多态性是指具有相同的方法接口,却有不同的实现。
在Java中超类往往定义一个通用的方法,而其不同的实现则由它不同的子类来完成。
当通过对象来调用这样一个方法时,Java会根据运行时该对象的实际类型来决定用方法的哪个版本来执行,即动态绑定。
四、实验内容
1.通过一个程序体会类的定义和对象的声明以及构造函数的使用。
2.通过一个程序体会静态成员和实例成员的区别
3.通过一个程序体会子类概念和方法覆盖的使用
4.通过一个程序体会多态和动态绑定的含义与使用
五、实验步骤
内容一:
(1)阅读如图2.1所示程序。
该程序实现了一个圆环类Ring,该类有3个属性,分别是内半径innerRadius,外半径outerRadius和颜色color,这些属性可以自行设置也可以得到其值,并且该程序还可以返回圆环的面积Area。
图2.1
(2)新建Ring.java文件,输入程序,将程序中“代码1-4”处补充完整并保存。
(3)使用DOS命令进入其所存放的目录,编译运行该程序。
并将完整程序和运行结果截图写入实验报告。
补充后程序为:
实验运行结果为:
实验小结:
就代码的补充而言,是很简单的,主要问题是出在getcolor上,其类型为String,很容易写成char。
内容二:
阅读如图2.2所示程序。
该程序实现了一个圆类Circle,该类有3个属性,分别是圆周率pi,半径radius和圆对象个数objectNo,其中圆周率和圆对象个数为static成员。
并且该程序还有两个static方法用来设置圆周率和显示当前圆对象个数。
图2.2
(2)新建Circle.java文件,输入程序并保存。
(3)使用DOS命令进入其所存放的目录,编译运行该程序。
分析观察运行结果并将运行结果截图写入实验报告。
(4)能否将程序中的cir1.setRadius(10)改为Circle.setRadius(10)?
为什么?
将圆周率pi的static修饰符去掉,会出现什么结果?
为什么?
将setPI(doublep)的static修饰符去掉呢?
圆对象个数objectNo为什么要设置为static,它的作用是什么?
将你的分析写入实验报告。
补充修改后程序为:
运行结果为:
实验分析和小结:
将程序中的cir1.setRadius(10)改为Circle.setRadius(10)的运行结果为
因为Circle.setRadius()不是静态方法,所以不能在static中调用。
将圆周率pi的static修饰符去掉的运行结果为
将setPI(doublep)的static修饰符去掉的运行结果为
圆对象个数objectNo设置为static是因为在main函数中要静态调用Circle(),其作用是为了方便调用,是程序编译运行时不出错。
开始的时候我是把程序保存为Circlr.java,但是不论怎么做都不能运行成功,但是后来把程序重命名为StaticTest.java就可以运行了,这是因为开始我没有注意main函数在哪一个类中。
内容三:
阅读如图2.3所示程序。
该程序实现了一个父类Telephone和其子类Mobilephone,该类有电话品牌,电话号码等属性,另外还有计算话费和显示信息等方法。
子类Mobilephone除了具有父类的属性外,还有网络类型,被叫时间等属性,另外它还有自己的计算话费和显示信息的方法。
图2.3
(2)新建Inheritance.java文件,输入程序,将程序中“代码1-5”处补充完整并保存。
(3)使用DOS命令进入其所存放的目录,编译运行该程序。
并将完整程序和运行结果截图写入实验报告。
(4)Mobilephone类的display()方法中的callCost()方法调用的是谁的方法?
如何调用父类的callCost()方法?
另外,将Mobilephone类的构造方法中的super(b,num)去掉,有什么结果?
为什么?
将你的分析写入实验报告。
补充后程序为:
运行结果为:
实验分析和小结:
Mobilephone类的display()方法中的callCost()方法调用的是Telephone类的方法,将Mobilephone类的构造方法中的super(b,num)去掉后运行结果为
因为在子类的构造方法中需要使用super(argument_list)语句调用父类的构造方法。
内容四:
阅读如图2.4所示程序。
该程序实现了三个类:
抽象父类Student(包括了一些学生的基本信息,如姓名,所学课程,课程成绩等)和其子类Undergraduate,Postgraduate。
两个子类之间的主要差别是计算课程成绩等级的标准有所不同。
图2.4
(2)新建Polymorphism.java文件,输入程序,将程序中“代码1-5”处补充完整并保存。
(3)使用DOS命令进入其所存放的目录,编译运行该程序。
并将完整程序和运行结果截图写入实验报告。
(4)能否在main()方法中添加语句Studentss1=newStudents("陈建平")?
为什么?
main()方法中的语句students[i].calculateGrade()都是调用哪些类的calculateGrade()方法?
将你的分析写入实验报告。
补充后程序为:
运行结果为:
实验分析和小结:
在main()方法中添加语句Studentss1=newStudents("陈建平")的运行结果为:
因为程序中没有Students()这个方法。
main()方法中的语句students[i].calculateGrade()调用的有Undergraduate和Postgraduate类的calculateGrade()方法,因为在五个学生中既有本科生又有研究生,所以两个类中的方法都有调用。
这个程序最容易出错的就是在初始化courseGrade为空串时和按课程索引号设置课程成绩,初始化空串时容易把null写成NULL,而在设置成绩时开始有点不知道如何写。
最后看到getCourseScore时就知道了,虽然不是很懂。
项目三Java高级编程
一、实验学习目标
1.了解掌握javax.swing包中的常用GUI组件
2.了解掌握事件处理机制
3.了解掌握5种常用的布局管理器
4.了解掌握javax.swing包中外观设置
5.了解掌握字节流和字符流概念及其使用
6.了解掌握ObjectInputStream,ObjectOutputStream的使用和对象序列化概念
7.掌握ZipOutputStream以及ZipIputStream的使用
二、实验设备
PC
三、实验内容
1.通过一个名片录入界面程序体会javax.swing包中的常用GUI组件和常用的布局管理器的使用。
2.通过一个文字字体设置程序体会javax.swing包中外观设置和事件处理机制。
3.通过在文件中对对象进行数据的读写的程序体会ObjectInputStream,ObjectOutputStream的使用和对象序列化概念。
4.通过压缩和解压两个小程序体会ZipOutputStream以及ZipIputStream的使用。
四、实验原理
1.AbstractWindowsToolkit(AWT)是最原始的JavaGUI工具包。
AWT的缺省实现使用了"对等"机制,即每一个JavaGUI窗口部件都在底层的窗口系统中有一个对应的组件。
例如,每一个java.awt.Button对象将在底层窗口系统中创建一个唯一对应的button。
当用户点击那个按钮的时候,事件将从本地实现库传送到Java虚拟机里,并且最终传送到与java.awt.Button对象相关联的逻辑。
对等系统的实现以及Java组件与对等组件之间的交流的实现都隐藏在底层JVM实现中,Java语言级的代码仍然跨平台。
AWT的主要优点是,它在Java技术的每个版本上都成为了一种标准配置,包括早期的Web浏览器中的Java实现。
另外它也非常稳定,这意味着我们不需要单独安装这个工具包,在任何一个Java运行环境中都可以使用它。
AWT是一个非常简单的具有有限GUI组件、布局管理器和事件的工具包。
因为Sun公司决定为AWT使用一种最小公分母(LCD)的方法(即AWT只拥有所有平台上都存在的组件的公有集合)。
因此它只会使用为所有Java主机环境定义的GUI组件。
最终的结果非常不幸,有些经常使用的组件,例如表、树、进度条等,都不支持。
对于需要更多组件类型的应用程序来说,需要从头开始创建这些组件,这是一个很大的负担。
2.JavaSwing是JavaFoundationClasses(JFC)的一部分,它是试图解决AWT缺点的一个尝试。
在Swing中,Sun开发了一个经过仔细设计的、灵活而强大的GUI工具包。
Swing是在AWT组件基础上构建的,所有Swing组件实际上也是AWT的一部分。
Swing使用了AWT的事件模型和支持类,例如Colors、Images和Graphics。
为了克服在不同主机上行为也会不同的缺点,Swing将对主机控件的依赖性降至了最低。
实际上,Swing只为诸如窗口和框架之类的顶层组件使用对等体。
大部分组件(JComponent及其子类)都是使用纯Java代码来模拟的。
这意味着Swing天生就可以在所有主机之间很好地进行移植。
因此,Swing通常看起来并不像是本地程序。
实际上,它有很多外观,有些模拟(尽管通常并不精确)不同主机的外观,有些则提供了独特的外观。
Swing对基于对等体的组件使用的术语是重量级(heavyweight),对于模拟的组件使用的术语是轻量级(lightweight)。
实际上,Swing可以支持在一个GUI中混合使用重量级组件和轻量级组件,例如在一个JContainer中混合使用AWT和Swing控件,但是如果组件产生了重叠,就必须注意绘制这些控件的顺序。
Swing无法充分利用硬件GUI加速器和专用主机GUI操作的优点。
结果是Swing应用程序可能比本地GUI的程序运行速度都慢。
Sun花费了大量的精力来改进Swing的性能,这种缺点正在变得日益微弱。
由于Swing的设计更加健壮,因此其代码基础也更坚实。
这意味着它可以在一台健壮的机器上比AWT运行得更好。
3.Java是通过数据流来实现数据的输入和输出的。
通过数据流,程序可以从外部获得数据信息,也可以将数据信息传送到外部。
在Java中,Reader和Writer是所有基于字符的数据流类的父类,它们可以处理16位的字符。
另外,InputStream和OutputStream是所有基于字节的数据流类的父类,它们处理8位的字节数据。
Java的对象序列化就是将对象的状态转换成字节流,以后可以通过这些字节信息再生成相同状态的对象。
对象序列化能使对象获得持续性,可以长久保存。
五、实验步骤
1.阅读分析如图3.2所示程序。
该程序实现了一个名片录入界面,当点击“取消”按钮时程序退出。
程序运行结果如图3.1所示。
图3.1
图3.2
(2)新建CardManager.java文件,输入程序,将程序中“代码1-7”处补充完整并保存。
(3)使用DOS命令进入其所存放的目录,编译运行该程序。
并将完整程序和运行结果截图写入实验报告。
(4)CardManager()方法中的ButtonGroup有什么用处?
如果改变程序窗口的大小,会发生什么情况?
为什么?
将你的分析写入实验报告。
(5)参考JavaAPI文档,将本程序修改为用GridBagLayout布局管理器管理组件,使得组件能随程序窗口的变化成比例变化。
将修改后的程序和运行结果截图写入实验报告。
补充后程序为:
运行结果为:
实验分析和小结:
CardManager()方法中的ButtonGroup是为创建按钮,及程序中的性别按钮,如果改变窗口的大小
运行结果为:
虽然窗口大小改变了,但是并没有设置要求各项也随着窗口的变化而拉伸,所以就只是窗口改变而已。
2.阅读分析如图3.4所示程序。
该程序可根据用户的选择对文字的字体,大小,颜色,风格等进行设置。
程序运行结果如图3.3所示。
图3.3
图3.4
(2)新建ArtFont.java文件,输入程序,将程序中“程序段1-4”处补充完整并保存。
(3)使用DOS命令进入其所存放的目录,编译运行该程序。
并将完整程序和运行结果截图写入实验报告。
(4)将程序中的语句colorBtn.addActionListener(this)改为如下形式:
colorBtn.addActionListener(newActionListener(){
if(e.getSource()==colorBtn){//改变颜色
colorStyle=J