您好,欢迎来到榕意旅游网。
搜索
您的当前位置:首页Java程序实验

Java程序实验

来源:榕意旅游网


《Java程序设计实验指导书》

2015年6月

目 录

实验一 java开发环境的安装和运行 ............................................................................................. 1 实验三 类和对象的创建 ............................................................................................................... 10 实验四 成员变量和成员方法的设计 ........................................................................................... 17 实验五 类的继承性与多态性 ....................................................................................................... 23 实验六 包、接口和异常 ............................................................................................................... 29 实验七 Applet类和字符串类 ....................................................................................................... 35 实验八 输入输出流类和常用系统类 ........................................................................................... 40 实验九 GUI组件及事件处理 ....................................................................................................... 44 实验十 多线程机制 ....................................................................................................................... 49

I

《Java程序设计基础》实验指导书

实验一 java开发环境的安装和运行

实验目的:

1、 掌握jdk的安装和卸载; 2、 学会配置j2sdk的运行环境; 3、 熟练掌握java小程序的运行过程

实验内容及步骤: 一、j2sdk的安装和卸载

1、java可以安装在多种不同的操作系统中,我们在学习过程中以windows为对象。 软硬件配置:

硬件:CPU-P2以上,64M内存,100M硬盘空间 软件:win98/Me/XP/NT/2000,IE5.0以上

2、免费的安装文件可以从Sun公司的主页上下载:Http://java.sun.com/ 安装过程略

3、卸载JDK可以通过控制面板来实现

二、配置运行环境(假设安装目录为e:\\j2sdk1.4.2_01\\bin) 1、 win98系统:

在c\\:autoexec.bat文件中添加: set path=%path%;e:\\j2sdk1.4.2_01\\bin

set classpath=.;e:\\j2sdk1.4.2_01\\bin;% classpath% 保存后,重新启动即可 2、 winXP/NT/2000系统:

在桌面“我的电脑”上右击,选择“属性”菜单, 在高级选项卡中,配置“环境变量”: path-e:\\j2sdk1.4.2_01\\bin classpath-.;e:\\j2sdk1.4.2_01\\lib

进入DOS命令提示符状态,键入:java、javac回车,若出现帮助信息提示即为安装成功

1

《Java程序设计基础》实验指导书

三、java小程序的运行过程 1)Application程序的编写: 打开记事本

public class helloApplication{

public static void main(String args[]){

System.out.println(”欢迎学习java语言”); } }

程序调试过程:

i. ii.

保存为helloApplication.java

在DOS命令提示符状态,键入:javac helloApplication.java,编译程序自动生成helloApplication.class

iii.

在DOS命令提示符状态,键入:java helloApplication,则可运行程序

2)Applet程序:

import java.applet.Applet; import java.awt.*;

public class helloApplet extends Applet{

public void paint(Graphics g){

g.drawString(”欢迎学习java语言”,100,100); } }

html文件的编写:

2

《Java程序设计基础》实验指导书

程序调试过程:

i. ii. iii.

保存

编译源程序(javac)

运行html文件:(1)用IE浏览器(2)用appletviewer 文件名.html

