搜索
您的当前位置:首页正文

《Java程序设计实用教程(第4版)习题解答与实验指导》第1-8章

来源:哗拓教育


Java程序设计实用教程

(第4版)

习题解答与实验指导

叶核亚 编着

2013年11月

目录

“Java程序设计”课程教学要求 ························ 1 第1章 Java概述 ······························ 3 第2章 Java语言基础 ···························· 5 第3章 类的封装、继承和多态 ························ 22 第4章 接口、内部类和 Java API基础 ····················· 38 第5章 异常处理 ······························ 43 第6章 图形用户界面 ···························· 45 第7章 多线程 ······························· 50 第8章 输入/输出流和文件操作 ························ 52

“Java程序设计”课程教学要求

1. 课程性质、目的和任务

程序设计是高等学校计算机学科及电子信息学科各专业本科的核心专业基础课程,是培养学生软件设计能力的重要课程。在计算机学科的本科教学中,起着非常重要的作用。

“Java程序设计”是计算机科学与技术专业本科的专业基础限选课,开设本课程的目的是:进行程序设计和面向对象方法的基础训练;使用Java编程技术,设计解决操作系统、网络通信、数据库等多种实际问题的应用程序。

本课程通过全面、系统地介绍Java语言的基础知识、运行机制、多种编程方法和技术,使学生理解和掌握面向对象的程序设计方法,理解和掌握网络程序的特点和设计方法,建立起牢固扎实的理论基础,培养综合应用程序的设计能力。

本课程的先修课程包括:C/C++程序设计I、C/C++程序设计II、数据结构、操作系统、计算机网络、数据库原理等。

2. 教学基本要求 本课程的基本要求如下。

① 了解Java语言特点,理解Java Application应用程序的运行原理和方法。掌握在JDK环境中编译和运行程序的操作,熟悉在MyEclipse集成开发环境中,编辑、编译、运行和调试程序的操作。

② 掌握Java语言中语句、数组、引用类型等基本语法成分的使用方法,通过类、接口、内嵌类型、包、异常处理等机制表达和实现面向对象程序设计思想。

③ 掌握Java的多种实用技术,包括图形用户界面、多线程、文件操作和流、使用URL和Socket进行网络通信等。

④ 熟悉Java JDBC数据库应用的设计方法。

⑤ 熟悉基于JSP的Web应用设计方法。

重点:面向对象概念,图形用户界面,线程,流与文件操作,Socket通信。 难点:继承和多态,线程同步,流与文件操作,Socket通信,JDBC,JSP。 3. 学时分配

本课程学时为64学时,其中讲课48学时,实验16学时。学时分配见下表。

章节(或内容) Java概述 Java语言基础 类的封装、继承和多态 接口、内部类和Java API基础 异常处理 图形用户界面 多线程 输入/输出流和文件操作 网络通信 数据库应用 Web应用 综合应用设计 合 计 讲课 2 4 6 4 2 6 4 6 6 2 4 2 48 16 实验 2 2 2 2 2 2 2 2 合计 2 4 8 6 2 8 6 8 8 4 6 2 64 4. 实验教学目标与基本要求

“Java程序设计”是理论与实践相结合的课程,不仅要求学生掌握基础知识,理解基本原理,更要在实践环节中培养软件设计的基本技能。实践性环节是巩固所学理论知识、积累程序设计经验的必不可少的重要环节,是提高程序设计能力和计算机操作技能的有力保障。实验和课程设计等都是加强程序设计训练所必需的实践环节。

课程实验要求是,熟练使用一种Java开发环境(如MyEclipse),掌握编译、运行和调试Java程序的操作,针对不同情况进行软件测试,完善程序并提高程序性能。

实验类型有验证和设计两种。验证型实验的要求是,仿制已有例题,验证面向对象程序

