华联学院《Java语言程序设计》上机指导_第1页
华联学院《Java语言程序设计》上机指导_第2页
华联学院《Java语言程序设计》上机指导_第3页
华联学院《Java语言程序设计》上机指导_第4页
华联学院《Java语言程序设计》上机指导_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

上机指导1

本章对Java语言的基础背景知识进行了简要介绍,讲解了JDK(Java开发工具箱)以及开发工具的使用,同时通过几个简单的Java程序说明了JDK的使用。下面通过上机指导进一步巩固其中相关的知识点。

实验1-1:运算并显示某一算式的运算结果

实验内容

编程实现运算一个简单的算式1234567972,并在屏幕上输出计算的结果。运行后结果如图1-36所示。

图1-36实验1-1运行结果

实验目的

通过这个简单的实例让读者了解JDK的使用,以及对Java程序的编译运行过程有一个实际的了解。

实现思路

在1.5节的简单Java程序中,演示了如何通过Java语言编写程序,并编译运行,最终在屏幕上输出“HelloWorld!”一行文本。同样,对于其他Java语言编写的程序都可按照其步骤进行编译运行。本实验只要少量改动该例子,就可以实现在屏幕上显示该算式的结果,得到如图1-36所示的运行结果。

实验1-2:编写一个JavaApplet在网页中显示两行字符串

实验内容

编写JavaApplet(Java小应用程序),用于在网页中显示两个字符串。运行后效果如图1-37所示。

图1-37在网页上显示若干字符串

实验目的

通过这个简单的实例让读者了解Java小应用程序的使用,并且对JavaApplet的部署与运行有一个实际的了解。

实现思路

在1.7节的简单Java小应用程序示例中,演示了如何通过Java语言编写Java小应用程序并编译运行,然后将其嵌入到网页中,最终在网页上输出文本。同样,对于其他Java语言编写的Java小应用程序我们都可按照其步骤进行编译部署并运行。少量改动该例子代码,就可以实现在网页上显示两个字符串,达到图1-37所示的效果。

实验1-3:编写JavaApplet实现显示系统当前时间

实验内容

编写一个JavaApplet,在屏幕上显示系统当前时间。运行后效果如图1-38所示。

图1-38显示当前系统时间

实验目的

通过这个简单的实例让读者了解JavaApplet的实际应用,并进一步巩固本章所学的知识。

实现思路

通过java.util.date包中的一些方法,获取当前系统的时间并显示,代码如下所示:

importjava.applet.*;

importjava.awt.Graphics;

importjava.util.Date;

publicclassExample1_3extendsApplet{ //继承Applet超类

publicDated;

publicvoidinit() //Applet的初始化方法

{

d=newDate();

}

publicvoidpaint(Graphicsg){ //Applet绘制至屏幕的函数

g.drawString(d.toString(),10,25);

}

}

利用javac命令编译后,将其嵌入网页中,嵌入网页中的代码如下所示:

<html>

<appletheight=300width=300code="Example1_3.class"></applet>

</html>

运行代码,就可以得到如图1-38所示的效果了。

上机指导2

本章对Java的基本语法做了详细的讲解,其中包括Java的基本数据类型、标记符、表达式等。下面通过上机指导进一步巩固其中相关的知识点。

实验2-1:不同类型数据间的运算(一)

实验内容

创建以下4个变量:

charx='h';

intintx=65;

floatfloatx=3.3333f;

doubledoublex=4.444;

编程实现计算charx+intx、floatx–intx、doublex/floatx的结果并在屏幕上显示,获取如图2-28所示的运行结果。

图2-28实验2-1运行结果

实验目的

通过这个简单的实例让读者了解Java语言中的类型自动转换。

实现思路

在2.2.5小节已经介绍了Java语言中基本数据类型值之间自动转换的基本概念,并通过简单的示例进行了演示。

实验2-2:不同类型数据间的运算(二)

实验内容

声明3个变量:

doubledx=3.5;

doubledy=2.8;

intz;

编程实现计算z=dx+dy的结果并在屏幕上显示。运行结果如图2-29所示。

图2-29实验2-2运行结果

实验目的

通过这个简单的实例让读者了解Java语言中的类型强制转换。

实现思路

在2.2.5小节介绍了Java语言中强制类型转换的基本概念,并通过简单的示例进行了演示。

实验2-3:在屏幕上打印出各种基本类型的数值

实验内容

编程实现输出各种类型的常量数值,包括整型、字节型、短整型、字符型、长整型、单精度型、双精度型、布尔型,运行结果如图2-30所示。

图2-30实验2-3运行结果

实验目的

通过这个简单的实例让读者从实际了解Java语言中的各种基本类型,并对其不同类型的数值有一个深刻的印象。

实现思路

定义若干个Java语言中各种基本类型的数值,并在屏幕上显示出来。

代码如下所示:

classDataTypeDemo