四、程序实例 1、计算两个数的和 public class Sum2{

public static void main(String args[]){ long a=10L; int b=5,c;

c=(int)(a+b); System.out.println(\"a+b=\"+c); }} 2、计算圆形面积 略

3、熟悉java语言的运算符(教材P36-2-8、2-9) (1)public class T1{

public static void main(String args[]){ int x=10; x+=x;

System.out.println(x); x-=3;

System.out.println(x); x*=1+2;

System.out.println(x); x%=5;

System.out.println(x); }}

思考:1、java程序的构架

3

2、java程序的开发过程

《Java程序设计基础》实验指导书

实验二 java基本语法

实验目的:

1、 掌握各种流程控制语句 2、 熟练应用数组的定义和使用 3、 OOP实例的调试与运行 实验内容及步骤: 一、流程控制语句

java程序的流程控制语句用于控制程序中各个语句的执行顺序。 包括:选择语句、循环语句、跳转语句 1、选择语句包括:if语句和swith语句 实例1:给出3个整型数,找出最大的数。

public class U1{

public static void main(String args[]){

int max,a=4,b=3,c=7;

//具体程序内容由学生完成 max=a; if(b>max) max=b; if(c>max) max=c;

System.out.println(a+\" \"+b+\" \"+c);//如果改为(a+b+c)结果如何? System.out.println(\"max=\"+max); } }

问:如果改为(a+b+c)结果如何? 答:最后显示的是14,max=7

实例2:根据变量score中存放的考试分数,输出对应的等级。 60分以下为D等;60~69为C等;70~89为B等;90~100为A等。 public class U2{

public static void main(String args[]){

int score=55;

switch(score/10) {

case 0:case 1:case 2:case 3:case 4: case 5:System.out.println(score+\"分是D等\");break;

4

《Java程序设计基础》实验指导书

} }

//去掉break结果有何变化?

case 6:System.out.println(score+\"分是C等\");break; case 7:

case 8:System.out.println(score+\"分是B等\");break; case 9:

case 10:System.out.println(score+\"分是A等\");break; default:System.out.println(\"数据错误\");

}

问:去掉break结果有何变化?

答:去掉break,程序无论是否满足条件,都不会停止,继续往下运行。

最后运行显示55分是D等 55分是C等 2、循环语句

实例3:计算1+2+„+100的结果。(程序自己编写) public class U3{

public static void main(String args[]){ int i,s; s=0;

for(i=1;i<=100;i++)

s=s+i;

System.out.println(s); } }

3、计算并输出n的阶乘(设n=10)。(程序自己编写) public class U4{

public static void main(String args[]){ int i,s; s=1;

for(i=10;i>=1;i--)

s=s*i;

5

《Java程序设计基础》实验指导书

System.out.println(s); } }

4、编写程序,输出1~100间的所有奇数。 提示:满足表达式(i%2!=0)的i值为奇数 public class U5{

public static void main(String args[]){ int i;

for(i=1;i<=100;i+=2) {if(i%2!=0)

System.out.println(i);} } }

二、数组的定义和使用

实例:4,二维数组的定义和使用

public class Shuzu1{

public static void main(String args[]) throws java.io.IOException{

char ch[][]=new char[4][4];

System.out.println(\"输入16个字母,输入b跳出\"); lab1:

for(int i=0;i<4;i++) for(int j=0;j<4;j++){

ch[i][j]=(char)System.in.read(); System.in.skip(2);

//输入一个字母回车一次,回车不会被认做字母赋给数组 if(ch[i][j]=='b')

break lab1;// 去掉该处和第5行的lab1,结果又会如何? }

for(int i=0;i<4;i++)//用于输出数组ch

for(int j=0;j<4;j++)

System.out.print(ch[i][j]+\"|\"); //\"|\"用于分隔每个数组元素 System.out.println(\"跳出\"); } }

6

《Java程序设计基础》实验指导书

思考:去掉第5行和第12行的lab1,结果又会如何?为什么会这样? 答:输入b的时候不能直接跳出来,需输完16个才能跳出。 三、OOP实例的调试与运行 实例5:

编写图像界面接口的程序,功能是输入2个数,并将其中最大数输出。

import java.awt.*;

import java.awt.event.*; import java.applet.Applet;

public class Max extends Applet implements ActionListener{ Label label1=new Label(\"和\"); TextField field1=new TextField(6); TextField field2=new TextField(6); TextField field3=new TextField(6);

Button button1=new Button(\"max\");

public void init(){ add(field1); add(label1); add(field2); add(button1); add(field3);

button1.addActionListener(this); }

//单击按钮后执行该方法

public void actionPerformed(ActionEvent e){ int a=Integer.parseInt(field1.getText()),

b=Integer.parseInt(field2.getText()),max;

max=a; if(afield3.setText(Integer.toString(max));

//将整型转换为字符串,并显示在文本框field3中 } }

具体过程如下:

1) 输入源程序,并保存为Max.java

2) 编译:javac Max.java,自动生成了类文件(Max.class) 3) 运行程序:

7

《Java程序设计基础》实验指导书

由于该程序是Applet程序,必须嵌入网页中运行,编写网页文件:

保存为max.html(文件名可以任意命名) 运行网页文件:

输入命令:appletviewer max.html

或直接双击该网页文件,用IE浏览器来运行

实例六:参照上面的程序编写阶乘计算的Applet程序,如下图所示。

程序:

import java.awt.*; import java.awt.event.*; import java.applet.Applet;

public class JC extends Applet implements ActionListener{ Label label1=new Label(\"输入n的值:\"); TextField field1=new TextField(6);

Button button1=new Button(\"n的阶乘为:\"); TextField field2=new TextField(10);

public void init(){ add(label1);

8

《Java程序设计基础》实验指导书

add(field1); add(button1); add(field2);

button1.addActionListener(this); }

public void actionPerformed(ActionEvent e){

int a=Integer.parseInt(field1.getText()),i,s;

s=1;

for(i=a;i>=1;i--)

s=s*i;

field2.setText(Integer.toString(s)); } }

实例7:编写Applet程序实现教材P56 3-3的程序功能. 小结:体会java Application和Applet程序的不同运行方式

9

《Java程序设计基础》实验指导书

实验三 类和对象的创建

实验目的:

1、 java类的定义和使用

2、 掌握创建和使用类对象的方法。 3、 对象的引用

实验内容及步骤: 一、 类和对象的创建

1、类通过关键字class来创建,格式如下:

[修饰符] <类名> [extends 父类名] [implements 接口] { <类体> }

修饰符包括:public、abstract、final

2、创建对象的格式如下:

<类名> <对象名>=new <类名>([参数列表]) 例中:MyBox b1=new MyBox( ); 二、对象的引用 1) 对象的引用:

<对象名>.<变量或方法名> 例:a1.draw(g); 2) 对象的清除:

MyBox a1=new MyBox(20,20,200,400); …… //对象的操作 a1=null; 三、具体实例

例1:MaxArray类的对象求出一维数组中的最大值。 class MaxArray{

int findmax(int a[],int n){

10

《Java程序设计基础》实验指导书

int max=a[0]; for(int i=1;imax) } }

public class C1{

public static void main(String args[]){

MaxArray ob =new MaxArray(); //利用类MaxArray创建对象ob int a[]={2,5,7,3,18,9},b[]={33,43,6,12,8};

System.out.println(\"数组a中的最大值是\"+ob.findmax(a,6));

System.out.println(\"数组b中的最大值是\"+ob.findmax(b,5)); //输出数组b的最大值 } }

例2:练习命令行参数的使用。 (一)带有2个命令行参数 public class say{

public static void main(String args[]){

String name=args[0]; String word=args[1];

System.out.println(\"我想对\"+name+\"悄悄地说:\"+word); } }

调试过程:保存的文件名say.java,编译文件:javac say.java,运行文件:java say 妈妈 我爱你!!!

其中 : “妈妈”是第一个命令行参数; “我爱你!!!”是第二个命令行参数。 (二) 带有3个命令行参数(3个整数求最大值)

11

max=a[i];

return max; //返回max的值

《Java程序设计基础》实验指导书

public class max{

public static void main(String args[]){ } }

调试过程:保存的文件名max.java,编译文件:javac max.java,运行文件:java max 12 48 6 其中 : “12”是第一个命令行参数; “48”是第二个命令行参数;“6”是第三个命令行参数。

(三) 带有2个命令行参数(2个整数求最大值),由同学自己完成。 public class max{

public static void main(String args[]){

12

int max;

int a=Integer.parseInt(args[0]); int b=Integer.parseInt(args[1]); int c=Integer.parseInt(args[2]); if(a>b&&a>c) max=a; else if(b>c) max=b; else max=c;

System.out.println(\"三个数中最大的是:\"+max);

int max;

int a=Integer.parseInt(args[0]); int b=Integer.parseInt(args[1]); if(a>b) max=a; else max=b;

System.out.println(\"两个数中最大的是:\"+max);

《Java程序设计基础》实验指导书

} }

例3:教材P87-16题 import java.awt.*; import java.applet.Applet;

public class p87_16 extends Applet{ public void paint(Graphics g){

Re js=new Re(); //利用类Re创建对象js g.drawString(\"矩形 a=2,b=3\

g.drawString(\"周长=\"+js.zc(2,3),10,35); //显示周长(a=2,b=3),位置(10,35)

g.drawString(\"面积=\"+js.mj(2,3),10,35); //显示面积值(a=2,b=3),位置(10,50)

} } class Re{

private int w,h; public Re(){w=0;h=0;}

public int zc(int a,int b){return 2*a+2*b;} //定义周长计算方法zc() public int mj(int a,int b){return a*b;} }

例4:编写程序:

1.创建一个类Circle,添加静态属性r(成员变量),并定义一个常量PI=3.142 2.在类Circle中添加两种方法,分别计算周长和面积 3.编写主类C3,利用类Circle输出r=2时圆的周长和面积 程序:

import java.awt.*; import java.applet.Applet; public class Circle extends Applet{

13

《Java程序设计基础》实验指导书

public void paint(Graphics g){ C3 yx=new C3(); final double PI=3.14;

g.drawString(\"圆形 r=2\ g.drawString(\"周长=\"+js.zc(2),10,35); g.drawString(\"面积=\"+js.mj(2),10,35); } } class C3{

private int w,h; public C3(){w=0;h=0;}

public int zc(int a){return 2*PI*r;} public int mj(int a){return PI*r*r;} }

例5:定义一个Person类,该类属性(变量)和方法如下: 姓名:name 字符串类型; 性别:sex 字符型; 年龄:age 整型;

2个构造方法:1个是默认的构造方法(由系统完成),另一个可通过参数赋值; 将该3个变量转化成字符串便于显示输出的方法:toString(该名称可自定义) 创建主类,通过Person类创建对象,显示输出该对象的各种属性。 class Person{

String name; char sex; int age;

public Person(String s,char c,int i){

name=s; sex=c; age=i;

14

《Java程序设计基础》实验指导书

}

public String toString(){

String s=\"姓名:\"+name+\" 性别:\"+sex+\" 年龄:\"+age; return s; //返回s的值

} }

public class T1{

public static void main(String args[]){ Person p1=new Person(\"张三\男',20);

Person p2=new Person(\"李四\女',28); //定义对象p2,各个参数分别为:李四,女,28

p1.sex='女'; //将p1的sex属性改为女

System.out.println(p1.toString());//输出p1的各个属性 p2.age=33; //将p2的的age改为33

System.out.println(p2.toString()); //输出p2的各个属性 } }

例6:编写图形用户界面的Applet程序(如图所示)

参照两个数取大值(图左)的程序, 编写求由1加到n的和(图右)

思考:通过什么方法来使用类?2、如何引用类的变量和方法?

15

《Java程序设计基础》实验指导书

程序:

import java.awt.*; import java.awt.event.*; import java.applet.Applet;

public class Sum extends Applet implements ActionListener{ Label label1=new Label(\"n值\"); TextField field1=new TextField(6); Button button1=new Button(\"Sum\"); TextField field2=new TextField(10); public void init(){ add(label1); add(field1); add(button1);

add(field2); button1.addActionListener(this); }

public void actionPerformed(ActionEvent e){

int a=Integer.parseInt(field1.getText()),i,s;

s=0;

for(i=1;i<=a;i++)

s=s+i;

field2.setText(Integer.toString(s)); } }

16

《Java程序设计基础》实验指导书

实验四 成员变量和成员方法的设计

实验内容: 1、成员变量:

声明、定义使用和封装 2、成员方法:

☆ 设计、调用

3、OOP编程的思想

1) 理解主类的编写 2) 调用其他类的方法

3) 在编程过程中体会oop的思想(并熟悉定义类、创建对象、对象属性的使用)

实验内容及步骤:

一、

成员变量

深刻理解变量的使用范围

例1:指出下面程序中的错误,并修改使其正确运行。 class Class2{ private int y;

public void show(){

System.out.println(\"show method is private\"); }

public void usesecret(){ show(); } }

public class Class1{

public static void main(String args[]){ Class2 Ob=new Class2(); Ob.usesecret(); Ob.show(); } }

错误: (1)标示符应该为英文半角。 (2)system应该为System。

(3)Ob对象创建时类运用错误,应该为Class2。

(4)show方法应该为公用public,不然对象引用不了show方法。

二、

成员方法的声名和设计

1、成员方法的声明一般放在成员变量的声明之后,声明语句的格式和顺序如下:

[ public][private][protected ][ package ] //访问控制修饰符

17

《Java程序设计基础》实验指导书

[ static][final][ abstract ] [ native] [synchronized] 返回值类型 方法名(参数表)[ throws 异常类型]

例2:定义student类,其中包括四个私有变量(name,age,sex,score)、一个构造方法和show()方法。各成员的含义如下:

*变量name为字符串类型String,用于存储学生的姓名。 *变量age为int类型,用于存储学生的年龄。

*变量sex为boolean类型,用于存储学生的性别,男生为false,女生为true。 *变量score为double类型,用于存储学生的成绩。

*构造方法包括四个参数,用于为变量(name,age,sex和score)赋值。 *show()方法无参数,用于输出变量(name,age,sex和score)的值。 定义主类来调用student类中的构造方法和成员方法。 程序:、

class student{

private String name; private int age;

private boolean sex; private double score; public void show(){ System.out.println(name); System.out.println(age); System.out.println(sex); System.out.println(score); }

public void usesecret(){ show(); } }

public class C1{

public static void main(String args[]){ student Ob=new student(); Ob.usesecret(); Ob.show(); } }

例3:该例设计了两个类,用主类M1控制DrawShape类实例对象a的行为。类DrawShape被设计成一个黑箱子,能画出固定大小的矩形和椭圆,那么画什么图形,在哪里画则由外部消息控制。

外部消息通过两个方法setPos()和setShape()改变了对象的位置和形状数据。Draw方法根据对象的当前状态画出图形。

主类中创建了DrawShape的实例对象a。将图形的位置和形状的消息通过方法传递给a,最后由a的draw方法画出图形。

18

《Java程序设计基础》实验指导书

import java.awt.*;

import java.applet.Applet;

class Drawshape{ //画图形的类 private int x,y,shape;

public void setPos(int xpos,int ypos){ //改变了对象位置的方法(方法体自己完成) x=xpos; y=ypos; }

public void setShape(int choice){ //改变了对象形状数据的方法(方法体自己完成)

shape=choice; }

public void draw(Graphics g){ if(shape==1)

g.drawRect(x,y,60,60); else if(shape==2)

g.drawOval(x,y,60,60); else

g.drawString(\"形状参数不对\ } }

public class M1 extends Applet{ Drawshape a=new Drawshape(); public void paint(Graphics g){ a.setPos(40,20);

a.setShape(1); //调用类Drawshape中的方法将图形参数设置为1 a.draw(g);

a.setPos(200,60);

a.setShape(2); //将图形参数设置为2或3„„ a.draw(g); //调用画出图形的方法 }

}

例4:对上个例子的改造:通过文本框实现图形参数的输入。

import java.awt.*;

import java.awt.event.*; import java.applet.Applet;

class Drawshape{ //画图形的类 private int x,y,shape;

//改变了对象位置的方法

public void setPos(int xpos,int ypos){

19

《Java程序设计基础》实验指导书

x=xpos; y=ypos; }

public void setShape(int choice){ //改变了对象形状参数的方法 shape=choice; }

public void draw(Graphics g){ //画出该图形的方法 if(shape==1)

g.drawRect(x,y,60,60); else if(shape==2)

g.drawOval(x,y,60,60); else

g.drawString(\"形状参数不对\ } }

public class M2 extends Applet implements ActionListener{ //主类 int s; //定义图形参数s

Button button1=new Button(\"输入图形参数\"); //按照运行结果定义按钮和文本框对象

TextField field1=new TextField(3);

Drawshape a=new Drawshape(); //使用类Drawshape定义对象a

public void init(){ //初始化方法 add(button1); //将定义好的按钮加入 add(field1); //将定义好文本框加入

button1.addActionListener(this); }

public void actionPerformed(ActionEvent e){

s=Integer.parseInt(field1.getText()); //将文本框中的数据转换成int型数据,并赋给s repaint(); //重画 }

public void paint(Graphics g){ //绘图方法(系统的) a.setPos(40,20);

a.setShape(s); //调用改变图形参数的方法将s输入 g.drawString(\"\"+s,20,20); //在20,20位置上显示s值 a.draw(g); //调用画出图形的方法

} }

2、成员方法的调用 例5:模拟小车运行

1) 建立小车类Car,拥有属性:位置、前进方法、后退方法、查询位置方法 2) 建立主类,调用前进和后退的方法模拟小车运行,最后查询小车的位置 import java.awt.*;

import java.applet.Applet;

20

《Java程序设计基础》实验指导书

public class UseCar extends Applet{ public void paint(Graphics g){

Car mycar=new Car(); //定义小车类对象mycar g.drawString(\"起始位置\"+mycar.getwz(),10,20); g.drawString(\"前进100\ mycar.qj(100);

g.drawString(\"后退30\ mycar.ht(30);

g.drawString(\"当前位置\"+mycar.getwz(),10,65); } }

class Car{ private int x;

public Car(){x=0;}

public void qj(int wz){x+=wz1;} //定义前进的方法

public void ht(int wz){x-=wz1;} //定义后退的方法

public int getwz(){return x;} //定义查询位置的方法

}

例6:接前一个例子用画图来表示车的位置(运行结果见下页)

1) 添加一个用于画出小车的类Hcar,属性:位置、设置位置的方法、画出小车的方法 2) 在主类中调用Hcar类画出小车在改变位置时不同的位置。 import java.awt.*;

import java.applet.Applet;

public class Car2 extends Applet{ public void paint(Graphics g){ Car mycar=new Car();

Hcar hcar=new Hcar(); //用Hcar类创建对象hcar

g.drawString(\"起始位置\"+mycar.getwz(),10,20); //小车起始位置 hcar.setwz(mycar.x); //设置画小车位置 hcar.draw(g); //在该位置画出小车 g.drawString(\"前进300\ mycar.qj(300); //小车前进300,位置发生变化 hcar.setwz(mycar.x); //设置画小车位置 hcar.draw(g); //在该位置画出小车 g.drawString(\"后退100\

mycar.ht(100); //小车后退100,位置发生变化 hcar.setwz(mycar.x); //设置画小车位置

21

《Java程序设计基础》实验指导书

hcar.draw(g); //在该位置画出小车

g.drawString(\"当前位置:\"+mycar.getwz(),10,65); } }

class Car{ public int x;

public Car(){x=0;}

public void qj(int wz1){x+=wz1;} public void ht(int wz1){x-=wz1;} public int getwz(){return x;} }

class Hcar{ //定义画出小车的类 int xpos=20;

public void setwz(int xx){xpos=xx;} public void draw(Graphics g){ g.drawRect(xpos,90,30,12); g.drawOval(xpos+5,90+12,6,6); g.drawOval(xpos+20,90+12,6,6);

g.drawString(\"位置:\"+xpos,xpos,90+40); } }

例7:模拟银行存取款业务。

1) 建立银行帐户类,属性:储户现有款项、存款的方法、取款的方法、显示余额的方法 2) 建立主类,创建对象(模拟储户名),存款1000,取款500,显示余额。 (参照例5)

小结:成员变量与成员方法的设计方法。 程序:

import java.awt.*;

import java.applet.Applet;

public class UseAccount extends Applet{ public void paint(Graphics g){

Account myaccount=new Account(); //定义小车类对象mycar g.drawString(\"现有款项\"+myaccount.getje(),10,20); g.drawString(\"存款1000\ myaccount.ck(1000);

g.drawString(\"取款500\ myaccount.qk(500);

g.drawString(\"显示余额\"+myaccount.getje(),10,65);

22

《Java程序设计基础》实验指导书

} }

class Account{ private int x;

public Account(){x=0;}

public void ck(int je){x+=je;} //定义存款的方法 public void qk(int je){x-=je;} //定义取款的方法 public int getje(){return x;} //定义显示余额的方法 }

实验五 类的继承性与多态性

实验目的:

1、 理解面向对象编程的关键技术:继承和多态 2、 super和this的应用

3、 super()和this()的应用

实验内容及步骤:

一、 类的继承

题目一:填空,完成并运行程序。写下程序运行结果并回答问题。

理解创建新类B(通过继承现有类A)的方法,使新类B具有类A的功能,并添加新的功能,编写主类考查通过继承创建的类B与父类A 程序一: class A{ int i,j;

void showij(){System.out.println(\"i and j:\"+i+\" \"+j);} }

class B extends A { //B类继承A类的属性和方法 int k;

void showk(){System.out.println(\"k:\"+k);}

void sum(){System.out.println(\"i+j+k:\"+(i+j+k));} }

public class M1{

public static void main(String args[]){ A father =new A(); B son=new B();

father.i=10;father.j=20;

father.showij(); //使用父类A中的方法 son.i=7;son.j=8;son.k=9;

son.showij(); //使用子类B从父类A中继承的方法 son.showk(); //使用子类B新增的方法showk() son.sum(); }

23

《Java程序设计基础》实验指导书

}

思考题:

1、将父类A中的成员变量i声明为private,编译时观察有哪几处错误? 答:编译时有3处错误,皆是由于i为私有变量而不能引用。 ①void sum(){System.out.println(\"i+j+k:\"+(i+j+k)); ②father.i=10; ③son.i=7;

2、在程序一中的子类B中添加语句:int i,j;(对父类A中的同名变量i,j 进行了重新定义)观察运行结果有什么不同?为什么?这种现象称为什么?

答:运行结果变化:子类B的i和j的值由原先的7、8变为0、0

原因:因为子类B中有变量i,j,son.i即为子类B的变量i,son.j即为子类B的变量j,不使用父类的变量i.j.

3、在程序一中在子类B中添加成员方法:

void showij(){System.out.println (“覆盖了父类的成员方法”);}

(对父类A中的同名方法进行重新定义)观察运行结果有什么不同?为什么?这种现象称为什么?

答:运行结果不变化。因为子类B最终使用的方法都是一样的。

二、类的多态性

目的:将功能相近的方法用同一名字表示。

如何区分:用参数表的个数、类型和顺序来区分相同名字而功能不同的方法。 题目二:完成程序二中主类中的主方法,内容包括: (1) 用类Intsort创建对象s

(2) 显示输出两个数的排序10,25

(3) 显示输出三个数的排序10,25 ,17 程序二: class Intsort{

public String sort(int a,int b){ //定义两个数排序的方法 if(a>b)return a+” ”+b; else return b+” ”+a; }

public String sort(int a,int b,int c){ //定义三个数排序的方法 int swap;

if(apublic class M1{ //定义主类考查Intsort类中的方法 public static void main(String args[]){

Intsort s=new Intsort();

24

《Java程序设计基础》实验指导书

System.out.println(s.sort(10,25)); System.out.println(s.sort(10,25,17)); }

}

三、改造程序 程序三:

import java.awt.*;

import java.applet.Applet;

public class UseCar extends Applet{ public void paint(Graphics g){ Car mycar=new Car();

g.drawString(\"起始位置\"+mycar.getwz(),10,20); g.drawString(\"前进100\ mycar.qj(100);

g.drawString(\"后退30\ mycar.ht(30);

g.drawString(\"当前位置\"+mycar.getwz(),10,65); } }

class Car{

private int wz;

public Car(){wz=0;}

public void qj(int wz1){wz+=wz1;} public void ht(int wz1){wz-=wz1;} public int getwz(){return wz;} }

题目三:参考程序三,用画图来表示车的位置(运行结果见下页)

3) 添加一个用于画出小车的类Hcar,属性:位置、设置位置的方法、画出小车的方法 4) 在主类中调用Hcar类画出小车在改

变位置时不同的位置。 import java.awt.*;

import java.applet.Applet;

public class Car2 extends Applet{ public void paint(Graphics g){ Car mycar=new Car();

Hcar hcar=new Hcar(); //用Hcar类创建对象hcar

g.drawString(\"起始位置\"+mycar.getwz(),10,20); //小车起始位置

25

《Java程序设计基础》实验指导书

hcar.setwz(mycar.x); //设置画小车位置 hcar.draw(g); //在该位置画出小车 g.drawString(\"前进300\

mycar.qj(300); //小车前进300,位置发生变化 hcar.setwz(mycar.x); //设置画小车位置 hcar.draw(g); //在该位置画出小车 g.drawString(\"后退100\

mycar.ht(100); //小车后退100,位置发生变化 hcar.setwz(mycar.x); //设置画小车位置

hcar.draw(g); //在该位置画出小车 g.drawString(\"当前位置:\"+mycar.getwz(),10,65); } }

class Car{

public int x;

public Car(){x=0;}

public void qj(int wz1){x+=wz1;} public void ht(int wz1){x-=wz1;} public int getwz(){return x;} }

class Hcar{ //定义画出小车的类 int xpos=20;

public void setwz(int xx){xpos=xx;} public void draw(Graphics g){ g.drawRect(xpos,90,30,12); g.drawOval(xpos+5,90+12,6,6); g.drawOval(xpos+20,90+12,6,6);

g.drawString(\"位置:\"+xpos,xpos,90+40); } }

四、编写程序 题目三:

编写程序,具体要求为:

(1) 定义一个计算面积的类Area(可以计算正方形、矩形或梯形的面积):

其中包括三个同名的成员方法(用于计算正方形、矩形或梯形的面积,返回值类型为float,参数分别为1个、2个或3个)。 (2) 创建主类:

利用Area类分别输出正方形(边长为2.0f)、矩形(长为5.0f,宽为4.0f)和梯形(上底为2.0f,上底为3.0f,高为4.0f)的面积。 程序: class Area{

26

《Java程序设计基础》实验指导书

public float sort(float a){ return a*a; }

public float sort(float a,float b){ return a*b; }

public float sort(float a,float b,float c){ return (a+b)*c/2; }}

public class M6{ //定义主类考查Intsort类中的方法 public static void main(String args[]){

Area s=new Area(); System.out.println(s.sort(2.0f)); System.out.println(s.sort(5.0f,4.0f));

System.out.println(s.sort(2.0f,3.0f,4.0f)); } }

题目四:编写Application程序,模拟银行存取款业务。 1、 建银行帐户类bank,

添加变量:储户现有款项account(int型) 添加方法:

 存款的方法income:带有一个参数,用来表示存入的钱数(int型),无返回值。  取款的方法takeout:带有一个参数,用来表示取出的钱数(int型),无返回值。  显示余额的方法show:无参数,无返回值。 2、 建立主类C1(要求是Applet程序),创建对象(模拟储户名zhang3),存款1000,取款500,显示余额。 程序:

import java.awt.*;

import java.applet.Applet;

public class C1 extends Applet{ public void paint(Graphics g){ bank zhang3=new bank();

g.drawString(\"现有款项\"+zhang3.account,10,20); g.drawString(\"存款1000\ zhang3.income(1000);

g.drawString(\"取款500\ zhang3.takeout(500);

g.drawString(\"显示余额:\"+zhang3.account,10,65); zhang3.show(); } }

class bank{

27

《Java程序设计基础》实验指导书

int account;

public bank(){account=0;}

public void income(int x){account+=x;} //定义存款的方法 public void takeout(int x){account-=x;} //定义取款的方法

public void show(){account=account;} //定义显示余额的方法 }

小结:

掌握类的继承性与多态性表现的方面,以及具体在程序设计中的实现。

28

《Java程序设计基础》实验指导书

实验六 包、接口和异常

实验目的:

1.包是如何组织存放类的

2.熟悉和理解Java中异常的概念和处理机制。 3.熟悉和掌握异常的抛出和捕捉。

实验内容及步骤: 一、包是如何组织存放类的

Java允许把多个类收集在一起成为一组,称作包(package)。引入包的目的是组织类的存放位置。

程序一: package P1; class C1{}

public class C2{

public static void main(String args[]){ System.out.println(\"察看编译结果\"); }}

interface I1{}

package P2; class C3{}

1、将上述程序分别保存并调试,写下运行结果和编译结果。 调试过程:

1) 保存文件C2.java(注意:在一个java源程序中只能有一条包语句) 2) 编译:javac –d . C2.java 3) 运行:java P1.C2

D:\\java234>javac -d D:\\java234 C2.java

D:\\java234>java P1.C2 察看编译结果

4) 保存文件C3.java

5) 编译:javac –d . C3.java 6) 运行:java P2.C3

D:\\java234>javac -d D:\\java234 C3.java

D:\\java234>java P2.C3

错误: 在类 P2.C3 中找不到 main 方法, 请将 main 方法定义为: public static void main(String[] args)

29

《Java程序设计基础》实验指导书

否则 JavaFX 应用程序类必须扩展javafx.application.Application

2、将下述源程序保存并编译,观察并写下编译结果。 package P1;

public class C4{}

D:\\java234>java P1.C4

错误: 在类 P1.C4 中找不到 main 方法, 请将 main 方法定义为: public static void main(String[] args)

否则 JavaFX 应用程序类必须扩展javafx.application.Application

二、接口

1、系统接口的调用。

程序二:运行程序,回答问题: import java.awt.*;

import java.awt.event.*; import java.applet.Applet;

public class M extends Applet implements MouseListener,MouseMotionListener{ int x1,y1,x2,y2;

public void init(){addMouseListener(this); addMouseMotionListener(this);} public void paint(Graphics g){g.drawLine(x1,y1,x2,y2); //语句1 g.drawString(\"x1:\"+x1+\" y1:\"+y1+\" x2:\"+x2+\" y2:\"+y2,50,50);}

public void mousePressed(MouseEvent e){ x1=e.getX();y1=e.getY();}

public void mouseClicked(MouseEvent e){}public void mouseExited(MouseEvent e){} public void mouseEntered(MouseEvent e){}public void mouseReleased(MouseEvent e){} public void mouseDragged(MouseEvent e){x2=e.getX();y2=e.getY();repaint();} //语句2 public void mouseMoved(MouseEvent e){} } (1)程序中蓝色字的语句打括号是空的,能否删除? 不能。

(2)带下划线的语句有什么含义,将语句1改为画矩形;将语句2删除会有什么影响? 画完一个矩形以后就无法进行其他绘制操作。

(3)接口MouseListener和MouseMotionListener中有哪些方法?

void mouseClicked(MouseEvent e) 鼠标按键在组件上单击(按下并释放)时调用。 void mouseEntered(MouseEvent e) 鼠标进入到组件上时调用。 void mouseExited(MouseEvent e) 鼠标离开组件时调用。 void mousePressed(MouseEvent e) 鼠标按键在组件上按下时调用。 void mouseReleased(MouseEvent e) 鼠标按钮在组件上释放时调用。

30

《Java程序设计基础》实验指导书

void mouseDragged(MouseEvent e) 鼠标按键在组件上按下并拖动时调用。 void mouseMoved(MouseEvent e) 鼠标光标移动到组件上但无按键按下时调用。

2、自定义接口的定义和使用 程序三:

(1)定义接口N1

interface N1{

int year=2006; //year默认为static final常量

int age(); //无方法体,在使用时需加入方法体 void output(); } (2)引用自定义接口

public class M implements N1{ String xm;int sr; //成员变量:xm为姓名,sr为出生所在年(如:1988) M(String a,int b){xm=a;sr=b;} //构造方法

public int age(){return age; } //实现接口的方法,返回年龄值

public void output(){System.out.println(xm+\"的年龄为:\"+this.age());} //输出年龄 public static void main(String aa[]){

M a=new M(“张弛”,1998); //使用本类M创建对象a,姓名为张弛,出生所在年1988

A.output(); //调用output()方法输出 } }

三、异常处理机制

1、目的:java通过异常类和异常对象这种方式处理程序运行中的错误,防止错误对程序造成影响,确保程序能够安全运行。

2、异常处理的指导思想:在Java中,异常是一种程序运行的错误,它是通过异常类来加以描述的。如果以面向对象的观点来看,每种异常都是某个异常类的对象,继承自Exception这个父类。系统已经为我们定义好了很多可以直接使用的异常类,只需在有可能产生异常的方法的方法头处使用throws声明该方法中需要抛出的异常类,然后使用throw语句在方法体中加以抛出。

当然,如果在程序中需要处理自己的一些错误(与系统的不同,这也是我们经常碰到的),那么就需要自己定义一些异常类,但是建议大家最好从系统定义好的异常类中使用一个与你需要处理的异常类似的类加以继承,果没有台适的,则从最上层的Exception类中实施继承。 3、处理异常时经常用到的程序段的结构如下:

try{ 抛出异常的程序段; }

catch(异常1){ 异常处理程序段1; } catch(异常2){ 异常处理程序段2; } catch(异常3){ 异常处理程序段3; }

31

《Java程序设计基础》实验指导书

finally{ 一些始终需要执行的程序段; }

注意:其中的fina||y语句块并非异常处理中必需的语句,但是如果用在一些不管异常是否发生的情况下都要执行某些程序的情况下是非常有用的。

程序四:

在扣分程序中如果扣分值为负值,显示“扣分结果为负值”的信息。 扣分程序:

public class C1{

public static void main(String args[]){ System.out.println(\"平时分满分20\");

System.out.println(\"扣分\"+kf(1));} //如果将1改为-1,观察程序结果的变化并说明原因 static int kf(int n) {

} //返回总分20-n }

平时分满分20 平时分满分20

扣分19 扣分21

程序五:如果输入扣分值为负值,程序二结果并非我们所期望的运行结果,改造程序二使其会自动处理该种错误,并显示输入的扣分是负值。(程序中蓝色字体部分是添加了异常处理机制的语句)

public class C2{

public static void main(String args[]){ System.out.println(\"平时分满分20\");

1.try {System.out.println(\"扣分\"+kf(-1));}

2.catch (Exception e){System.out.println(\"扣分是负值\");} }

static int kf(int n) throws C3{ C3 d=new C3(); if(n<0)throw d; //抛出C3异常 return 20-n; } }

class C3 extends Exception{ //自定义的异常类 C3(){super(\"扣分输入错误\");} }

完成程序并写出程序结果。

程序六:上机输入以下程序,在程序try中的语句如果可能产生多种异常,注意与catch参数进行匹配。观察程序的运行结果,体会Java中的异常处理机制。

class Test{

static int a=3,b=0; //运行后,将变量b改成非零值,观察结果

32

《Java程序设计基础》实验指导书

static String c[]={“数组元素c[0]”};

public static void main(String[] args) { try{ System.out.println(a); System.out.println(a/b);

System.out.println(c[b]); //若上条语句产生异常,本语句将不被

运行,要想本语句始终运行,可将其放在finally中,写下运行结果 }

catch(ArithmeticException e){

System.out.println (\"捕捉到一个算术异常\") ;

}

catch(ArrayIndexOutOfBoundsException e){

System.out.println (\"捕捉到一个数组下标越界异常\") ; }

catch(Exception e){

System.out .println (\"捕捉到一个系统一般的异常\"); }

finally{

System.out.println(\"程序结束\"); } }} 思考题:

(1) 系统中哪条语句会抛出异常?哪条语句捕捉了异常?

System.out.println(a); catch(ArithmeticException e){System.out.println (\"捕捉到一个算术异常\") ;}

(2) 为什么程序不会打印出“捕捉到一个系统一般的异常”? 当发生异常时,程序中断执行,并输出一条信息。

将两个catch语句块交换位置,程序能够编译通过吗?系统将给出什么错误提示?为什么? qqqq.java:14: 错误: 非法的类型开始 catch(Exception e){ ^

qqqq.java:17: 错误: 非法的类型开始 catch(ArrayIndexOutOfBoundsException e){ ^

qqqq.java:19: 错误: 有 'finally', 但是没有 'try' finally{ ^ 3 个错误

原因:try后的catch语句只有一个参数(需要捕捉的异常类的对象),如果在try语句块的程序能够抛出多个异常。那么就需要使用多个异常处理语句(catch语句)来进行捕捉。一般地,处理较具体和较常见的异常的catch块应放在前面,而可以与多种异常相匹配的catch

33

《Java程序设计基础》实验指导书

块应放在较后的位置,特别是在多个异常类是相互继承的时候更是如此。例中,如果将捕捉Exception的catch语句放在了捕捉ArithmeticException的catch语句之前,那么就会出错,因为ArithmeticExceptioa是继承自Exception的,如果程序抛出ArithmeticException,那么就会与捕捉Exception的catch语句相匹配(向上转型的思想),系统会提示捕捉ArithmeticException的catch语句不能执行到,当然这是一个程序的故障(因此应该避免)。

(3)finally语句块中的语句一定会被执行吗?将程序中的变量b改成非零值。写下运行结果并说明为什么?程序也会打印出“程序结束”吗?

如果在try后的花括号中执行了System.exit()方法,将不执行finally后面的语句。 D:\\java234>java qqqq 3 1

捕捉到一个数组下标越界异常 程序结束

(4)将try-catch-finally语句去掉,直接进行编译,能够编译通过吗?观察程序的运行结果。 能编译通过 D:\\java234>java qqqq 3 1

Exception in thread \"main\" java.lang.ArrayIndexOutOfBoundsException: 2 at qqqq.main(qqqq.java:7) 小结:

1、 理解包是如何存放类的

2、 带有包语句的源程序如何调试及运行 3、 理解java异常处理机制的原理及其程序实现 4、

34

《Java程序设计基础》实验指导书

实验七 Applet类和字符串类

实验目的:

1.Applet类的生命周期 2.html与Applet的参数传递 3.字符串类String和StringBuffer

实验内容及步骤: 一、 Applet类的生命周期 java Applet程序的典型结构: public class 类名 extend Applet{

public void init(){…} //初始化方法只执行一次 public void start(){…} //开始运行 public void stop(){…} //停止运行 public void paint(){…} //画出 public void destroy(){…} //清除 ……}

注意:使用paint( )时必须要引入java.awt.Graphics类。 程序1:

import java.applet.Applet; import java.awt.Graphics;

public class L1 extends Applet{

StringBuffer b=new StringBuffer();

public void init() {addWords(\"初始化„\");} public void start() {addWords(\"开始„\");} public void stop() {addWords(\"停止„\");} public void destroy() {addWords(\"清除„\");} void addWords(String s){ System.out.println(s); b.append(s); repaint();}

public void paint(Graphics g){

35

《Java程序设计基础》实验指导书

g.drawString(b.toString(),5,15);} }

完成程序,并运行。

实验要求:在空中填入方法名,完成程序,运行并观察运行结果,最小化运行界面,观察程序结果,再最大化界面,观察运行结果,多次反复观察体会init()、start()、stop()、destroy()分别在什么情况下运行。 结论:

init()、start()、stop()、destroy()这四个方法按顺序运行,其中init()、destroy()只运行一次(在载入和退出时运行)。stop()、destroy()在web页面切换时可多次运行。

二、 html与Applet的参数传递

目的:将Applet程序嵌入web页中,并能从html文件中传递参数给Applet程序,语法格式如下:

[] [] 程序2:

import java.awt.*; import java.applet.*;

public class Test extends Applet{

String t; int x,y;

public void init()

{t=getParameter(\"text\"); //获得html文件中的text参数

y=Integer.parseInt(getParameter(\"xpos\")); //将xpos参数参数赋给x

y=Integer.parseInt(getParameter(\"ypos\"));} //将ypos参数赋给y public void paint(Graphics g)

{ if(t!=null) g.drawString(t,x,y);}

}

36

„„

《Java程序设计基础》实验指导书

实验要求:完成程序,编写html文件,将程序2中的text参数值赋为“你的姓名学号+好好学习,天天向上!”,将xpos、ypos值分别赋为40、50。运行程序。 结论:

html文件可以将参数传递给applet程序,这将会极大的方便了java程序员,这使得applet程序不必为了web页的更改需求而改变程序。

三、 字符串类String和StringBuffer

目的:了解两种字符串类的构造方法和常用方法。 程序3:熟悉String类的各种方法。 public class C1{

public static void main(String args[]){

String b=\"abcdef\"; //创建String类对象b并赋值为“abcdef”

b=b.concat(\"123456\"); //通过append()方法添加“123456” int i=b.length(); //将b的长度赋给i System.out.println(i);

char a[]=b.toCharArray(); //将b中的字符转换为数组a

for(int j=0;jSystem.out.print(a[j]+\" \"); //输出数组的每个元素 } }

完成程序,并运行。

例1:模拟小车运行

3) 建立小车类Car,拥有属性:位置、前进方法、后退方法、查询位置方法 4) 建立主类,调用前进和后退的方法模拟小车运行,最后查询小车的位置 import java.awt.*;

import java.applet.Applet;

public class UseCar extends Applet{ public void paint(Graphics g){ Car mycar=new Car();

g.drawString(\"起始位置\"+mycar.getwz(),10,20); g.drawString(\"前进100\

37

《Java程序设计基础》实验指导书

mycar.qj(100);

g.drawString(\"后退30\ mycar.ht(30);

g.drawString(\"当前位置\"+mycar.getwz(),10,65); } }

class Car{ private int wz;

public Car(){wz=0;}

public void qj(int wz1){wz+=wz1;} public void ht(int wz1){wz-=wz1;} public int getwz(){return wz;}

}

例2:模拟银行存取款业务。

3) 建立银行帐户类,属性:储户现有款项、存

款的方法、取款的方法、显示余额的方法 4) 建立主类,创建对象(模拟储户名),存款1000,取款500,显示余额。 (参照例1) import java.awt.*;

import java.applet.Applet;

public class C1 extends Applet{ public void paint(Graphics g){ bank myaccount=new bank();

g.drawString(\"现有款项\"+myaccount.account,10,20); g.drawString(\"存款1000\ myaccount.income(1000);

g.drawString(\"取款500\ myaccount.takeout(500);

g.drawString(\"显示余额:\"+myaccount.account,10,65); myaccount.show(); } }

class bank{ int account;

public bank(){account=0;}

public void income(int x){account+=x;} //定义存款的方法 public void takeout(int x){account-=x;} //定义取款的方法

public void show(){account=account;} //定义显示余额的方法 } 小结:

1.html与Applet的参数如何传递?

38

《Java程序设计基础》实验指导书

2.字符串类String和StringBuffer的区别?

39

《Java程序设计基础》实验指导书

实验八 输入输出流类和常用系统类

实验目的:

1. Java标准输入输出流 2. 数据流应用 3. 常用系统类 实验内容及步骤:

一、Java标准输入输出流

数据流是指一组有序的、有起点和终点的字节集合。

标准输入输出流定义:数据流的起点和终点是标准输入输出设备。 应用范围:文件、网络、内存和标准输入输出等。 程序1:

import java.io.*; public class T1{

public static void main(String args[]) throws IOException{ int ch;

System.out.println(\"请输入一个字符:\"); ch=System.in.read();

System.out.println((char)ch); //输出ch值(将ch强制转换成字符型) } }

程序2:用if语句编写程序,实现以下功能:从键盘输入数字1显示good,输入其他键时显示bad。 import java.io.*; class p{ public static void main(String arg[]) throws IOException{ int a; System.out.println(\"请输入一个字符:\"); a=System.in.read(); if(a==49){System.out.println(\"good\");} else {System.out.println(\"bad\");} } }

程序3:编程输出26个英文字母。 public class T123{

public static void main(String args[]) { for(int i=65;i<=90;i++)

System.out.print((char)i+\" \"); } }

程序4:程序功能:从键盘中读取字符串数据,读懂并运行该程序。

import java.io.*;

40

《Java程序设计基础》实验指导书

public class C1{

public static void main(String args[]){ String s;

InputStreamReader ir; BufferedReader in;

ir=new InputStreamReader(System.in); //建立与系统标准输入之间的输入流联系 in=new BufferedReader(ir); try{

do{s=in.readLine(); //从键盘读入一行字符串 if(s!=null){

System.out.println(\"Read:\"+s); //将读取的数据输出

}

}while(s!=null); //判断是否读完数据 }catch(Exception e){}; }}

二、数据流应用 程序5:

程序功能:将t1.txt中内容添加到t2.txt中。(注这2个文本文件要事先建立) t1.txt的内容: 天天向上!

t2.txt的内容: 好好学习,

import java.io.*; public class T3{

public static void main(String args[]) throws IOException{ FileReader in=new FileReader(\"t1.txt\"); BufferedReader bin=new BufferedReader(in); FileWriter out=new FileWriter(\"t2.txt\//建立“输入”→“缓冲”→“输出”对象 String s1;

while((s1=bin.readLine())!=null){

System.out.println(s1); //将s1输出到显示器 out.write(s1+\"\\n\"); //将s1写入out对象中} in.close(); out.close(); }}

调试并运行程序。

三、常用系统类 a) 向量类

引入向量类目的:解决了数组长度不可变的问题。 注意带命令行参数的运行方法

41

《Java程序设计基础》实验指导书

程序6:

import java.util.*; public class T4{

public static void main(String args[]){ Vector v=new Vector(1,1); v.addElement(args[0]); v.addElement(args[1]);

v.insertElementAt(\"abcdef\int i=v.size(),j=v.capacity(); System.out.print(\"v的元素:\");

for(int n=0;nSystem.out.println(\"v的元素个数\"+i+\" 向量长度\"+j); v.removeAllElements();

System.out.println(\"v的元素个数\"+v.size()+\" 向量长度\"+v.capacity()); }}

程序7:

命令行参数的使用:设计程序Sayto.java,要求带有2个命令行参数,并将其显示输出。 程序要求及调试过程:

1) 保存并编译,javac Sayto.java

2) 运行:java Sayto 张三 祝你生日快乐! 3) 程序结果:你对张三说:“祝你生日快乐!” 输出语句参考:

System.out.println(“你对”+args[0]+”说:“”+args[1]+“””);

2. Class类与Runtime public class sayto{

public static void main(String args[]){

String name=args[0]; String word=args[1];

System.out.println(\"我对\"+name+\"说:\"+word); } }

程序8:程序功能:获得程序运行时的信息。 package p1; public class T5{

public static void main(String a[]){ String s1=\"\"; T5 t1=new T5();

System.out.println(\"本类名=\"+t1.getClass().getName());

42

《Java程序设计基础》实验指导书

System.out.println(\"父类名=\"+t1.getClass().getSuperclass().getName()); System.out.println(\"包名=\"+t1.getClass().getPackage().getName()); System.out.println(\"操作系统=\"+System.getProperty(\"os.name\"));

System.out.println(\"java版本=\"+System.getProperty(\"java.vm.version\")); System.out.println(\"内存总量=\"+Runtime.getRuntime().totalMemory()); System.out.println(\"剩余内存=\"+Runtime.getRuntime().freeMemory()); }}

调试并运行程序。

3.编写程序计算下列数学表达式的值 (1) sin(30°) (2) lnπ (3) 253+|-23|

import java.lang.*; class hs{ public static void main(String args[]){ System.out.println(\"sin(30°)=\"+Math.sin(3.141592653/6)); System.out.println(\"lnπ=\"+Math.log(3.141592653)); double a=Math.pow(25,3)+Math.abs(-23); System.out.println(\"25∧3+|-23|=\"+a); } }

思考题:

1、常用的系统类有哪几类?

字符串类,数值类及其子类,数组类,集合类,Object类。 2、静态变量与普通变量的区别?

静态变量:使用static修饰符进行声明在所属类被装载时创建通过类进行访问所属类的所有实例的同一静态变量都是同一个值。非静态变量:不带有static修饰符声明的变量称作非静态变量,在类被实例化时创建通过对象进行访问同一个类的不同实例的同一非静态变量可以是不同的值。

43

《Java程序设计基础》实验指导书

实验九 GUI组件及事件处理

实验目的:

1.熟悉事件处理的步骤

2.学会对鼠标事件、键盘事件的处理

3.了解Java程序的可视化开发软件Jbuilder的使用

实验内容及步骤:

一、事件处理的步骤

1.定义类实现事件监听器接口

要建立处理事件的类,需要说明类实现事件监听器接口,说明格式如下: public class 类名 implements 监听器接口名列表 例如,ActionListener是动作事件监听器接口,定义如下: interface ActionListener

{public abstract void actionPerformed(ActionEvent e); }

如果名为Myclass的类要处理动作事件,就要定义Myclass类实现ActionListener接口。 2.将产生事件的组件注册为事件监听器 如果希望组件产生事件时能够得到响应,应将产生事件的组件注册为事件监听器,注册的语句如下:

组件名.addXXXListener(实现事件监听器接口的类对象); XXX代表事件类型。

例如,假设Myclass是实现ActionListener接口的类。将Myclass类对象注册为事件监听器,对应语句如下:

组件名.addActionListener(new Myclass()); 也可以使用关键字this。

如,组件名.addActionListener(this)。 3.实现处理事件接口的抽象方法

在实现事件监听器接口的类中为抽象方法编写代码。

例如,在Myclass类中为ActionListener接口的actionPerformed()方法编写语句。 public void actionPerformed(ActionEvent e) {填写处理动作事件的语句}

二、鼠标事件和键盘事件的具体处理 1、 鼠标事件 (包括以下两个接口) MouseListener接口 :

mousePressed(MouseEvent e):鼠标键被按下时调用; mouseReleased (MouseEvent e) :鼠标键被释放时调用;

mouseClicked (MouseEvent e) :合并上述两个事件为一次鼠标点击事件; mouseEntered(MouseEvent e) :鼠标进入事件; mouseExited(MouseEvent e) :鼠标离开事件。 getX()和getY()方法:得到鼠标点击时x和y坐标。 getClickCount()方法:可以区别单击操作和双击操作。

44

《Java程序设计基础》实验指导书

MouseMotionListener接口 :

mouseMoved (MouseEvent e) :鼠标移动;

mouseDragged (MouseEvent e) :用户拖动鼠标。

程序1:在Applet界面上点击鼠标,得到点击位置的x和y坐标值,并显示在文本框中。 import java.applet.Applet; import java.awt.*;

import java.awt.event.*;

public class Mouse1 extends Applet implements MouseListener{ int x,y;TextField t1=new TextField(12);

public void init(){ add(t1); addMouseListener(this);} public void mousePressed(MouseEvent e){ x=e.getX();y=e.getY();

t1.setText(\"坐标值:\"+Integer.toString(x)+\}

public void mouseClicked(MouseEvent e){} public void mouseEntered(MouseEvent e){} public void mouseReleased(MouseEvent e){} public void mouseExited(MouseEvent e){} }

实验要求:

观察运行结果,并修改源程序:

(1) 再添加一个文本框t2,可以容纳10个字符;

(2) 修改mousePressed(MouseEvent e)方法,x坐标在文本框t1中显示,y坐标在文

本框t2中显示;

(3) 使用适配器类(裁剪器)将没有使用的方法去掉。 import java.applet.Applet; import java.awt.*;

import java.awt.event.*;

public class Mouse11 extends Applet implements MouseListener{ int x,y;

TextField t1=new TextField(12); TextField t2=new TextField(10);

public void init(){ add(t1);add(t2);addMouseListener(this);} public void mousePressed(MouseEvent e){ x=e.getX();y=e.getY();

t1.setText(\"x坐标值:\"+Integer.toString(x)); t2.setText(\"y坐标值:\"+Integer.toString(y)); }

public void mouseClicked(MouseEvent e){} public void mouseEntered(MouseEvent e){} public void mouseReleased(MouseEvent e){} public void mouseExited(MouseEvent e){}

45

《Java程序设计基础》实验指导书

}

2、 键盘事件

KeyListener接口中有三个方法:

public void keyPressed(KeyEvent e) public void keyReleased(KeyEvent e) public void keyTyped(KeyEvent e)

程序2:

import java.applet.Applet; import java.awt.*;

import java.awt.event.*;

public class Key1 extends Applet implements KeyListener{ String a=\"\";

public void init(){ addKeyListener(this);requestFocus();} public void keyPressed(KeyEvent ke){showStatus(“按下\");} public void keyReleased(KeyEvent ke){showStatus(“抬起\");} public void keyTyped(KeyEvent ke){ a+=ke.getKeyChar();repaint();}

public void paint(Graphics g){ g.drawString(a,10,20);} }

实验要求:

观察运行结果,注意要先用鼠标点击Applet界面,改变焦点,键盘事件才能响应。 三、了解Java程序的可视化开发软件Jbuilder的使用 1. Jbuilde简介:

启动:开始菜单――程序――Borland JBuilder X Enterprise Trial

46

《Java程序设计基础》实验指导书

文件页标签 组件模板 工程窗格 结构窗格 对象编辑器 文件查看标签 Java Applet程序的建立和运行 编写程序:

(1) 在界面上有1个文本框,2个标签,2个按钮,如下图所示。

(2) 功能要求:在文本框中输入文本:当点击“显示”按钮时会在标签1中显示输

入内容;当输入后回车时会在标签2中显示输入内容。

操作步骤:

1. 新建工程(包):

单击菜单中的file――New project,输入包名,选择存储路径(Directory)按finish。

47

《Java程序设计基础》实验指导书

2. 新建应用程序

单击菜单中的file――New,选择Application,输入类名,点击next。 3. 输入新表单名称和标题(显示在程序运行界面的标题栏中的文字),按finish。 4. 组件布局:

(1)单击“文件查看标签”中的Design,修改“对象编辑器”内的“layout”的值,改为null;

(2)利用“组件模板”添加1个文本框,2个标签,2个按钮,如前面图所示;

(3)将组件显示的文本按前面的图修改好,例如:修改文本框,先用鼠标选中要修改的文本框,在对象编辑器内选择“text”选项的值将“jTextField1”改为“请输入”。其它的组件依此类推;

(4)双击“按钮1”,对改按钮进行编程,输入2条语句: String a=jTextField1.getText(); jLabel1.setText(a);

(5)单击“文件查看标签”中的Design,双击文本框组件,对文本框进行编程,输入2条语句:

String a=jTextField1.getText(); jLabel2.setText(a);

(6)单击“文件查看标签”中的Design,双击“按钮2”组件,对改组件进行编程,输入1条语句:System.exit(0); //该语句含义为退出程序 (7)执行程序:

单击菜单中的Run ――Run Project。

到现在为止一个Applicaion已经完成,我们可以考察实验结果了!

在文本框中输入任意文字,回车,该文字会被显示在标签2中,单击按钮1,该文字会被显示在标签1中;单击按钮2,程序退出。

小结:Jbuilder2005的使用。

48

《Java程序设计基础》实验指导书

实验十 多线程机制

实验目的:

1.学会用Jbuilder编写Applet程序 2.掌握编写多线程程序的基本构架 实验内容及步骤:

一、用Jbuilder编写Applet程序 1. Jbuilder界面简介 文件页标签 组件模板 工程窗格 结构窗格 对象编辑器 文件查看标签 Java Applet程序的建立和运行 编写程序:

(3) 在界面上有2个文本框,3个标签,5个按钮,如下图所示。 (4) 功能要求:实现四则运算。

49

《Java程序设计基础》实验指导书

操作步骤:

5. 新建工程(包):

单击菜单中的file――New project,输入包名,选择存储路径(Directory)按finish。 6. 新建应用程序

单击菜单中的file――New,选择web——Applet,输入类名,选中“Generate standad methods”复选框。按finish。 7. 组件布局:

(1)单击“文件查看标签”中的Design,加入Panel组件(作为容器),修改panel1的布局,在 “对象编辑器”内的“layout”的值,改为null;

(2)利用“组件模板”添加各种组件(注意:要添加AWT组件,不能添加Swing组件),如前面图所示;

(3)将组件显示的文本按前面的图修改好。

(4)双击“+”按钮,对按钮进行编程,输入语句: int a,b,c; String d;

a=Integer.parseInt(textField1.getText()); b=Integer.parseInt(textField2.getText()); c=a+b;

label1.setText(\"+\"); d=Integer.toString(c); label3.setText(d);

(5)单击“文件查看标签”中的Design,双击“-”、“×”按钮,输入语句同上(所作的修改自己完成)。“÷”按钮程序如下:

double a,b,c; String d;

a=Double.parseDouble(textField1.getText()); b=Double.parseDouble(textField2.getText()); c=a/b;

label1.setText(\"÷\"); d=Double.toString(c);

50

《Java程序设计基础》实验指导书

label3.setText(d);

(6)单击“文件查看标签”中的Design,双击“退出”按钮,对该组件进行编程,输入语句:System.exit(0); //该语句含义为退出程序 4.执行程序:

单击菜单中的Run ――Run Project。

到现在为止一个Applet程序已经完成,我们可以考察实验结果了。 5.制作jar文件

目的:将本工程的所有文件汇集成一个文件,在嵌入网页中。 (1) 单击菜单中的“wizard”/“achive builder”,选择“applet jar”,点击“next”输入

Archive文件名,选择路径,点击“finish”。

(2) 产生jar文件:单击“project”/“make project”。

现在,在你所建的工程文件夹中已经产生了jar文件(与工程名相同)。 6.修改html文件

(1) 双击“工程窗格”中Applet1.html,点击“文件查看标签”中的source修改代码,

将code下新加入代码:ARCHIVE=\"*.jar\" (*.jar就是你刚刚产生的jar文件)。

(2) 保存文件:点击菜单中的“file”/“save all”,退出。 7.测试:

(1) 将你所建立的工程文件夹下的子文件夹\\classes\\Applet1.html拷到你jar文件所在的文

件夹中;

(2) 双击运行Applet1.html。 大功告成!

结论:现在,你只需要将两个文件(网页文件和jar文件)存放在一起,程序就能运行(不管你存放在哪个文件夹中)。

二、编写多线程程序

1.创建多线程程序的格式

根据实现线程体的方法来看,创建多线程程序的格式有2种:

1)通过继承Thread类创建线程

分别定义不同的线程类,在各自的run方法中定义线程的工作 class mythread1 extends Thread { public void run(){….} } class mythread2 extends Thread { public void run(){….} }

在主类中实例化各线程类,并启动线程. public class demo extends Applet { public void init()

{ mythread t1=new mythread1(); mythread t2=new mythread2(); t1.start(); t2.start();} } 2)通过Runnable接口创建线程

public class C1 extends Applet implements Runnable { „

public void run(){….}

„ }

51

《Java程序设计基础》实验指导书

2. 具体实例:

例1:考察线程的运行(本例为java Application程序,在UltraEdit-32下调试) public class Thread1{

public static void main(String ags[]){ testThread t1=new testThread(\"thead1\"); testThread t2=new testThread(\"thead2\"); t1.start(); t2.start(); }}

class testThread extends Thread{

public testThread(String str){super(str);} public void run(){ for(int i=0;i<3;i++){

System.out.println(getName()+\"在运行\"); try{sleep(1000);

System.out.println(getName()+\"在休眠\"); }

catch(InterruptedException e){} }

System.out.println(getName()+\"已结束\"); } }

例2:本例为java Application程序,在Jbuilder下调试

(一)编写单线程程序:点击按钮“计数”时在文本框中显示1-49的计数,点击按钮“退出”时程序退出。

在单线程程序中,正在计数的过程中你想退出程序是不可能的(点击按钮“退出”时,必须等到计数完成才能退出程序)。 具体过程:(注意:本程序是添加AWT组件编写的)

1)按钮“计数”程序如下(其它程序代码由Jbuilder自动完成): void button1_actionPerformed(ActionEvent e) {

52

《Java程序设计基础》实验指导书

//循环50次,每次递增1。

for (int i = 0; i < 50; i++) { try {

textField1.setText(Integer.toString(i)); //暂时停止当前线程50毫秒。 Thread.sleep(50); }

catch (InterruptedException f){ } } }

2)按钮“退出”程序:System.exit(0);

(二)编写多线程程序:如果要在计数过程中停止程序,就必须在添加一个任务(线程)。 具体过程:

1) 在源程序中加入用于记数的线程类CounterSubTask。 class CounterSubTask extends Thread {

private TextField textField;

public CounterSubTask(TextField argTextField) {

textField = argTextField; }

//以前的计数方法放入线程中的run方法中。 public void run() {

//循环50次,每次递增1。

for (int i = 0; i < 50; i++) {try{

textField.setText(Integer.toString(i)); //暂时停止当前线程50毫秒。

Thread.sleep(50); }

catch (InterruptedException f){ } } } }

2) 按钮“计数”程序如下: //创建记数线程对象。 CounterSubTask cst = new CounterSubTask(textField1); //通过调用线程的start方法启动线程,start方法会自动执行run方法。 cst.start();

3) 按钮“退出”程序:System.exit(0); 运行程序。

4)制作jar文件(就像exe文件一样,可以独立运行)及exe文件: 目的:将本工程的所有文件汇集成一个文件,可以独立运行。 Step1:单击菜单中的“wizard”/“native Executable builder”,点击“finish”。

53

《Java程序设计基础》实验指导书

Step2:产生jar文件及多种可执行文件:单击“project”/“make project”。

现在,在你所建的工程文件夹中已经产生了6个文件(文件名都与工程名相同):以jar为扩展名的文件、以exe为扩展名的文件(DOS版)、以exe为扩展名的文件(WINDOWS版)等。

Step3:双击该jar文件或exe文件,程序就可以运行了。

补充:如果jar文件不能运行,则将jar文件关联改为:\"C:\\j2sdk1.4.0_01\\bin\\javaw.exe\" -jar \"%1\"

小结:通过本次实验,我们得到的结论和实验目的:

1. UltraEdit-32和Jbuilder都是java程序的开发工具; 2. 掌握用Jbuilder开发java Applet程序;

3. 多线程程序的运行机制(并行)和作用(多任务)。

54

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- nryq.cn 版权所有

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务