设计的理论和方法,理解基本原理;设计型实验的要求是,应用图形用户界面、线程、Applet、文件操作和流、网络通信、数据库应用等章的知识点,掌握解决这些实际应用问题的软件设计方法,设计具有一定规模、较复杂、较综合并解决实际问题的应用程序,具备独立分析问题、解决问题的能力和综合应用程序的设计能力。

本课程安排的上机实验学时为16时,课内开设的8个实验说明如下。

项 目 实验1 实验2 实验3 实验4 实验5 实验6 实验7 实验8 内 容 Java语言基础和面向对象概念训练 接口和实现接口的类,异常处理 图形用户界面 线程设计,线程互斥与同步 输入/输出流,文件操作 URL、TCP Socket、UDP Socket等网络通信 JDBC数据库应用设计 基于JSP的Web应用设计 实验时数 2 2 2 2 2 2 2 2 实验题有详细的实验训练目标、设计内容和设计要求。每次实验要求学生独立完成至少一个程序的编写和运行,写出实验报告。实验报告内容包括:题目、题意解释、题意分析、设计方案、流程描述、源程序清单、程序运行结果、程序存在问题和改进意见等。

1章 Java概述

本章教学内容及要求如下:

① 了解Java语言特点,理解Java Application应用程序的运行原理和方法,理解由Java虚拟机支持的程序运行机制。

② 掌握在JDK环境中编译和运行程序的操作,熟悉在MyEclipse集成开发环境中编辑、编译、运行和调试程序的操作。

重点:掌握在JDK和MyEclipse环境中编译和运行Java Application应用程序的操作。

1.1 了解Java

1-1 Java具有哪些适合在Internet环境中运行的特点

【答】跨平台特性、完全面向对象和简单性、可靠性、安全性、多线程、支持分布式网络应用等。

1-2 什么是跨平台特性Java怎样实现跨平台特性

【答】跨平台特性是指一个应用程序能够运行于不同的操作系统平台。Java采用虚拟机技术支持跨平台特性,不同的操作系统上运行不同版本的Java虚拟机。

1-3 Java源程序文件编译后生成什么文件程序的运行机制是怎样的

【答】Java将源程序文件(*.java)中的每个类编译生成一个字节码文件(.class),由Java虚拟机解释执行字节码文件。

1-4 Java应用程序有哪两种形式它们的运行方式有什么不同 【答】Java应用程序有两种:Application和Applet。

Application是能够独立运行的应用程序,有控制台和图形用户界面两种运行方式。 Applet是可以嵌入Web页面的最小应用,它不能独立运行,必须嵌入超文本(*.html)

中,由浏览器中的Java解释器解释执行。

1.2 JDK

1-5 环境变量path和classpath的作用分别是什么

【答】path提供可执行文件(.exe)的路径;classpath提供类文件(.class)的路径。1-6 什么是包为什么需要包机制

【答】包(package)是类的集合。包是Java区别类名字空间的机制。一个包中的多个类之间不能重名,不同包中的类名则可以相同。

【习1.1】 为例的Line类增加以下方法:

public double length() ava)中,可以使用package语句声明包,使用import语句导入包,之后使用class或interface声明多个类或接口。其中,声明为public权限的类或接口只能有一个,且文件名必须与该类名相同。

1-7 程序中的错误有哪几种分别在什么时刻被发现

【答】语法错、语义错、逻辑错。编译时能够发现语法错,运行时能够发现语义错,运行时不能发现逻辑错。

2章 Java语言基础

本章教学内容及要求如下:

① 掌握Java语言的基本语法成分,包括标识符与关键字、数据类型、运算符、表达式、变量声明等语言成分,掌握分支、循环等流程控制语句的语法和使用。特别注意与C/C++的不同之处。

② 掌握数组类型的声明和动态内存申请,掌握以基本数据类型和类的两种方式声明和使用字符串。

③ 掌握Java语言的方法声明和调用规则,掌握基本类型和引用类型作为方法参数和返回值的传递规则。

④ 掌握MyEclipse程序调试技术。