{

publicstaticvoidmain(Stringargv[])

{

inta=1; //声明并初始化整型变量a

byteb=127; //声明并初始化字节型变量b

shortd=200; //声明并初始化短整型变量d

charc='C'; //声明并初始字符型变量c

longe=9000000; //声明并初始化长整型变量e

floatf=0.24f; //声明并初始化单精度型变量f

doubleg=1111.111111; //声明并初始化双精度型变量g

booleanbool1=true; //声明并初始化布尔型变量bool1

booleanbool2=false;

System.out.println("Intdataa="+a); //输出整型变量a的值

System.out.println("Bytedatab="+b); //输出字节型变量b的值

System.out.println("Shortdatad="+d); //输出短整型变量d的值

System.out.println("Chardatac="+c); //输出字符型变量c的值

System.out.println("longdatae="+e); //输出长整型变量e的值

System.out.println("floatdataf="+f); //输出单精度型变量f的值

System.out.println("doubledatag="+g); //输出双精度型变量g的值

System.out.println("Booleandatabool1="+bool1); //输出布尔型变量bool1的值

System.out.println("Booleandatabool2="+bool2); //输出布尔型变量bool2的值

}

}

通过javac、java等命令编译并运行程序,运行程序结果如图2-30所示。

上机指导3

本章对Java语言中的控制语句做了详细讲解,其中包括Java的循环语句、Java的跳转语句、Java的选择语句、Java的断言等,本节将利用已讲解的知识进行实践。

实验3-1:多重for循环绘制图形

实验内容

编程实现运算一个简单的图形绘制,利用符号“*”的个数,实现不同的图形。实现结果如图3-30所示。

图3-30实验3-1运行结果

实验目的

通过这个简单实例让读者巩固学习for语句的使用。

实现思路

根据绘制图形的规律,发现“*”符号的变化规律,从而利用for循环对其进行绘制。

关键代码如下所示:

inttemp=0; //声明并初始化变量temp,

for(inti=0;i<2*n-1;i++)

{

if(i<=n)

temp=i;

else

temp=2*n-1-i; //计算temp的值

for(intj=0;j<temp;j++) //内层for循环

System.out.print("*"); //打印每行中的"*"字符

System.out.println(); //打印完一行后换行

}

通过javac、java等命令编译并运行程序,运行结果如图3-30所示。

实验3-2:使用switch语句实现条件分支

实验内容

编程实现运算一个简单的程序,程序可以根据学生的成绩判断学生成绩的等级。声明一个整形数组保存学生成绩,如:intstudent[]={95,85,75,65,55}。程序运行结果如图3-31所示。

图3-31实验3-2运行结果

实验目的

通过这个简单实例让读者利用switch语句来实现条件分支,实现对于不同分数段的成绩,输出不同等级标识。

实现思路

首先定义5个学生,分别对其的成绩进行赋值,并在for循环语句中利用Switch语句分别对每个学生的成绩进行判断。

关键代码如下所示:

intstudent[]={95,85,75,65,55}; //声明并初始化一个数组,用存放5个学生成绩

for(inti=0;i<5;i++) //通过循环分别判判断每个学生成绩

{

switch(student[i]/10)//使用switch语句,并将成绩整除10后的值作为比较因子

{

case9:

System.out.println("student"+i+"'sresultisA!");

//学生成绩整除10后结果为9的,输出等级为"A"

break;

case8:

System.out.println("student"+i+"'sresultisB!");

//学生成绩整除10后结果为8的,输出等级为"B"

break;

case7:

System.out.println("student"+i+"'sresultisC!");

//学生成绩整除10后结果为7的,输出等级为"C"

break;

case6:

System.out.println("student"+i+"'sresultisD!");

//学生成绩整除10后结果为6的,输出等级为"D"

break;

default:

System.out.println("student"+i+"'sresultisF!");

//学生成绩整除10后结果为1~5的,输出等级为"F"

}

}

通过javac、java等命令编译并运行程序,运行程序结果如图3-31所示。

实验3-3:使用switch语句实现条件分支测试break功能

实验内容

在实验3-2的基础上进行简单修改,在每个case语句后不加break语句。运行后效果如图3-32所示。显然这个运行结果是不符合常规逻辑的。

图3-32实验3-3运行结果

实验目的

通过这个简单实例让读者利用switch语句来实现条件分支,用含有break和不含有break的case语句做比较,测试break的功能。

实现思路

结合实验3-2进行比较设计,实现思路与实验3-2基本相同,不同之处在于:每个case语句之后没有break语句。通过比较输出结果的区别,进一步了解break语句的功能。

关键代码如下所示:

intstudent[]={95,85,75,65,55}; //声明并初始化一个数组,用存放5个学生成绩

for(inti=0;i<5;i++) //通过循环分别判判断每个学生成绩

{

switch(student[i]/10)//使用switch语句,并将成绩整除10后的值作为比较因子

{

case9:

System.out.println("student"+i+"'sresultisA!");

//学生成绩整除10后结果为9的,输出等级为"A"

case8:

System.out.println("student"+i+"'sresultisB!");

//学生成绩整除10后结果为8的,输出等级为"B"

case7:

System.out.println("student"+i+"'sresultisC!");

//学生成绩整除10后结果为7的,输出等级为"C"

case6:

System.out.println("student"+i+"'sresultisD!");

//学生成绩整除10后结果为6的,输出等级为"D"

default:

System.out.println("student"+i+"'sresultisF!");

//学生成绩整除10后结果为1~5的,输出等级为"F"

}

}

通过javac、java等命令编译并运行程序,运行程序结果如图3-32所示。

