面向对象程序设计实验指导书定稿Word文件下载.docx
《面向对象程序设计实验指导书定稿Word文件下载.docx》由会员分享,可在线阅读,更多相关《面向对象程序设计实验指导书定稿Word文件下载.docx(118页珍藏版)》请在冰豆网上搜索。
8
MVC和Swing模型
掌握Swing组件的模型-视图-控件结构,JSpinner和JList
9
JTable和JTree
掌握JTable和JTree的用法
10
Java数据库程序设计
掌握使用JDBCAPI访问数据库的基本方法
11
高级Java数据库程序设计
掌握批处理插入数据的方法;
掌握处理可更新和可滚动结果集方法
12
JSP基础
掌握JSP程序设计基础
Selective
13
Web应用程序开发
掌握创建基于JSP的Web应用程序的方法
Comprehensive
实验G01:
泛型
一、实验名称和性质
所属课程
面向对象程序设计
实验名称
实验学时
实验性质
✓验证综合✓设计
必做/选做
✓必做选做
二、实验目的
1.理解为什么泛型类型可以提高可靠性和可读性;
2.了解通配符类型并理解为什么有必要使用该类型;
3.理解泛型类的所有实例共享同一个运行类文件。
三、实验内容
1.构建两个ArrayList对象list1,list2,往两个对象中各添加两个元素(如输入1,2),并输出(验证性内容)。
2.应用泛型编写程序(设计性内容)。
四、实验的软硬件环境要求
硬件环境要求:
PC计算机;
内存512MB以上
使用的软件名称、版本号以及模块:
操作系统:
Windows2000或WindowsXP
软件:
JDK6.0;
Eclipse
五、知识准备
前期要求掌握的知识:
掌握线性表和接口。
实验相关理论或原理:
泛型是参数化类型的能力。
<
T>
表示形式泛型类型,后面可以用一个实际具体类型代替它。
泛型类型必须是引用类型。
六、验证性实验
1.实验要求
构建两个ArrayList对象list1,list2,往两个对象中各添加两个元素(如输入1,2),并输出。
输出结果如图1.1所示:
图1.1线性表的使用
2.源程序代码参考
import;
publicclassGeneric{
/**
*泛型应用测试
*/
publicGeneric(){
ArrayList<
String>
list1=newArrayList<
**代码1**>
();
ArrayList<
Integer>
list2=newArrayList<
**代码2**>
list1.add(**代码3**);
list1.add("
**代码4**"
);
list2.add(**代码5**);
list2.add(**代码6**);
;
}
//程序入口main方法
publicstaticvoidmain(String[]args){
newGeneric();
}
}
七、设计性实验
请应用泛型编写程序。
首先定义一个接口,它至少包含一个可以计算面积的成员方法。
然后编写实现该接口的两个类:
正方形类和圆类。
接着编写一个有泛型特点的类,要求利用这个类可以在控制台窗口中输出某种图形的面积,而且这个类的类型变量所在控制台窗口中分别输出给定边长的正方形的面积和给定半径的圆的面积。
结果如图1.2所示:
图1.2图形的面积
实验G02:
1.熟悉Set接口,了解何时及如何使用HashSet,LinkedHashSet,orTreeSet来存储元素;
2.熟悉List接口,了解何时及如何使用ArrayListorLinkedList存储元素;
3.区分VectorandArrayList,了解如何使用VectorandStack;
4.使用Collections、Arrays类中的静态方法。
1.创建一个散列集HashSet,一个链式散列集LinkedHashSet,和一个树形集TreeSet,向各集合中添加单词,并打印。
根据结果分析三个集合的不同之处(验证性内容)。
2.编写一程序,创建用数字填充的数组线性表ArrayList,将新元素添加到线性表的指定位置,再利用数组线性表创建一个链表,最后用Foreach语法遍历该链表(验证性内容)。
3.设计一个程序,用来统计字符串“haveagoodday,haveagoodclass,haveagoodvisit,havefun!
”中的每个单词出现的次数,并按照单词的升序输出(建议使用HashMap和TreeMap)(设计性内容)。
4.某中学有若干学生(学生对象放在一个List中),每个学生有一个姓名属性、班级名称属性(String)和考试成绩属性(int),某次考试结束后,每个学生都获得了一个考试成绩。
请打印出每个班级的总分和平均分(设计性内容)。
掌握集合架构支持的三种结构。
一个集合就是一个存储一组对象的容器,一般将这些对象称为集合的元素。
Java集合构架支持三种类型的集合:
规则集set、线性表list和图map,他们分别定义在接口Set、List和Map中。
HashSet类可以用来存储互不相同的任何元素。
链式散列集LinkedHashSet使用链表实现了对HashSet类的扩展,支持规则集内元素的排序。
SortedSet是Set的子接口,它保证规则集中的元素是有序的。
为了允许在一个集合中存储重复的元素,可以使用线性表。
线性表不仅支持重复的存储,而且支持用户指定它们的存储位置。
Map接口建立元素和键值的一个映射关系,键值就像下标。
在List中,下标是整数,在Map中,键值可以是任意类型的对象。
一个图中不能有重复的键值,每个键值对应一个值。
实现Map接口的具体类:
散列图HashMap、链式散列图LinkedHashMap、树形图TreeMap。
验证性实验1
创建一个散列集HashSet,一个链式散列集LinkedHashSet,和一个树形集TreeSet,向各集合中添加单词,并打印。
根据结果分析三个集合的不同之处。
输出结果如图2.1所示:
图2.1集合应用
2.源程序代码参考
/******Set集合********/
publicclassSetTest{
*集合测试
publicSetTest(){
Set<
set1=newHashSet<
set2=newLinkedHashSet<
set1.add("
Hangzhou"
Xiaoshan"
Jiaxing"
Ningbo"
set2.add("
TreeSet<
treeset=newTreeSet<
(set1);
for(Objectelement:
set1){
"
"
set2){
treeset){
//程序入口main方法
newSetTest();
验证性实验2
编写一程序,创建用数字填充的数组线性表ArrayList,将新元素添加到线性表的指定位置,再利用数组线性表创建一个链表,最后用Foreach语法遍历该链表。
输出结果如图2.2所示:
图2.2线性表
2.程序参考代码
/*********List集合*************/
importjava.util.*;
publicclassListTest{
*List测试
privateArrayList<
arraylist;
privateLinkedList<
Object>
linkedlist;
publicListTest(){
arraylist=newArrayList<
arraylist.add
(1);
arraylist.add
(2);
arraylist.add(3);
arraylist.add(4);
arraylist.add(5);
arraylist.set(2,9);
linkedlist=newLinkedList<
(/*****代码1*****/);
linkedlist.add(3,"
Zhejaing"
"
displaythearraylis:
"
for(Objectt:
arraylist){
displaythelinkedlist:
/***********代码段2(foreach遍历)****************/
newListTest();
1.实验要求
(1)设计一个程序,用来统计字符串“haveagoodday,haveagoodclass,haveagoodvisit,havefun!
”中的每个单词出现的次数,并按照单词的升序输出。
(建议使用HashMap和TreeMap)
输出结果如图图2.3所示:
图2.3
(2)某中学有若干学生(学生对象放在一个List中),每个学生有一个姓名属性、班级名称属性(String)和考试成绩属性(int),某次考试结束后,每个学生都获得了一个考试成绩。
请打印出每个班级的总分和平均分。
八、思考题:
第一个验证性实验中,用HashSet对象创建TreeSet和用无参构造方法来创建一个TreeSet实例有什么区别?
哪个效率更高?
为什么?
注意:
更新一个Set集合时,如果不需要保持元素的顺序关系,应该使用散列集,因为在散列集插入和删除元素的时间较少;
需要保持元素中的元素排序时,可以把他们转化成树形集。
实验G03:
多线程设计
1.理解线程概念;
了解线程的状态和生命周期;
2.学习继承Thread类来创建线程;
3.理解线程互斥与同步的含义;
掌握Synchrnized同步方法。
1.设计一个包含多线程运行的程序,在主程序中依次创建3个线程,然后按顺序启动这3个线程,每个线程在执行时都是先睡眠(sleep)一会儿,醒来之后再继续执行(验证性实验)。
2.用程序模拟铁路火车票售票系统,实现通过3个售票窗口同时发售某次列车的100张车票。
程序中会有3个线程同时对同一个车票对象进行操作,每个线程的操作都按相同的步骤进行,即将当前车票数加1,然后将当前车票数与剩余车票数显示出来。
由于车票数是临界资源,一次只能有一个线程完成读写操作,因此必须处理好线程之间的互斥关系(设计性实验)。
Ecliplse
了解Java程序的运行流程。
多线程是指一个程序中可以包含两个或两个以上同时并发运行的程序单元,每个程序单元称之为一个线程。
Java为多线程编程提供了语言级的支持,因此可以编写高效率的程序。
一个线程从它被创建到运行结束的过程,称为线程的生命周期。
在Java中使用多线程有如下两种方式:
一是继承Thread线程类,第二是实现Runnable接口。
在Thread类中有两个主要的方法,一个是run()方法,另一个是start()方法,在Thread类的派生类中要覆盖这个run()方法,将多线程代码放入其中。
Start()方法的作用是启动一个线程,它会自动地去调用run()方法以执行该线程。
为了使多个线程互斥地使用临界资源,可以在临界资源上使用synchrnized修饰符。
编译、运行ThreeThreads.java程序,运行结果如图3.1所示。
图3.1验证性实验运行结果
2.源程序代码参考
classMyThreadextendsThread{
publicMyThread(Stringname){
super(name);
publicvoidrun(){
//让线程进入休眠状态,休眠指定的时间
intsleeptime=100;
try{
+"
将休眠"
+sleeptime+"
毫秒"
Thread.sleep(sleeptime);
}catch(InterruptedExceptionex){
ex.printStackTrace();
结束休眠"
publicclassThreeThreads{
MyThreadthread1=newMyThread("
线程1"
MyThreadthread2=newMyThread("
线程2"
MyThreadthread3=newMyThread("
线程3"
thread1.start();
thread2.start();
thread3.start();
编译、运行程序TestSaleTicket.java,结果如图3.2所示。
并将程序中的代码1~代码4补充完整。
图3.2设计性实验运行结果
2.部分源程序代码
//TestSaleTicket.java
classTicket{//车票类
intcurticket;
//当前票数
代码1//总票数
publicTicket(intcurticket,intticketCount){
this.curticket=curticket;
this.ticketCount=ticketCount;
classSaleTicketimplementsRunnable{//售票类
privateTicketticket;
publicSaleTicket(Ticketticket){
代码2
while(true){
synchronized(this){
if(ticket.curticket<
ticket.ticketCount){
Thread.sleep(50);
ticket.curticket++;
正在销售第"
+ticket.curticket+"
张票,剩余票数:
+(ticket.ticketCount-ticket.curticket));
}else{
代码3//退出循环
publicclassTestSaleTicket{//测试类
Tickett=newTicket(0,100);
SaleTicketst=newSaleTicket(t);
Threadwin1=newThread(st,"
售票窗口1"
Threadwin2=newThread(st,"
售票窗口2"
代码4//实例化线程对象win3
win1.start();
win2.start();
win3.start();
实验G04:
✓验证综合设计
1、了解Java语言基于流式的套接字Socket的运行机制;
了解客户机/服务器模式在网络中的应用;
2、熟练掌握J包中的ServerSocket类与Socket类的使用方法。
编制一个类似QQ的即时聊天程序,该程序使用面向连接的Socket通信机制。
TCP/IP套接字通信是一种面向连接的通信方式,即通信双方在数据交换之前一定要建立稳定可靠的连接。
编写这类网络通信程序通常要涉及到服务器端和客户端。
J包中专门提供了ServerSocket类和Socket类来建立和维持服务器端和客户端之间的通信。
TCPSocket通信的大致过程如下:
服务器端:
(1)在指定的端口上创建ServerSocket对象;
(2)调用ServerSocket对象的accept()方法监听网络连接;
(3)accept()方法返回一个有效连接socket;
(4)创建该socket的输入输出流对象;
(5)调用输入输出流对象上的方法进行通信;
(6)通信结束关闭socket对象。
客户端:
(1)按照指定的主机名和端口号创建socket连接;
(2)创建该socket的输入输出流对象;
(3)调用输入输出流对象上的方法进行通信;
(4)通信结束关闭socket对象。
编制一个类似QQ的即时聊天程序,该程序使用面向连接的Socket通信机制。
整个程序分成服务器端和客户端两部分,通信双方能够互相发送文字进行简单的聊天,最后双方都可以输入quit结束对话。
程序运行效果如图4.1和图4.2所示。
图4.2服务器端聊天程序图4.2客户端聊天程序
该实验要求两人为一组,一人运行服务器端程序,另一人运行客户端程序。
(1)服务器端代码:
//NetworkServer.java
importjava.io.*;
import.*;
publicclassNetworkServer{
publicstaticvoidmain(Stringargs[])throwsIOException
{ServerSocketsersoc=null;
Socketfsoc=null;
BufferedReaderfin=null;
BufferedReaderfsin=null;
PrintWriterfout=null;
InetAddressc