重点:数组的引用模型;使用静态方法,引用类型作为方法的参数和返回值。 难点:位运算,二进制;递归算法。MyEclipse程序调试技术。

2.1 语言成分

1. 数据类型、变量及运算

2-1 Java语言的基本数据类型有哪些引用数据类型有哪些

【答】基本数据类型有:整数类型byte、short、int、long,浮点数类型float、double,字符类型char,布尔类型boolean;引用数据类型包括数组(array)、类(class)和接口(interface)。

2-2 与C++语言相比,Java语言的变量和常量声明有什么差别

【答】Java语言没有全局变量,(成员)局部变量含义及变量声明格式与C++相同。 Java语言没有宏替换,使用最终变量概念代替C++中的常量和宏替换。使用final关键

字声明最终变量,只能赋值一次,这样既增加了常量功能,又避免全局变量和宏替换的副作用。

2-3 Java语言的运算分哪些类型与C++语言相比,运算符及运算含义有哪些变化 【答】Java语言有算术运算、关系运算、位运算、逻辑运算、赋值运算、强制类型转换、条件运算、括号运算、点运算、new、+字符串连接运算和instanceof运算等,其中+字符串连接和instanceof运算符是Java新增的,此外,放弃了C++的sizeof运算符。

与C++语言相比,Java语言的语法更为严谨,将C++中某些容易引起混淆的语法做了修订,编译时也将严格进行检查。在Java语言中,运算符及运算含义有变化的说明如下。

① 没有赋值功能的表达式不能作为语句。例如:

int i=0;

i+1;

1f … 1817 … 10f … 87 … 0Integer.MAX_VALUE0111 11111111 11111111 11111111 1111十进制21474836471-2147483648十六进制0x7fffffff10x80000000

+10000 00000000 00000000 00000000 0001Integer.MIN_VALUE1000 00000000 00000000 00000000 00000000 00000000 00000000 00000111 1101125&0000 00000000 00000000 00000000 10100000 00000000 00000000 00000000 1000(a)125&101080000 00000000 00000000 00000111 1101125|0000 00000000 00000000 00000000 101010/ 0

0000 00000000 00000000 00000111 1111127(b)125 | 101 2 3 4 5 6 7 8 9 : ; < = > @

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \\ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~

② 修改上述程序段的for语句表达式如下,输出Unicode汉字字符表。

for

a(char

000abch='\一';

00000(b)int b[]; b=a; //引用赋值abch<='\龥';

990000(c)b[0]=99;ch++)

00(a) int a[]=new int[5];

数组第一维matmat[0]…mat[i]……mat[mat.length-1]016101315…271114j3812…49mat[0][mat.length-1]5mat[i][mat[i].length-1]0i =01左上三角下标和为0~n-12313410125911j268121537131416下标和为4下标和为5. args) 度]变换类型

下标和为6右下三角下标和为n~2*n-2〈变换类型〉取值有:b(boolean)、c(字符)、C(字母大写)、d(十进制整数)、o(八进制整数)、x(十六进制整数)、e(浮点数指数形式)、f(浮点数小数形式)、s(字符串字母小写)、S(字符串字母大写)。参数索引指定第几个参数,省略时为默认次序。当指定宽度不足时,以实际宽度显示;可用变量指定宽度。例如:

(\"%4d\.+10=55”

(\"%x\

实数+数字.数字E+e-数字-0177)

实数整数.数字Ee整数 , k=('E');

. args)方法返回format指定格式的字符串,\"%o\"、\"%x\"分别指定八进制、十六进制整

数格式。

② 类声明以下方法,分别返回整数的二、八、十六进制形式字符串。

表2-1 public

static

String

toBinaryString(int

i)

ij12ij12xyij12xy(a)main()方法中实际参数i、j引用对象(b)swap()方法中形式参数x、y获得实际参数i、j引用的对象(c)交换形式参数x、y引用的对象,没有改变实际参数i、j引用的对象实部2虚部21f … 1817 … 10f … 87 … 0int1111 11110000 00000000 00001111 1111