上机指导4

本章介绍了面向对象的基本思想,并详细介绍了类的定义及其使用,同时介绍了成员变量与方法的继承、方法的重载、final与abstract的类与方法。

实验4-1:对象引用型成员变量的使用

实验内容

编程实现两个同类对象的比较,两个对象的成员变量intMember都为默认值66,并在屏幕上输出比较的结果。运行后效果如图4-12所示。

图4-12实验4-1运行结果

实验目的

通过这个简单的实例让读者了解对象引用型成员变量的使用,加深对类、对象的理解。

实现思路

首先利用定义类的成员变量intMember默认值为66,两个对象的intMember成员变量初始值都是66,两个对象是一样的。第一次比较两个引用返回的是False,因为各自指向不同的对象。第二次比较两个引用返回的是True,因为在比较前将ref2的值赋给了ref1,这样两个引用指向同一个对象了。

关键代码如下所示:

//声明对象引用并创建对象

Sample6_4ref1=newSample6_4();

Sample6_4ref2=newSample6_4();

//打印对象信息

System.out.println("Member="+Member+",Member="+Member);

//对引用变量进行比较

if(ref1==ref2)

{

System.out.println("ref1与ref2指向同一个对象。");

}

else

{

System.out.println("ref1与ref2不是指向同一个对象。");

}

ref1=ref2;

if(ref1==ref2)

{

System.out.println("ref1与ref2指向同一个对象。");

}

else

{

System.out.println("ref1与ref2不是指向同一个对象。");

}

通过javac、java等命令编译并运行程序,运行程序结果如图4-12所示。

实验4-2:含有返回值的方法的使用

实验内容

图4-13实验4-2运行结果

编程实现调用带有返回值的方法,并在屏幕上输出调用后的结果。分别定义返回值为整形、字符型、双精度等的方法,为了简单,方法中可以不做任何操作,直接将已定义的变量值返回。运行后效果如图4-13所示。

实验目的

在书中简单介绍了方法的使用,而本实验将给读者介绍带有返回值的方法的使用,让读者了解如果调用带有返回值的方法。

实现思路

首先利用定义含有返回值的各种方法,如:返回值为整型的,返回值为字符型的,返回值为双精度型的。在主方法里,可以直接调用各种方法,将其返回值直接输出至屏幕。

关键代码如下所示:

//获取整型变量,返回值为int型

publicintgetInt()

{returna;}

//获取字符型变量,返回值为char型

publicchargetChar()

{returnc;}

//获取单精度型变量,返回值为float型

publicfloatgetFloat()

{returnf;}

//获取双精度型变量,返回值为double型

publicdoublegetDouble()

{returnd;}

//获取字符串对象变量,返回值为String型

publicStringgetString()

{returnstr;}

//main方法中可以直接调用这些已经定义的方法。

//定义各种类型的类变量

privateinta=100;

privatecharc='C';

privatefloatf=3.0f;

privatedoubled=4.0;

privateStringstr="Hello";

//将方法的返回值输出

System.out.println(getInt());

System.out.println(getChar());

System.out.println(getFloat());

System.out.println(getDouble());

System.out.println(getString());

通过javac、java等命令编译并运行程序,运行程序结果如图4-13所示。

实验4-3:使用对象模拟“商店客户折扣卡”功能

实验内容

编程实现一个模拟的用户消费信用卡的示例,在其中用户Customer类具有用户名、地址、卡号、消费额度、可以享受的打折度等多种个人信息;而CustomerDemo类中建立3个消费者,对其分别进行操作,模拟其行为。运行后效果如图4-14所示。

图4-14实验4-3运行结果

实验目的

在前几节介绍了面向对象的基本概念,包括类、对象、属性以及方法。在这个基础上,用两个面向对象的简单程序,继续让读者充分体会面向对象编程的方法。

实现思路

简单模拟了一个商店客户折扣卡的功能,自定义Customer类用来保存在某个商店中的客户的折扣卡信息。在主类CustomerDemo中,创建Customer类的一个数组对象,该数组中包含了三个Customer的对象,用来保存三个不同的消费者各自持有的折扣卡信息。通过这三个对象,可以根据用户消费的金额来改变用户在本店中所能享受的折扣价格。

关键代码如下所示:

//声明三个消费用户Customer对象

Customercustomer[]=newCustomer[3];

publicCustomerDemo()

{

//创建并初始化所声明的三个Customer对象

customer[0]=newCustomer("c0001","wangxyw","BeiJing","wangxyue@");

customer[1]=newCustomer("c0002","XuQuan","ShangHai","chunticha@");

customer[2]=newCustomer("c0003","XuGuangYang","BeiJing","xugy@");

//customer[0]用户消费2800.00元

customer[0].buy(2800.00);

//设置用户下次购物所能享受的折扣

customer[0].setDiscount();

//customer[1]用户消费1688.00元

customer[1].buy(1688.00);

//设置用户下次购物所能享受的折扣

customer[1].setDiscount();

//customer[2]用户消费980.00元

customer[2].buy(980.00);

//设置用户下次购物所能享受的折扣

customer[2].setDiscount();

//显示所有用户的全部信息

for(inti=0;i<customer.length;i++)

{

System.out.println("customer["+i+"]");

System.out.println("cardID:"+customer[i].getCardID());

System.out.println("name:"+customer[i].getName());

System.out.println("cost:"+customer[i].getCost());

System.out.println("discount:"+customer[i].getDiscount()*10);

System.out.println("address:"+customer[i].getAddress());

System.out.println("email:"+customer[i].getEmail()+"\n");

}

}

