Java实验指导书(2013版)
发布时间:2024-11-08
发布时间:2024-11-08
HUBEI UNIVERSITY OF AUTOMOTIVE TECHNOLOGY
JAVA语言程序设计
实验指导书
齐心 编著 翟亚红 审核
计算机实验教学示范中心
2013年1月
目录
目录......................................................................................................................................................... 2 实验一 Java编程环境使用 ...................................................................................................................... 4
实验目的........................................................................................................................................... 4 实验导读........................................................................................................................................... 4 实验内容........................................................................................................................................... 5 实验总结......................................................................................................................................... 10 实验二 Java类编程练习 ....................................................................................................................... 11
实验目的......................................................................................................................................... 11 实验导读......................................................................................................................................... 11 实验内容......................................................................................................................................... 14 实验总结......................................................................................................................................... 29 实验三 图形用户界面设计.................................................................................................................... 30
实验目的......................................................................................................................................... 30 实验导读......................................................................................................................................... 30 实验内容......................................................................................................................................... 31
实验总结......................................................................................................................................... 40 实验四 Java事件处理 ........................................................................................................................... 41
实验目的......................................................................................................................................... 41 实验导读......................................................................................................................................... 41 实验内容......................................................................................................................................... 46 实验总结......................................................................................................................................... 56 实验五 多线程程序设计 ....................................................................................................................... 58
实验目的......................................................................................................................................... 58 实验导读......................................................................................................................................... 58 实验内容......................................................................................................................................... 60 实验总结......................................................................................................................................... 68 参考文献: ............................................................................................................................................ 69 附录一 Java Code之多态 ...................................................................................................................... 70 附录二 内部类的用法 ............................................................................................................................ 74 附录三 和类有关的匿名类.................................................................................................................... 75 附录四 和接口有关的匿名类 ................................................................................................................ 77
实验一 Java编程环境使用
实验目的
1. 掌握Java运行环境的配置
2. 掌握Java程序的编写、编译、运行等过程 3. 熟悉Java语言的基本语法和运行原理
4. 掌握Java的基本数据类型、表达式和程序控制结构 5. 熟悉Eclipse开发环境的基本使用方法
实验导读
1. Java的标准输入和输出流
http://ng.System类提供了三种有用的标准流:标准输入流(System.in)、标准输出流(System.out)和标准出错流(System.err)。通过他们可以实现数据的输入输出操作。
1) 标准输入流(System.in)
通常用于读取用户从键盘输入或用户定义的输入设备的输入。类java.util.Scanner结合System.in实现对指定数据的输入。
2) 标准输出流(System.out)
用于程序的输出,通常用来在屏幕或用户指定的输出设备上显示信息。有两种典型用法:System.out.print(data)实现在当前位置输出数据,System.out.println(data)实现换行输出数据到屏幕或用户定义的输出设备。
3) 标准出错流(System.err)
用于显示出错信息,采用System.err.print(data)或System.err.println(data)将指定的data输出到指定的输出设备,默认设备为屏幕。
2. javax.swing.JOptionPane
对话框式的输入和输出,可以提供较好的界面处理。能通过弹出一个标准对话框,来提示用户。可以通过这个性质来实现具有对话框显示效果的数据输入和输出。例如:
String str=JOptionPane.showInputDialog("输入您的猜测:"); 3. java.util.Scanner
java.util.Scanner类可将文本转换成原语或字符串。Scanner对象通过next()系列方法将文本标识转换成不同类型的值。通常和标准输入流(System.in)结合,允许用户通过标准输入流读入数据。Scanner类提供的方法:nextByte()、nextshort()、nextLong()、nextDouble()、nextFloat()、nextInt()等。例如:
Scanner scanner=new Scanner(System.in);
int i=http://Int(); //从键盘输入一个整数 scanner.close();
4. Java Applet小应用程序
Java Applet必须由浏览器来运行,因此必须编写一个超文本文件(含有applet标记的Web页),通知浏览器来运行这个Java Applet。下面是一个简单的HTML文件,使用记事本编辑如下:
<applet code= AppletTest.class height=300 width=300> </applet>
超文本中的标记<applet>和</applet>用于通知浏览器运行一个Java Applet,code通知浏览器运行哪个Java Applet。code的=后面是主类的字节码文件,width和height规定了Java Applet的宽度和高度。如果如果HTML文件和字节码文件不在同一目录里,必须在HTML文件中增加选项codebase,来指定小程序中.class文件所在的目录。
实验内容
1. 设置实验环境
1) 安装JDK:下载JDK包以后,按安装向导的提示依次安装。 2) 更新环境变量:
a) 在“我的电脑”单击“属性”菜单项,进入“系统属性”对话框; b) 选择“高级”选项页;单击“环境变量”按钮,弹出“环境变量”对话框;
c) 选择“新建系统变量”,弹出“新建系统变量”对话框,在“变量名”文本框输入“JAVA_HOME”,在“变量值”文本框输入JDK的安装路径; d) 编辑“系统变量”中的”path”变量的值,在“变量值”最后增加JDK安装目录下的bin目录,例如”%JAVA_HOME%\bin; ”;
e) 在“系统变量”选项区域中查看CLASSPATH 变量,如果不存在,则新建变量CLASSPATH,否则选中该变量,单击“编辑”按钮,在“变量
值”文本框的起始位置添加”.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;”。
3) 进入命令行控制台,分别输入“java“、“java -version“和“javac“命令,看是否能够出现正确的提示信息(注意:配置完成后需将原来打开的命令提示符窗口关闭并重新打开运行)。
2. 简单应用程序的编写
1) 在D盘上建立javalab文件夹;
2) 打开记事本,在其中输入以下代码;
3) 4)
5) 6)
7)
8) 9)
public class PrintA {
public static void main(String arg[]) { System.out.println(" @"); System.out.println(" @ @"); System.out.println(" @ @ @"); System.out.println(" @ @ @ @"); } }
将其保存在javalab目录下,并命名为PrintA.java; 打开命令行窗口,输入:
C:\Documents and Settings\Administrator>d: D:\>cd javalab D:\javalab> 运行:
D:\javalab>javac PrintA.java 查看是否已经生成class文件; D:\javalab>dir/w
[.] [..] PrintA.java PrintA.class 运行程序查看结果是否正确。 D:\javalab>java PrintA @ @ @ @ @ @ @ @ @ @
修改PrintA.java的文件名为printa,然后重新编译会有什么结果?为什么?
修改PrintA.java文件中的main方法为main1,然后重新编译并运行会有什么结果?为什么?
3. 简单Applet的编写
1) 打开记事本,在其中输入以下代码;
import java.awt.*;
import java.applet.Applet;
public class AppletTest extends Applet { public void init() { setBackground(Color.cyan); }
public void paint(Graphics g) {
g.setColor(Color.blue);
//在Java Applet中绘制一行文字:“这是一个Java Applet 程序” g.drawString("这是一个Java Applet 程序",10,30); g.setColor(Color.red);
g.setFont(new Font("宋体",Font.BOLD,36)); //在Java Applet中绘制一行文字:“我改变了字体” g.drawString("我改变了字体",10,100); } }
2) 将其保存在javalab目录下,并命名为AppletTest.java; 3) 将其编译成.class文件;
4) 打开记事本,在其中输入以下代码:
<applet code= AppletTest.class height=300 width=300> </applet>
5) 将其保存在javalab目录下,并命名为AppletTest.html; 6) 在命令行下运行:
D:\javalab>appletviewer AppletTest.html
7) 还有一种查看方式,就是直接双击AppletTest.html,直接在浏览器中查看结果。 8) 将文件中class前面的public去除后再编译运行,看看会有什么结果,为什么?
9) 如果将class文件放置在D:\classes目录下,应该怎样修改AppletTest.html文件?如果将其放置在AppletTest.html所在文件夹的classes子目
录下还可以怎样写?
4. String类的常用方法(StringExample.java)
阅读分析下面程序,把程序中的代码补充完整,并查看结果。
public class StringExample {
public static void main(String args[]) {
String s1 = new String("you are a student"), s2 = new String("how are you");
if (【补充代码】) // 使用equals方法判断s1与s2是否相同 {
System.out.println("s1与s2相同"); } else {
System.out.println("s1与s2不相同"); }
String s3 = new String("22030219851022024"); if (【补充代码】) // 判断s3的前缀是否是“220302” {
System.out.println("吉林省的身份证"); }
String s4 = new String("你"), s5 = new String("我"); if (【补充代码】)// 按着字典序s4大于s5的表达式 {
System.out.println("按字典序s4大于s5"); } else {
System.out.println("按字典序s4小于s5"); }
int position = 0;
String path = "c:\\java\\jsp\\A.java";
position = 【补充代码】// 获取path中最后出现\\的位置
System.out.println("c:\\java\\jsp\\A.java中最后出现\\的位置:" + position); String fileName = 【补充代码】// 获取path中“A.java”子字符串
System.out.println("c:\\java\\jsp\\A.java中含有的文件名:" + fileName);
}
}
String s6 = new String("100"), s7 = new String("123.678"); int n1 = 【补充代码】 // 将s6转化成int型数据
double n2 = 【补充代码】 // 将s7转化成double型数据 double m = n1 + n2; System.out.println(m);
String s8 = 【补充代码】 // String调用valuOf(double n)方法将m转化为字符串对象 position = s8.indexOf(".");
String temp = 【补充代码】 // 获取s8中小数点后面的小数
System.out.println("数字" + m + "有" + temp.length() + "位小数"); String s9 = new String("ABCDEF");
char a[] = 【补充代码】 // 将s9存放到数组a中 for (int i = a.length - 1; i >= 0; i--) { System.out.print(" " + a[i]); }
5. 在控制台下求两个实数的最大值(CompareTwoNumbers.java)
要求:从键盘输入任意两个实数,比较两个数字的大小,将较大的数输出。数据输入和输出用Java的标准输入流和输出流来实现。请按照代码提示编写完整程序,并查看结果。
代码提示:
import java.util.Scanner; //导入Scanner对象;
Scanner scanner = new Scanner(System.in);//实例化一个Scanner对象; number1 = scanner.nextDouble();//从键盘输入一个实数赋值给number1;
6. 猜数字游戏(GuessNumber.java)
要求:系统生成一个1至100之间的随机整数(sysNumber),利用JoptionPane对话框输入你的猜测整数(guessNumber),循环猜测两个数是否相等,如果(guessNumber>sysNumber),则提示“猜大了,再输入你的猜测:”,并重新输入新的猜测整数,如果(guessNumber<sysNumber),则提示“猜小了,再输入你的猜测:”,并重新输入新的猜测整数,直到相等控制台打印“猜对了”。请按照代码提示编写完整程序,并查看结果。
代码提示:
//生成1至100之间的随机数
int sysNumber = (int)(Math.random()*100)+1; //输入你的猜测,注意数据类型的转换
String str = JOptionPane.showInputDialog("输入您的猜测:");
guessNumber = Integer.parseInt(str);
7. 编写Java程序(SwapMatrix.java)
要求:定义一个二维数组,并给二维数组赋值,分别打印原二维数组和行列互调后的二维数组。
123789
147369
456 显示出的结果为 258
实验总结
请书写你对本次实验有哪些实质性的收获和体会,以及对本次实验有何良好的建议?
实验二 Java类编程练习
实验目的
1. 掌握类及类的声明 2. 掌握对象的定义和使用 3. 掌握接口的定义与实现
实验导读
继承、封装和多态是Java面向对象的3大特性,它们是面向对象程序开发的重要环节。继承机制的使用可以复用一些定义好的类,减少重复代码的编写。多态机制可以动态调整对象的调用,降低对象之间的依存关系。同时为了优化继承与多态,一些类除了继承父类还可以使用接口的形式,Java中的类可以同时实现多个接口,接口被用来建立类与类之间关联的标准。
1. 类的继承(extends)
继承可以理解为现实世界中的“是一种(is-a)”关系,实现继承是通过extends关键字在声明类的时候指定其父类,其声明格式如下:
继承某个父类而生成新的子类不但拥有父类的变量与方法,还可以为子类添加新的成员变量和成员方法,以增强父类的功能,也就是所谓的扩展。还可以使用super关键字引用父类的方法,然后再添加新的业务代码。甚至还可以在子类中为父类的某个方法定义多个重载方法,增加该类的灵活性。
2. 访问修饰符
Java中定义了private、public、protected和默认的访问修饰符,这些修饰符控制着对类和类的成员变量以及成员方法的访问规则。另外,还可以辅助static和final关键字定义特殊规则。
public是公有类型的权限修饰符,使用public修饰的类、成员变量和成员方法,其他类都可以访问,包括任意包中的任意类以及子类。
private是私有类型的权限修饰符,使用private修饰的成员变量和成员方法,只能在本类中被使用,在子类中是不可见的,并且对其他包的类也是不可见的。
protected是保护级别的权限修饰符,它保护成员不会被其他包或非子类访问。也就是说protected修饰的成员只能被子类和同一包中定义的其他类访问。
当不添加任何权限修饰符时,编译器会使用默认权限修饰符,该修饰符的权限级别与protected类似,不同之处在于,其他包定义的子类无法访问父类默认权限修饰的成员。
3. 封装(encapsulation)
封装是指把对象的属性隐藏在对象的内部,不允许外部直接访问和修改。Java规范中的设置器和访问器就是实现封装的标准方法,它们用于设置和获取对象的属性值。
设置器方法的命名一般以set作为方法名的前缀,以属性名作为后缀。
访问器方法的命名一般以get或is作为方法名称的前缀,以属性名作为后缀。对于boolean类型的属性,应该使用is前缀定义访问器 方法。例如:
public class Car {
private String color; private boolean running; public String getColor() { return color; }
public void setColor(String color) { this.color = color; }
public boolean isRunning() { return running; }
public void setRunning(boolean running) { this.running = running; } }
4. Object类
在Java中,所有的类都直接或间接继承了http://ng.Object类,它是所有类的父类。Object类中常用的两个方法为equals()和toString()方法。任何类都可以重写Object类中的方法。 5. 对象的上转型对象
假设B类是A类的子类或间接子类,当我们用子类B创建一个对象,并把这个对象的引用放到A类的对象中时:A a = new B(); 称这个A类对象a是子类对象b的上转型对象。
上转对象不能操作子类新增的成员变量(失掉了这部分属性);不能使用子类新增的方法(失掉了一些功能)。 上转型对象可以操作子类继承或隐藏成员变量,也可以使用子类继承的或重写的方法。
上转型对象操作子类继承或重写的方法时,就是通知对应的子类对象去调用这些方法。因此,如果子类重写了父类的某个方法后,对象的上转型对象调用这个方法时,一定是调用了这个重写的方法。
可以将对象的上转型对象再强制转换到一个子类对象,这时,该子类对象又具备了子类所有属性和功能。
6. 多态(polymophism)
多态性就是指父类的某个方法被其子类重写时,可以各自产生自己的功能行为。
当一个类有很多子类时,并且这些子类都重写了父类中的某个方法。那么当我们把子类创建的对象的引用放到一个父类的对象中时,就得到了该对象的一个上转型对象,那么这个上转的对象在调用这个方法时就可能具有多种形态。多态性的实现:通过方法的重载(overloading)、覆盖(overriding)和接口来实现。
方法重载是Java实现面向对象的多态性机制的一种方式。同一个类中多个方法有相同的名字,不同的参数列表,这种情况称为方法重载。返回
类型不同并不足以构成方法重载。当重载方法被调用时,编译器根据参数的类型和数量来确定实际调用哪个重载方法的版本。
方法覆盖是Java实现多态性机制的另一种方式。在类层次结构中,如果子类中的一个方法与父类中的方法有相同的方法名并具有相同数量和类
型的参数列表,这种情况称为方法覆盖。当一个覆盖方法通过父类引用被调用,Java根据当前被引用对象的类型来决定执行哪个版本的方法。可以通过super关键字调用直属父类中被覆盖的方法版本。 参考代码:附录一 Java Code之多态。 7. 接口
接口是特殊的类,只有方法的原型,方法的实现在其子类中具体定义。Java不支持多继承性,即一个类只能有一个父类。单继承性使得Java简单,易于管理程序。为了克服单继承的缺点,Java使用了接口,一个类可以实现多个接口。
一个类通过使用关键字implements 声明自己使用一个或多个接口。如果使用多个接口,用逗号隔开接口名。如:
如果一个类使用了某个接口,那么这个类必须实现该接口的所有方法,即为这些方法提供方法体。接口只关心功能,并不关心功能的具体实现。
接口回调是指:可以把实现某一接口的类创建的对象的引用赋给该接口声明的接口变量中。那么该接口变量就可以调用被类实现的接口中的方法。实际上,当接口变量调用被类实现的接口中的方法时,就是通知相应的对象调用接口的方法。
参考代码:附录四 和接口有关的匿名类 8. 内部类
Java支持在一个类中声明另一个类,这样的类称作内部类,而包含内部类的类成为内部类的外嵌类。 内部类的外嵌类的成员变量在内部类中仍然有效,内部类中的方法也可以调用外嵌类中的方法。内部类的类体中不可以声明类变量和类方法。外嵌类的类体中可以用内部类声明对象,作为外嵌类的成员。
参考代码:附录二 内部类的用法 9. 匿名类
和类有关的匿名类
当使用类创建对象时,程序允许我们把类体与对象的创建组合在一起,也就是说,类创建对象时,除了构造方法还有类体,此类体被认为是该类的一个子类去掉类声明后的类体,称作匿名类。匿名类就是一个子类,由于无名可用,所以不可能用匿名类声明对象,但却可以直接用匿名类创建一个对象。
匿名类一定是内部类,匿名类可以继承父类的方法也可以重写父类的方法,匿名类可以访问外嵌类中的成员变量和方法,匿名类的类体中不可以声明static成员变量和static方法。匿名类的主要用途就是向方法的参数传值。
参考代码:附录三 和类有关的匿名类 和接口有关的匿名类
Java允许直接用接口名和一个类体创建一个匿名对象,此类体被认为是实现了接口的类去掉类声明后的类体,称作匿名类。 参考代码:附录四 和接口有关的匿名类
实验内容
1. 对象的创建和使用
编写一个圆环类Ring的Java程序。圆环类有3个数据成员,分别是内半径innerRadius,外半径outerRadius和颜色color,这些属性通过get和set方法进行封装。另外,圆环类中的getArea方法可以返回其面积。把程序中的代码补充完整,并查看结果。
public class Ring {
private double innerRadius; private double outerRadius; public String color;
public Ring(double iRadius, double oRadius, String c) {
//初始化数据成员 【补充代码…】 }
//用get和set方法封装数据成员 【补充代码…】
public double getArea() {
【补充代码…】 }
public static void main(String[] args) { Ring ring = new Ring(5,8,"red");
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的外半径为6 ring.setColor("blue");
System.out.println("圆环的内半径: " + ring.getInnerRadius( )); System.out.println("圆环的外半径: " + ring.getOuterRadius( )); System.out.println("圆环的颜色: " + ring.color);
System.out.println("圆环的面积: " + ring.getArea()); } }
思考:
1) 将程序中的语句Ring ring = new Ring(5,8,"red"); 改成Ring ring = new Ring();修改后编译运行,此时有错误发生吗?分析错误的原
因。
2) 接着为程序添加一个如下所示的默认构造函数,观察程序运行是否还有上述错误发生?
public Ring() {
innerRadius = 1.0; outerRadius = 2.0; color = "white"; }
3) 如果在输出圆环的面积时要求保留两位小数,程序如何修改?
4) 请为圆环类Ring在添两个方法以便能返回内圆和外圆的周长,然后在主函数main()中分别创建两个对象ring1,ring2以显示周长。 2. 使用类来封装对象的属性和功能
编写一个Java程序,该程序中有3个类:Trangle、Lader和Circle,分别用来刻画“三角形”、“梯形”和“圆形”。具体要求如下:
Trangle类具有类型为double的三个边(sideA,sideB,sideC),以及周长(length)、面积(area)属性,Trangle类具有返回周长(getLength)、面积(getArea)以及修改三个边(setABC)的功能。另外还有一个boolean型的属性(boo),该属性用来判断三个数是否构成一个三角形。
Lader类具有类型为double的上底(above)、下底(bottom)、高(height)、面积(area)属性,具有返回面积(getArea)的功能。
Circle类具有类型为double的半径(radius)、周长(length)和面积(area)属性,具有返回周长(getLength)、面积(getArea)的功能。 把程序中的代码补充完整,并查看结果。
// Trangle .java class Trangle {
double sideA,sideB,sideC,area,length; boolean boo;
public Trangle(double a,double b,double c) { //带参数的构造方法 setABC(a,b,c); }
double getLength() {
//方法体,要求计算出length的值并返回
【补充代码…仿照getArea()方法编写】
}
public double getArea()