Red GreenBlue ; 2-4 获得当前日期和时间的语句是________________________________。 【答】new Date() 或 () 或 ()

2-5 获得当前日期月份的语句是____________________。 【答】 ().get+1

【习2.1】 判断指定字符串是否为Java关键字。

以下程序将Java所有关键字排序后保存在keywords字符串数组中,判断一个字符串是否是Java关键字,算法需要在keywords数组中查找,若查找成功,则是Java关键字。以下采用二分法查找算法,其查找效率比顺序查找算法效率高。

import

123a

tart();

【答】执行Thread类声明的run()方法,该方法体为空,所以没有操作结果。 2-6 设有T、R类声明如下,说明怎样使用这些实例创建、启动线程并执行有效操作

public class T extends Thread

tart();

2. 线程对象的生命周期

2-7 Thread类中有哪些方法能够改变线程对象的状态各由什么状态改变到什么状态 【答】Thread类中改变和判断线程状态的方法有:线程启动、线程睡眠、线程中断等。线程启动start()方法将NEW新建态的线程改变成运行态RUNNABLE;线程睡眠sleep()方法 将当前线程由运行态进入等待态;线程中断interrupt()方法对当前线程设置运行中断标记。

2.2 线程的同步机制

2-8 什么是交互线程什么是线程互斥与同步说明线程互斥与同步机制怎样保证交互线程对共享变量操作的正确性,不产生与时间有关的错误。

【答】共享变量的多个线程之间称为交互线程,它们执行时将因竞争共享变量的使用权而影响其他线程的运行结果,可能产生与时间有关的错误。

交互线程之间存在竞争和协作两种关系。

线程互斥指,采用加锁方式使若干交互线程串行地使用同一共享资源,它是解决线程间竞争关系的手段。

线程同步指,两个以上线程基于某个条件来协调它们的活动。一个线程的执行依赖于另一个协作线程的信号,当一个线程没有得到来自于另一个线程的信号时则需等待,直到信号到达才被唤醒。线程同步是解决线程间协作关系的手段。

实验7 线程设计

增加实验题如下。 2-9 交通信号灯。

设计一个表示四叉路口控制交通信号灯的图形用户界面,交通信号灯的属性包括方向(东西、南北)、颜色(红、黄、绿)、车道(左转、直行、右转)、显示时间(秒)等。

4个方向的信号灯同时运行,其中东西向、南北向的信号相同。以两位数显示倒计时的 秒数,超过百秒以A、B、C等代替,如A2表示102;经过指定延时时间,切换信号灯状态。

3章 输入/输出流和文件操作

本章教学内容及要求如下:

① 理解流的概念,理解流在文件操作中的作用;掌握通过Java各种字节流类和字符流类对类型文件和文本文件进行顺序处理和随机处理;熟悉在对象之间通过流传递数据的方法;了解Java的标准输入/输出方法。

② 掌握文件操作的基本方法,掌握对文件操作的File类,熟悉文件过滤器、文件对话框;了解RandomAccessFile随机存取文件类。

重点:各种字节流类,字符流类,File类。

难点:① 如何选择使用哪种字节流或字符流,掌握程序设计方法,而不是死记硬背。 ② 操作系统的文件组织方式是树结构,递归算法。

3.1 文件和流的概念

3-1 什么是流流有什么作用面向对象程序设计语言为什么需要使用流哪些场合需要使用流

【答】流指数据传输。在面向过程的程序设计语言中,只有标准输入/输出和文件读写操作中存在数据传输,而标准输入/输出是文件操作和特例。

在面向对象程序设计语言中,数据传输的应用范围更广,除了标准输入/输出和文件操作,在内存的对象之间、以及不同计算机运行的线程之间都需要进行数据传输。数据传输功能必须脱离于文件操作,相对独立。因此,面向对象程序设计语言使用“流”概念实现数据传输功能,将各种类型数据传输封装成各种流类,根据数据特性,应用程序选择采用相应流类传输数据。