classCustomer

{

privateStringcardID; //用于折扣卡卡号

privateStringname; //用户名

privatedoublecost=0; //用户消费金额

privateStringaddress; //用户住址

privateStringemail; //用户email

privatedoublediscount=1; //用户所能享受的折扣

publicCustomer(Stringid,Stringname,Stringadd,Stringemail)

{

cardID=id;

=name;

address=add;

this.email=email;

}

//当用于购买商品后,增加用户消费值

publicvoidbuy(doublecost)

{this.cost+=cost;}

//根据用户的消费额度来改变用户所能享受的折扣

publicvoidsetDiscount()

{

if(cost>2000.00)

discount-=0.1;

elseif(cost>1000.00)

discount-=0.05;

}

//用于获取和设置用户地址的方法

publicStringgetAddress()

{returnaddress;}

publicvoidsetAddress(Stringaddress)

{this.address=address;}

//用于获取和设置用户卡号的方法

publicStringgetCardID()

{returncardID;}

publicvoidsetCardID(StringcardID)

{this.cardID=cardID;}

//用于获取用户消费金额的方法

publicdoublegetCost()

{returncost;}

//用于获取用户地折扣值的方法

publicdoublegetDiscount()

{returndiscount;}

//用于获取和设置用户信箱地址的方法

publicStringgetEmail()

{returnemail;}

publicvoidsetEmail(Stringemail)

{this.email=email;}

//用于获取和设置用户名的方法

publicStringgetName()

{returnname;}

publicvoidsetName(Stringname)

{=name;}

}

通过javac、java等命令编译并运行程序,运行程序结果如图4-14所示。

上机指导5

本章对Java的面向对象思想做了进一步深入介绍,包括Java中的接口、抽象类、匿名类等方面知识,并介绍如果利用这些机制编写Java程序。

实验5-1:学习构成子类与父类之间的方法覆盖(重写)

实验内容

编程实现一个子类覆盖父类的方法startUp,声明一个指向子类对象,类型为父类的对象v,并调用方法startUp。运行后效果如图5-22所示。

图5-22运行结果

实验目的

通过这个简单的实例让读者了解构成方法覆盖的条件,而方法若想要构成覆盖,首先方法的唯一标识必须与被重写方法完全相同,其次参数列表也必须完全一致。

实现思路

首先定义Vehicle父类、Car子类继承Vehicle类作为父类。在main方法中声明变量v为Vehicle类型,指向Car对象。Car类中方法startUp与Vehicle类中方法startUp的参数列表不一样,不满足构成重写的条件。对方法的调用使用的是父类Vehicle中方法的唯一标识。

关键代码如下所示:

classVehicle

{

publicvoidstartUp()

{

System.out.println("一般车辆的启动方法!!");

}

}

classCarextendsVehicle

{

publicvoidstartUp(inti)

{

System.out.println("轿车的启动方法!!");

}

}

//main方法中的调用

publicstaticvoidmain(String[]args)

{

//创建对象与调用方法

Vehiclev=newCar();

System.out.print("实际调用的方法为:");

v.startUp();

}

通过javac、java等命令编译并运行程序,程序运行结果如图5-22所示。

实验5-2:使用基于接口的多态

实验内容

编程实现一个接口Food,两个类Apple、Beef,分别都实现了接口Food中的方法doEat。其中Apple继承其父类Fruit,声明其属性为水果;Beef继承其父类Meat,声明其属性为肉类。运行后效果如图5-23所示。

图5-23实验5-2运行结果

实验目的

通过这个简单的实例让读者进一步学习基于接口的多态,体会基于接口的多态要比基于继承的多态灵活性更好。继承只能让超类引用指向与其属于同一类的对象;接口引用则能指向任意类型的对象,即使对象间没有任何关系,只要这些对象所在的类实现了该接口即可。

实现思路

分别创建两个具体类:苹果类(Apple)和牛肉类(Beef),其中,苹果类(Apple)继承自水果类(Fruit),而牛肉类(Beef)继承自肉类(Meat),但是这两个类均实现了食物(Food)接口,并且实现了接口中食用的方法(doEat)。在主方法中用食物接口引用f指向了创建的苹果对象,并且调用其食用的方法,接着用同样的引用f指向创建的牛肉对象,并且以同样的方式调用了其食用的方法。

关键代码如下所示:

interfaceFood

{

//吃食物的方法

publicvoiddoEat();

}

//水果抽象类

abstractclassFruit

{}

//肉抽象类

abstractclassMeat

{}

//苹果类继承自水果类实现了食物接口

classAppleextendsFruitimplementsFood

{

//实现接口中的方法

publicvoiddoEat()

{

System.out.println("我是苹果,我属于水果,我可以充当食物被吃掉!!");

}

}

//牛肉类继承自肉类实现了食物接口

classBeefextendsMeatimplementsFood

{

//实现接口中的方法

publicvoiddoEat()

{

System.out.println("我是牛肉,我属于肉类,我可以充当食物被吃掉!!");

}

}

//main方法

//创建苹果对象

Foodf=newApple();

//调用苹果吃的方法

f.doEat();

//创建牛肉对象

f=newBeef();

//调用牛肉吃的方法

f.doEat();

通过javac、java等命令编译并运行程序,程序运行结果如图5-23所示。

实验5-3:匿名内部类作用的体现

实验内容

编程实现利用匿名内部类实现比较器,将5个学生根据其年龄大小依次输出。运行后效果如图5-24所示。

图5-24实验5-3运行结果

实验目的

通过这个简单的实例让读者了解匿名内部类的作用。在实际开发中,有很多自己编写的类只需要使用一次,并不需要多次创建对象。这时使用匿名内部类将类代码与创建对象同部完成,既方便又提高了代码的可维护性。

实现思路

定义作为集合元素的Student类,该类实现了Comparable接口,并实现了接口中的compareTo方法,指定其对象将按照学号比较大小,并且重写了toString方法,以便其能够更好的打印显示。在主方法中创建了一个TreeSet对象,并通过匿名内部类为其指定了自己的比较器,指出按学生的年龄从大到小进行排列。最后,向TreeSet中添加了5个Student对象,并将自动排序后的结果打印输出。

关键代码如下所示:

classStudentimplementsComparable

{

//学生的成员属性

Stringname;

intage;

intclassNum;

//学生类的无参构造器

publicStudent()

{}

//学生类的有参构造器

publicStudent(Stringname,intage,intclassNum)

{

=name;

this.age=age;

this.classNum=classNum;

}

//重写toString方法

publicStringtoString()

{

//将类名引导的属性序列字符串返回

return"\nwyf.jc.Student[name="+

+",age="+this.age

+",classNum="+this.classNum

+"]\n";

}

//实现compareTo方法

publicintcompareTo(Objecto)

{

//强制类型转换

Students=(Student)o;

//用classNum作为基准进行排序

returnthis.classNum-s.classNum;

}

}

//main方法中

//利用匿名内部类创建比较器

TreeSetts1=newTreeSet(

newComparator()

{

publicintcompare(Objecto1,Objecto2)

{

//将接收到的对象的引用进行强制类型转换

Students1=(Student)o1;

Students2=(Student)o2;

//指定按年龄进行排序

returns2.age-s1.age;

}

});

//向ts1中添加内容不同的学生对象的元素

ts1.add(newStudent("tom",21,97005));

ts1.add(newStudent("jerry",19,97003));

ts1.add(newStudent("lucy",18,97004));

ts1.add(newStudent("smith",28,97001));

ts1.add(newStudent("jc",23,97002));

//打印ts1中的元素

System.out.println("这里的Sorted集是按年龄从大到小进行的排序:");

System.out.println(ts1);

通过javac、java等命令编译并运行程序,运行程序结果如图5-24所示。

上机指导6

本章对Java的常用类库进行了介绍,包括Java中的Object类、Java中的数组、集合类、字符串类等。

实验6-1:编写数组复制的程序

实验内容

编程实现数组复制a=b,并对数组b中的元素进行修改时,输出数组a的结果。运行后效果如图6-29所示。

图6-29实验6-1运行结果

实验目的

通过这个简单的实例让读者学习数组复制,并理解数组复制后对其中一个数组进行操作,对另一个数组的影响。在Java中,将一个数组引用赋给另一个数组引用后,这两个数组引用将指向同一个数组对象。若使用箭头表示数组引用,椭圆表示数组对象,则图6-28所示表示了这种情况。

图6-28数组复制示意图

实现思路

两个引用a、b指向同一个数组对象,则通过一个引用修改,另一个引用能感知变化。

关键代码如下所示:

//创建了一维int数组对象,并让引用a指向该数组对象

int[]a={1,2,3};

//将a的值赋给b,让b也指向此数组对象

int[]b=a;

//通过引用b,将数组的第2个元素赋值为5

b[1]=5;

System.out.println("a[1]="+a[1]+",b[1]="+b[1]);

inti1=2;

inti2=i1;

i2=i2+6;

System.out.println("i1="+i1+",i2="+i2);

通过javac、java等命令编译并运行程序,程序运行结果如图6-29所示。

实验6-2:改变String对象引用的指向

实验内容

编程实现声明字符串String类s1、s2,对其进行初始化后,令s2=s1.concat(s2),再输出s1、s2的内容。运行后效果如图6-31所示。

图6-31运行结果

实验目的

通过这个简单的实例让读者了解Java中String是不可变字符串类的含义。在Java中字符串对象是永远不变的,其从创建的那一刻开始,内容将永远不会发生变化,也正是因为这一点,才保证了字符串对象可以复用。但字符串对象引用的指向是可以发生变化的,这样在使用时也就感觉不到字符串是不能改变的了。从本实验读者就可以理解String字符串不可变的含义。

实现思路

分别创建字符串对象s1和s2。将字符串s2的内容追加到字符串s1内容的后边组成新的内容,并查找字符串常量池中有没有与新内容相同的字符串。若有,将引用s2指向该对象;若没有,则新创建一个包含新内容的字符串对象,并将引用s2指向该对象。实现结果示意图如图6-30所示。