3-2 Java提供了哪些流类各种流类之间关系是怎样的什么场合需要使用什么流类

【答】Java提供了字节流类和字符流类,InputStream和OutputStream是字节输入/出流的根类,它们所有字节流约定读/写字节、读/写字节数组、关闭等操作方法,子类有文件字节流、数据字节流、对象字节流和管道字节流等;Reader和Writer是字符输入/出流的根类,它们为字符流约定读/写字符、读/写字符数组、关闭等操作方法,子类有文件字符流、缓冲字符流、管道流字符等。当在标准输入/出、读/写文件及内存变量之间传递数据时,需要使用流。

3-3 Java语言中,流与文件操作有什么关系 【答】Java提供文件流实现读/写文件数据操作。

3.2 字节输入/输出流类

1. 文件字节流

3-4 为什么InputStream的read()方法能够以-1表示字节流结束是否与整数-1相冲突

【答】(int)-1的二进制形式为111111,调用(-1),实际上只写入低位1个字节,再调用()读取1字节,作为int整数最低1字节,高位补0,得到的值是255(000000000000000000000000),不是整数-1。因此,InputStream的read()方法能够以-1表示字节流结束。

【习3.1】 使用字节流比较两个文件内容是否相同。

以下equals()方法比较两个文件内容是否相同,算法有什么错误如何改正

public static boolean equals(String filename1, String filename2) { try

{ FileInputStream fin1 = new FileInputStream(filename1); FileInputStream fin2 = new FileInputStream(filename2); int i1=0, i2=0;

while ((i1=())!=-1 && (i2=())!=-1 && i1==i2);

(); ();

return i1==-1 && i2==-1; }

catch

数据字节输出流写入'a'(0x0061)(FileNotFoundException e)

(short)98(0x0062)字节流0000 00000110 00010000 00000110 0010数据字节输入流读取2字节,short值为97;char值为'a'2字节,short值为98;char值为'b' lose() lose()方

法,则ReceiveCardJFrame的()方法捕获到IOException异常,循环结束。

3.3 字符输入/输出流类

1. 字符流

3-5 什么是字符流它与字节流有哪些区别

【答】字符流本质上是字节流,以字符为单位读/写字节流,各字符编码及长度由字符集确定。

3-6 如何判断各种输入流什么时候结束

【答】根据不同的输入流,判断输入流结束的条件不同。主要有两种方式,一是通过返回值,二是抛出异常。

① InputStream类的read()和read(byte[])方法都声明返回int如下:

public

System.in(GBK)'a'(0x61)'b'(0x62)'c'(0x63)'d'(0x64)'汉'(0x6c49)'字'(0x5b57)'\\r'(0x0d)'\\n'(0x0a) 4字节,int值为6357090(0x00610062)abstract

int

read() throws IOException;

字节流0110 00010110 00100110 00110110 01001011 10101011 10100110 00110110 01000000 11010000 1010 char(Unicode字符)'慢'(\慢)'捤'(\捤)'?'(\몺)'?'(\ퟖ) '?'(\ഊ)

System.in(GBK)'1'(0x31)'2'(0x32)'3'(0x33)' '(0x20)'4'(0x34)'5'(0x35)'6'(0x36)'\\r'(0x0d)'\\n'(0x0a)字节流0011 00010011 00100011 00110010 00000011 10000011 10010011 10100000 11010000 1010;

int825373472(0x31323320) 875902477(0x3435360d) public class DirFilter implements FileFilter //目录文件过滤器 {

public boolean accept(File file) //实现过滤操作,是否接受file文件对象保留在文件列表中

{

return (); } }

修改addList()方法如下:

files = (new DirFilter()); for (int i=0; i<; i++)

addList(files[i], filter); 对象,递归调用

//返回dir目录下的子目录列表 //继续添加各子目录文件列表中的文件对象

//添加files[i]子目录文件列表中的文件

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

Top