图6-30改变字符串String引用指向示意图

关键代码如下所示:

//创建字符串对象s1与s2

Strings1="JavaSE6.0";

Strings2="核心技术大全";

//将字符串s1与s2相连接并将结果赋给s2

s2=s1.concat(s2);

//打印字符串s1与s2

System.out.println("对字符串s1进行连接字符串操作,字符串s1与s2的结果为:");

System.out.println("s1="+s1);

System.out.println("s2="+s2);

通过javac、java等命令编译并运行程序,程序运行结果如图6-31所示。

实验6-3:使用迭代器完成遍历

实验内容

编程实现Student类,其包含成员变量name、age、classNum,并在主方法中新建初始化3个Student对象,并在屏幕上输出3个Student对象的属性值;为了简便起见,可以在Student类中改写方法toString。运行后效果如图6-32所示。

图6-32运行结果

实验目的

通过这个简单的实例让读者进一步学习理解迭代器的使用。实际开发中,经常需要对集合中的所有元素进行遍历,对于List系列而言,可以利用元素的索引进行,而Set系列是没有索引的,这时就需要使用迭代器来完成遍历。所有实现了Collection接口的类都有一个名称为iterator的方法来获取迭代器。

实现思路

首先声明了用作元素的Student类,为了打印显示方便,重写了其toString方法。在主方法中创建了一个HashSet对象,并向其中添加了5个Student类型的元素,最后用迭代器对HashSet中元素进行遍历。

关键代码如下所示:

classStudent

{

//学生的成员属性

Stringname;

intage;

intclassNum;

//学生类的无参构造器

publicStudent()

{}

//学生类的有参构造器

publicStudent(Stringname,intage,intclassNum)

{

=name;

this.age=age;

this.classNum=classNum;

}

//重写toString方法

publicStringtoString()

{

//将类名引导的属性序列字符串返回

return"\nwyf.jc.Student[name="+

+",age="+this.age

+",classNum="+this.classNum

+"]\n";

}

}

//main主方法中

//创建HashSet对象

HashSeths=newHashSet();

//向HashSet对象中添加内容不同的学生对象元素

hs.add(newStudent("tom",21,97005));

hs.add(newStudent("jerry",19,97003));

hs.add(newStudent("lucy",18,97004));

//打印输出HashSet中的内容

System.out.println("这里是HashSet操作前的内容:");

System.out.println(hs);

//获取集合对应的迭代器

Iteratorit=hs.iterator();

//通过迭代器遍历集合,并修改元素的内容

while(it.hasNext())

{

//对获取的元素引用进行强制类型转换

Studenttemp=(Student)it.next();

//修改元素的成员值

temp.classNum=2003001;

}

//打印输出HashSet中的内容

System.out.println("这里是HashSet操作后的内容:");

System.out.println(hs);

通过javac、java等命令编译并运行程序,程序运行结果如图6-32所示。

上机指导7

本章介绍了JavaSwing应用程序的基本知识,包括JFrame、JPanel、JLabel、JButton、JCheckBox等基本控件、容器、常用组件的各方面知识。

实验7-1:组合使用文本区与滚动窗口

实验内容

编程实现文本区与滚动条的综合使用,实现了4个按钮jbArray[1]、jbArray[2]、jbArray[3]、jbArray[4],按下4个按钮分别改变文本区的换行状态,包括自动换行、不换行、单词边界、字符边界。运行后效果如图7-8所示。

图7-8实验7-1运行结果

图7-8实验7-1运行结果(续)

实验目的

书中已经介绍了文本区与滚动窗口的基本知识,通过这个简单的实例让读者学习文本区域滚动窗口的使用。在自动换行的情况下,当文本内容超过一行时,文本区自动换行。当文本区超过滚动窗口的大小时,滚动窗口根据需要自动出现水平或垂直滚动条。在单词边界换行的情况下,文本区在自动换行时不会把单词拆开;而在字符边界换行的情况下,文本区在自动换行时会根据需要将单词拆开。

实现思路

将文本区放到滚动窗口中,并向文本区中添加了一些文本,在初始情况下文本区是字符边界自动换行。实现了4个按钮,按下4个按钮分别改变文本区的换行状态。

关键代码如下所示:

publicclassSample7_1extendsJFrameimplementsActionListener

//创建JPanel对象

privateJPaneljp=newJPanel();

//创建按钮数组

privateJButton[]jbArray=

{newJButton("自动换行"),newJButton("不换行"),

newJButton("单词边界"),newJButton("字符边界")};

//创建文本区

privateJTextAreajta=newJTextArea();

//将文本区作为被滚动控件创建滚动窗体

privateJScrollPanejsp=newJScrollPane(jta);

publicSample7_1()

{

//设置JPanel的布局管理器

jp.setLayout(null);

//循环对按钮进行处理

for(inti=0;i<4;i++)

{

//设置按钮的大小文职

jbArray[i].setBounds(20+i*110,120,90,20);

//将按钮添加到JPanel中

jp.add(jbArray[i]);

//为按钮注册动作事件监听器

jbArray[i].addActionListener(this);

}

//设置JScrollPane的大小与位置

jsp.setBounds(20,20,450,80);

//将JScrollPane添加到JPanel容器中

jp.add(jsp);

//设置JTextArea为自动换行

jta.setLineWrap(True);

//为JTextArea添加10条文本

for(inti=0;i<20;i++)

{

jta.append("["+i+"]Hello,thisisanExample!");

}

//将JPanel容器添加进窗体

this.add(jp);

//设置窗体的标题、大小位置以及可见性

this.setTitle("文本区与滚动条");

this.setResizable(False);

this.setBounds(100,100,500,180);

this.setVisible(True);

}

//实现ActionListener中的方法

publicvoidactionPerformed(ActionEvente)

{

if(e.getSource()==jbArray[0])

{//按下自动换行按钮

jta.setLineWrap(True);

}

elseif(e.getSource()==jbArray[1])

{//按下不换行按钮

jta.setLineWrap(False);

}

elseif(e.getSource()==jbArray[2])

{//按下单词边界按钮

jta.setWrapStyleWord(True);

}

elseif(e.getSource()==jbArray[3])

{//按下字符边界按钮

jta.setWrapStyleWord(False);

}

}

通过javac、java等命令编译并运行程序,程序运行结果如图7-8所示。

实验7-2:使用滑块与进度条

实验内容

编程实现滑块与进度条的综合使用,设置滑块值为1000,并为两个组件注册事件监听器ChangeEvent,实现当滑块滑动后进度条将指示滑块的当前值。运行后效果如图7-9所示。

图7-9实验7-2运行结果

实验目的

通过这个简单的实例让读者学习并巩固关于滑块与进度条的知识及使用。滑块可以从指定的范围内选取一个值,而进度条则可以指示当前值在指定范围内的百分比。在恰当的情况下使用滑块或进度条可以使得界面的交互更加友好,使用更加方便。

实现思路

使用了一个滑块与一个进度条,滑块设置为绘制主副刻度及主刻度标签,进度条设置为显示进度百分比的普通模式。同时,代码中为滑块注册了ChangeEvent事件监听器,当滑块被拖动时进度条即时显示对应的百分比。

关键代码如下所示:

publicclassSample7_2extendsJFrameimplementsChangeListener

{

//创建JPanel容器

privateJPaneljp=newJPanel();

//创建进度条与滑块

privateJProgressBarjpb=newJProgressBar(0,1000);

privateJSliderjs=newJSlider(0,1000);

//创建标签数组

privateJLabel[]jlArray={newJLabel("请拖动滑块"),newJLabel("进度指示条")};

publicSample7_2()

{

//为容器JPanel设置布局管理器

jp.setLayout(null);

//设置标签的大小位置,并将标签添加进JPanel容器

for(inti=0;i<jlArray.length;i++)

{

jlArray[i].setBounds(20,20+i*100,80,30);

jp.add(jlArray[i]);

}

//设置滑块的大小位置

js.setBounds(20,40,450,50);

//将滑块添加进JPanel

jp.add(js);

//设置进度条的大小位置

jpb.setBounds(20,150,450,26);

//将进度条添加进容器JPanel

jp.add(jpb);

//设置滑块到绘制刻度标记以及主刻度标签的状态

js.setPaintTicks(True);

js.setPaintLabels(True);

//分别设置主副刻度标记的间隔

js.setMajorTickSpacing(200);

js.setMinorTickSpacing(40);

//为滑块注册ChangeEvent事件监听器

js.addChangeListener(this);

//设置进度条的初始值

jpb.setValue(500);

//设置进度条将显示信息字符串

jpb.setStringPainted(True);

//将JPanel添加进窗体

this.add(jp);

//设置窗体的标题、大小位置以及可见性

this.setTitle("滑块与进度条示例");

this.setResizable(False);

this.setBounds(100,100,500,250);

this.setVisible(True);

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}

publicvoidstateChanged(ChangeEvente)

{

//设置当滑块滑动后进度条将指示滑块的当前值

jpb.setValue(js.getValue());

}

通过javac、java等命令编译并运行程序,运行程序结果如图7-9所示。

实验7-3:文件、颜色对话框综合案例

实验内容

编程实现文件、颜色对话框的综合使用;通过选择“设置”菜单中的“设置颜色”可以设置标签字体的颜色,通过选择“设置”菜单中的“打开文件”可以动态在标签中显示打开文件的名称。运行后效果如图7-10所示。

图7-10实验7-3运行结果

实验目的

通过这个简单的实例给读者演示Swing中的文件选择框与颜色选择框的使用。

实现思路

在窗体中放置了一个标签,通过选择“设置”菜单中的“设置颜色”可以设置标签字体的颜色,通过选择“设置”菜单中的“打开文件”可以动态地在标签中显示打开文件的名称。actionPerformed事件处理方法中,根据选择菜单项的不同弹出对应的对话框设置标签字体的颜色或修改标签的内容。

关键代码如下所示:

publicclassSample7_3extendsJFrameimplementsActionListener

{

//创建标签

JLabeljl=newJLabel("你好,我是一个标签!!!",JLabel.CENTER);

//创建菜单栏

JMenuBarjmb=newJMenuBar();

//创建"设置"菜单

JMenujm=newJMenu("设置");

//创建颜色与文件菜单项

JMenuItemjmiColor=newJMenuItem("设置颜色");

JMenuItemjmiFile=newJMenuItem("打开文件");

//创建文件选择器

JFileChooserjfc=newJFileChooser("d:\\");

publicSample7_3()

{

//将菜单栏添加到窗体中

this.setJMenuBar(jmb);

//将设置菜单添加到菜单栏中

jmb.add(jm);

//将菜单项添加到菜单中

jm.add(jmiColor);

jm.add(jmiFile);

//为菜单项注册ActionEvent事件监听器

jmiColor.addActionListener(this);

jmiFile.addActionListener(this);

//将标签添加到窗体中

this.add(jl);

//对文件选择器进行初始化

//删除原有的文件选择器

jfc.removeChoosableFileFilter(jfc.getChoosableFileFilters()[0]);

//添加可以接收jpeg图片文件的选择器

jfc.addChoosableFileFilter(newFileNameExtensionFilter("JPEG图片文件","jpg","jpeg"));

//添加可以接收gif图片文件的选择器

jfc.addChoosableFileFilter(newFileNameExtensionFilter("gif图片文件","gif","GIF"));

//设置窗体的关闭动作、标题、大小位置以及可见性

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

this.setTitle("颜色文件对话框示例");

this.setBounds(100,100,300,90);

this.setVisible(True);

}

//实现ActionListener监听接口中的方法

publicvoidactionPerformed(ActionEvente)

{

if(e.getSource()==jmiColor)

{//选中设置颜色菜单项

Colorc=JColorChooser.showDialog(this,"请选择标签文字颜色",Color.cyan);

jl.setForeground(c);

}

elseif(e.getSource()==jmiFile)

{//选中打开文件菜单项

jfc.showOpenDialog(this);

jl.setText("您选择打开文件:"+jfc.getSelectedFile().getName());

}

}

通过javac、java等命令编译并运行程序,程序运行结果如图7-10所示。

上机指导8

本章详细介绍了Applet的基础知识、工作原理、生命周期,以及Applet的部署和基本事件的处理,以及向Applet传递参数等知识。

实验8-1:Applet简单使用

实验内容

编程实现Applet,小应用程序在生命周期的各个方法中,只是简单地表明其状态,不做复杂工作;如在初始化时,在init方法中在输出项buffer中添加“Applet初始化...”。运行后效果如图8-8所示。

图8-8实验8-1运行结果

实验目的

通过这个简单的实例让读者了解Applet生命周期的全过程、最简单的Applet标签的表示、appletviewer的指向SimpleApp类。

实现思路

首先定义Applet中的init(),start(),stop(),destroy(),paint()等方法,并在SimpleApp.html中利用applet标签定义。系统首先调用了Applet类中的init()方法,随后调用了Applet类中的start()方法,最后调用了Applet类中的paint()方法。

关键代码如下所示:

publicvoidinit(){

buffer=newStringBuffer();

addItem(“Applet初始化...");

}

publicvoidstart(){

addItem("Applet启动...");

}

publicvoidstop(){

addItem("Applet停止运行...");

}

publicvoiddestroy(){

addItem("准备卸载...\n");

}

voidaddItem(StringnewWord){

System.out.println(newWord);buffer.append(newWord);

repaint();

}

publicvoidpaint(Graphicsg){

g.drawRect(0,0,getSize().width-1,

getSize().height-1);

g.drawString(buffer.toString(),5,15);

}

}

相应的SimpleApp.html内容为:

<appletcode="SimpleApp.class"

width="300"height="50">

</applet>

使用java、appletviewer命令编译并运行程序,程序运行结果如图8-8所示。

实验8-2:在Applet中使用BorderLayout

实验内容

编程实现Applet中使用BorderLayout管理器,在管理器个5个区域内,分别添加5个按钮,包括buttonWest、buttonEast、buttonCenter、buttonNorth、buttonSouth,5个按钮没有操作。运行后效果如图8-9所示。

图8-9实验8-2运行结果

实验目的

通过这个简单实例让读者在Applet中使用布局管理器BorderLayout。在Applet中使用各种布局管理器加载方式与在Application中基本相似,通过这个例子,读者可以学会在Applet中使用布局管理器。

实现思路

首先定义5个按钮,分别是buttonWest、buttonEast、buttonCenter、buttonNorth、buttonSouth,并对其分别进行标识。利用setLayout方法及add方法创建BorderLayout布局管理器,将各个按钮加载至BorderLayout布局管理器的各个区域内。

关键代码如下所示:

publicclassBorderLayoutTestextendsApplet{

ButtonbuttonNorth,buttonSouth,

buttonWest,buttonEast,buttonCenter;

publicvoidinit(){

buttonNorth=newButton("North");

buttonSouth=newButton("South");

buttonWest=newButton("West");

buttonEast=newButton("East");

buttonCenter=newButton("Center");

setLayout(newBorderLayout());

add(buttonNorth,BorderLayout.NORTH);

add(buttonSouth,BorderLayout.SOUTH);

add(buttonWest,BorderLayout.WEST);

add(buttonEast,BorderLayout.EAST);

add(buttonCenter,BorderLayout.CENTER);

}

}

HTML文件内容为

<appletcode="BorderLayoutTest.class"

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论