《Java程序设计实用教程第4版习题解答和实验指导》第18章.docx
《《Java程序设计实用教程第4版习题解答和实验指导》第18章.docx》由会员分享,可在线阅读,更多相关《《Java程序设计实用教程第4版习题解答和实验指导》第18章.docx(93页珍藏版)》请在冰豆网上搜索。
《Java程序设计实用教程第4版习题解答和实验指导》第18章
Java程序设计实用教程
(第4版)
习题解答与实验指导
叶核亚编著
2013年11月
“Java程序设计”课程教学要求
1.课程性质、目的和任务
程序设计是高等学校计算机学科及电子信息学科各专业本科的核心专业基础课程,是培养学生软件设计能力的重要课程。
在计算机学科的本科教学中,起着非常重要的作用。
“Java程序设计”是计算机科学与技术专业本科的专业基础限选课,开设本课程的目的是:
进行程序设计和面向对象方法的基础训练;使用Java编程技术,设计解决操作系统、网络通信、数据库等多种实际问题的应用程序。
本课程通过全面、系统地介绍Java语言的基础知识、运行机制、多种编程方法和技术,使学生理解和掌握面向对象的程序设计方法,理解和掌握网络程序的特点和设计方法,建立起牢固扎实的理论基础,培养综合应用程序的设计能力。
本课程的先修课程包括:
C/C++程序设计I、C/C++程序设计II、数据结构、操作系统、计算机网络、数据库原理等。
2.教学基本要求
本课程的基本要求如下。
①了解Java语言特点,理解JavaApplication应用程序的运行原理和方法。
掌握在JDK环境中编译和运行程序的操作,熟悉在MyEclipse集成开发环境中,编辑、编译、运行和调试程序的操作。
②掌握Java语言中语句、数组、引用类型等基本语法成分的使用方法,通过类、接口、内嵌类型、包、异常处理等机制表达和实现面向对象程序设计思想。
③掌握Java的多种实用技术,包括图形用户界面、多线程、文件操作和流、使用URL和Socket进行网络通信等。
④熟悉JavaJDBC数据库应用的设计方法。
⑤熟悉基于JSP的Web应用设计方法。
重点:
面向对象概念,图形用户界面,线程,流与文件操作,Socket通信。
难点:
继承和多态,线程同步,流与文件操作,Socket通信,JDBC,JSP。
3.学时分配
本课程学时为64学时,其中讲课48学时,实验16学时。
学时分配见下表。
章节(或内容)
讲课
实验
合计
Java概述
2
2
Java语言基础
4
4
类的封装、继承和多态
6
2
8
接口、内部类和JavaAPI基础
4
2
6
异常处理
2
2
图形用户界面
6
2
8
多线程
4
2
6
输入/输出流和文件操作
6
2
8
网络通信
6
2
8
数据库应用
2
2
4
Web应用
4
2
6
综合应用设计
2
2
合计
4.实验教学目标与基本要求
“Java程序设计”是理论与实践相结合的课程,不仅要求学生掌握基础知识,理解基本原理,更要在实践环节中培养软件设计的基本技能。
实践性环节是巩固所学理论知识、积累程序设计经验的必不可少的重要环节,是提高程序设计能力和计算机操作技能的有力保障。
实验和课程设计等都是加强程序设计训练所必需的实践环节。
课程实验要求是,熟练使用一种Java开发环境(如MyEclipse),掌握编译、运行和调试Java程序的操作,针对不同情况进行软件测试,完善程序并提高程序性能。
实验类型有验证和设计两种。
验证型实验的要求是,仿制已有例题,验证面向对象程序设计的理论和方法,理解基本原理;设计型实验的要求是,应用图形用户界面、线程、Applet、文件操作和流、网络通信、数据库应用等章的知识点,掌握解决这些实际应用问题的软件设计方法,设计具有一定规模、较复杂、较综合并解决实际问题的应用程序,具备独立分析问题、解决问题的能力和综合应用程序的设计能力。
本课程安排的上机实验学时为16时,课内开设的8个实验说明如下。
项目
内容
实验时数
实验1
Java语言基础和面向对象概念训练
2
实验2
接口和实现接口的类,异常处理
2
实验3
图形用户界面
2
实验4
线程设计,线程互斥与同步
2
实验5
输入/输出流,文件操作
2
实验6
URL、TCPSocket、UDPSocket等网络通信
2
实验7
JDBC数据库应用设计
2
实验8
基于JSP的Web应用设计
2
实验题有详细的实验训练目标、设计内容和设计要求。
每次实验要求学生独立完成至少一个程序的编写和运行,写出实验报告。
实验报告内容包括:
题目、题意解释、题意分析、设计方案、流程描述、源程序清单、程序运行结果、程序存在问题和改进意见等。
第2章
Java概述
本章教学内容及要求如下:
①了解Java语言特点,理解JavaApplication应用程序的运行原理和方法,理解由Java虚拟机支持的程序运行机制。
②掌握在JDK环境中编译和运行程序的操作,熟悉在MyEclipse集成开发环境中编辑、编译、运行和调试程序的操作。
重点:
掌握在JDK和MyEclipse环境中编译和运行JavaApplication应用程序的操作。
2.1了解Java
2-1Java具有哪些适合在Internet环境中运行的特点?
【答】跨平台特性、完全面向对象和简单性、可靠性、安全性、多线程、支持分布式网络应用等。
2-2什么是跨平台特性?
Java怎样实现跨平台特性?
【答】跨平台特性是指一个应用程序能够运行于不同的操作系统平台。
Java采用虚拟机技术支持跨平台特性,不同的操作系统上运行不同版本的Java虚拟机。
2-3Java源程序文件编译后生成什么文件?
程序的运行机制是怎样的?
【答】Java将源程序文件(*.java)中的每个类编译生成一个字节码文件(.class),由Java虚拟机解释执行字节码文件。
2-4Java应用程序有哪两种形式?
它们的运行方式有什么不同?
【答】Java应用程序有两种:
Application和Applet。
Application是能够独立运行的应用程序,有控制台和图形用户界面两种运行方式。
Applet是可以嵌入Web页面的最小应用,它不能独立运行,必须嵌入超文本(*.html)中,由浏览器中的Java解释器解释执行。
2.2JDK
2-1环境变量path和classpath的作用分别是什么?
【答】path提供可执行文件(.exe)的路径;classpath提供类文件(.class)的路径。
2-2什么是包?
为什么需要包机制?
【答】包(package)是类的集合。
包是Java区别类名字空间的机制。
一个包中的多个类之间不能重名,不同包中的类名则可以相同。
【习2.2】为例1.2的Line类增加以下方法:
publicdoublelength()//返回直线长度
{
inta=start.x-end.x,b=start.y-end.y;
returnMath.sqrt(a*a+b*b);//Math.sqrt(x)返回x的平方根
}
2-1Java对源程序文件中的声明语句及文件其命名规则有什么要求?
【答】在一个Java源程序文件(*.java)中,可以使用package语句声明包,使用import语句导入包,之后使用class或interface声明多个类或接口。
其中,声明为public权限的类或接口只能有一个,且文件名必须与该类名相同。
2-2程序中的错误有哪几种?
分别在什么时刻被发现?
【答】语法错、语义错、逻辑错。
编译时能够发现语法错,运行时能够发现语义错,运行时不能发现逻辑错。
第3章Java语言基础
本章教学内容及要求如下:
①掌握Java语言的基本语法成分,包括标识符与关键字、数据类型、运算符、表达式、变量声明等语言成分,掌握分支、循环等流程控制语句的语法和使用。
特别注意与C/C++的不同之处。
②掌握数组类型的声明和动态内存申请,掌握以基本数据类型和类的两种方式声明和使用字符串。
③掌握Java语言的方法声明和调用规则,掌握基本类型和引用类型作为方法参数和返回值的传递规则。
④掌握MyEclipse程序调试技术。
重点:
数组的引用模型;使用静态方法,引用类型作为方法的参数和返回值。
难点:
位运算,二进制;递归算法。
MyEclipse程序调试技术。
3.1语言成分
1.数据类型、变量及运算
3-1Java语言的基本数据类型有哪些?
引用数据类型有哪些?
【答】基本数据类型有:
整数类型byte、short、int、long,浮点数类型float、double,字符类型char,布尔类型boolean;引用数据类型包括数组(array)、类(class)和接口(interface)。
3-2与C++语言相比,Java语言的变量和常量声明有什么差别?
【答】Java语言没有全局变量,(成员)局部变量含义及变量声明格式与C++相同。
Java语言没有宏替换,使用最终变量概念代替C++中的常量和宏替换。
使用final关键字声明最终变量,只能赋值一次,这样既增加了常量功能,又避免全局变量和宏替换的副作用。
3-3Java语言的运算分哪些类型?
与C++语言相比,运算符及运算含义有哪些变化?
【答】Java语言有算术运算、关系运算、位运算、逻辑运算、赋值运算、强制类型转换、条件运算、括号运算、点运算、new、+字符串连接运算和instanceof运算等,其中+字符串连接和instanceof运算符是Java新增的,此外,放弃了C++的sizeof运算符。
与C++语言相比,Java语言的语法更为严谨,将C++中某些容易引起混淆的语法做了修订,编译时也将严格进行检查。
在Java语言中,运算符及运算含义有变化的说明如下。
①没有赋值功能的表达式不能作为语句。
例如:
inti=0;
i+1;//编译错“无效的赋值运算”
②逗号是分隔符,仅用于分隔表达式,不是运算符,不能出现在表达式中。
例如:
for(inti=0,j=0;iintx=0,y=0;//正确,逗号是分隔符
System.out.println(""+(x=1,y=2));//编译错,表达式不能包含逗号
x=1,y=2;//编译错,逗号仅用于分隔表达式,不是运算符
x=1;y=2;//正确
③Java语言增加boolean类型用于逻辑运算,其值不是0或1。
例如:
booleanb=0;//编译错“不能将int类型转换成boolean类型”
关系运算、逻辑运算和instanceof运算的结果都是boolean类型。
整数不能进行逻辑运算。
Java语言严格区分boolean与int类型,运算类型不能混淆。
boolean类型与整数类型或其他类型不能进行算术运算、关系运算、逻辑运算。
例如:
booleanb=false+0;//编译错“boolean类型与int类型不能进行+运算”
if、while等语句中的条件表达式不能是赋值运算,否则产生编译错。
if(i=0)//编译错,i=0运算结果是int类型,而不是boolean
while(i=0)//编译错
④字符串连接运算符(+)自动将其他类型变量值转换成字符串类型。
2.整数运算的数据类型及数据溢出
3-1表达式(byte)127+(byte)127的运算结果是__________,其数据类型是__________。
【答】254,int
〖解释〗Java的整数默认是int类型,byte类型只是形式上的,取相应int值的最低1个字节。
所有byte和short整数运算仍然是int类型运算,运算结果是int类型,当运算结果在byte数据范围内时,也可视作byte类型。
3-2已知Integer.MAX_VALUE值为2147483647,表达式Integer.MAX_VALUE+1的运算结果是__________________。
【答】-2147483648,即0x80000000
〖解释〗Integer.MAX_VALUE值为0x7fffffff,0x7fffffff+1=0x80000000,数据溢出。
运算过程如图2.1所示。
图3.2int整数数据溢出3-1设intmin=Integer.MIN_VALUE;,表达式min+min的运算结果是______________。
【答】0
〖解释〗Integer.MIN_VALUE值为0x80000000,0x80000000+0x80000000=0,数据溢出。
3-2设intmin=Integer.MIN_VALUE;,表达式(long)(min+min)的运算结果是________。
【答】0
〖解释〗Integer.MIN_VALUE值为0x80000000,0x80000000+0x80000000=0,数据溢出。
强制类型转换,只是把0强制转换成long类型。
3-3设intmin=Integer.MIN_VALUE;,表达式(long)min+(long)min的运算结果是____。
【答】0xffffffff00000000,或-4294967296。
〖解释〗Integer.MIN_VALUE值为0x80000000,先强制转换成long类型,值为0xffffffff80000000,再作为long类型运算,数据不溢出。
3-4设intmin=Integer.MIN_VALUE;longg=min+min;,则g的值是________。
【答】0
〖解释〗min+min作为int类型运算,数据溢出。
3-5设intmin=Integer.MIN_VALUE;longg=min;g+=min;,则g的值是________。
【答】0xffffffff00000000,或-4294967296。
〖解释〗longg=min;赋值将min自动扩容到long类型,再运算,long数据不溢出。
3.整数位运算
3-1表达式125&10的值是___________,表达式125|10的值是____________。
【答】8,127
〖解释〗int整数二进制位运算,运算过程如图2.2所示。
图3.2int整数二进制位运算
4.浮点数运算
3-1设doublex,将x按四舍五入方式强制转换成int类型的表达式的是__________。
【答】(int)(x+0.5)
5.字符类型及运算
3-1Java语言的char字符类型与C/C++语言相比有什么差别?
【答】两者字符常量表示形式相同,都是用单引号将字符括起来作为字符常量。
不同之处如下:
①C/C++语言的char类型表示ASCII字符,包括数字、字母、符号等,字长为1字节,取值范围为0~127;一个汉字用2字节表示。
②Java语言的char类型表示Unicode字符,包括ASCII字符和汉字等,一个ASCII字符和汉字均占用2字节,取值范围为\u0000~\uFFFF(即0~65535)。
3-2表达式'a'+1的运算结果是____________,(char)('a'+1)的运算结果是__________。
【答】98,'b'
〖解释〗char也是数值类型,可将char看成是2字节无符号整数,范围是0~65535。
1是int类型,4字节。
'a'+1进行的是算术运算,操作数的数据类型相容,结果取较长的int数据类型,'a'+1运算含义为将'a'的ASCII码97加1。
(char)('a'+1)将98强制转换成char类型,结果为'b'。
3-3设charch1=108,ch2=73;,以下语句有什么错误?
如何改正?
ch1=ch1+ch2;
【答】编译错,不能将int转换成char。
改正如下:
ch1=(char)(ch1+ch2);
〖解释〗与byte和short类型存储和运算原理相同,char也是以int存储和运算的,在0~65535范围内的整数可看成一个Unicode字符的编码,因此能够以字符显示。
两个char作为数值参加算术运算时,仍然是int类型运算,运算结果是int类型。
所以,不能赋值给char变量。
3.2流程控制语句
3-1Java语言的语句与C/C++语言有什么差别?
【答】Java语言语句的语法同C/C++语言,Java语言不支持goto语句。
【习3.2】理解Java的字符类型。
①以下程序段输出ASCII码可打印字符表。
System.out.println("ASCII码可打印字符(\\u0021~\\u007e)表");
for(charch='\u0021';ch<='\u007e';ch++)//输出ASCII码可打印字符表
{System.out.print(ch+"");
if(ch%32==0)
System.out.println();
}
程序运行结果如下:
ASCII码可打印字符(\u0021~\u007e)表
!
"#$%&'()*+,-./0123456789:
;<=>?
@
ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`
abcdefghijklmnopqrstuvwxyz{|}~
②修改上述程序段的for语句表达式如下,输出Unicode汉字字符表。
for(charch='\u4e00';ch<='\u9fa5';ch++)//Unicode汉字字符表'一'~'龥'
③Unicode字符的取值范围是0~65535(\u0000~\uffff),反之,并不是0~65535之中每个值都对应一个字符,标准输出语句输出没有对应字符的编码时,输出结果是问号“?
”。
例如,128没有对应字符,以下欲输出编码为128的字符,输出结果是问号。
System.out.println((char)128);//输出“?
”
3-1指出下列程序段中的错误以及出错原因。
ints=0;
for(inti=0;i<10;i++)
s+=i;
i++;
【答】最后一句产生编译错。
变量i的作用域在for语句中,在for语句之外则不能使用。
3.3数组
1.一维数组
3-1与C/C++的数组相比,Java的数组做了哪些改进?
具有怎样的优越性?
【答】①Java数组都是动态数组,在声明数组变量之后,使用new运算符申请数组存储空间。
②提供length属性表示数组长度。
③Java的数组是引用数据类型,两个数组变量之间的赋值是引用赋值,传递地址等引用特性,没有申请新的存储空间。
④Java将严格检查数组元素下标范围,程序运行时,如果a[i]的下标i取值超出0~a.length-1范围,则作为错误处理,产生“数组下标越界”异常,程序运行终止。
⑤数组名不作指针使用。
3-2以下数组声明错误的是__________________。
(A)int[]a;(B)inta[3];(C)inta[]={1,2,3};(D)inta[]=newint[3];
【答】B
〖解释〗Java数组是动态数组,声明数组变量时不需要接线指定数组长度,只有使用new运算符申请数组存储空间时才需要指定数组长度。
3-3设inta[]=newint[5],b[]=a;执行语句b[0]=99;后,a中各元素值为____________。
【答】{99,0,0,0,0}
〖解释〗Java的数组是引用数据类型,两个数组变量之间的赋值是引用赋值,即两个数组变量引用同一个数组,修改其中某一元素将同时改变另一数组变量的相应元素,如图2.3所示。
图3.2数组的引用模型
2.二维数组
3-1画出下列程序段表示mat存储结构示意图,并写出其中数据。
intn=5,k=1;
intmat[][]=newint[n][];
for(inti=0;i{mat[i]=newint[n-i];
for(intj=0;jmat[i][j]=k++;
}
【答】上三角形二维数组存储结构及初值如图2.4所示。
图3.2上三角形二维数组的存储结构
3.4静态方法
3-1Java类中的方法与C/C++中的函数有什么差别?
【答】①Java类中的方法都是类的成员方法,没有C/C++中的全局函数。
②Java类的成员方法中,不能用*或&声明参数,方法体中不能用static声明局部变量。
3-2Java方法的参数能够作为输出型参数吗?
【答】Java方法的参数传递原则与赋值原则相同,根据参数类型不同分二种情况:
①基本数据类型参数是输入型参数,形式参数只能接收实际参数赋值,形式参数改变后值不能作用于实际参数,可以声明返回值向实际参数传递运算结果值。
②引用数据类型参数是输出型参数,形式参数接收实际参数的引用赋值,即形式参数和实际参数引用同一个引用类型数据(数组或对象),任何通过形式参数对引用数据的更改都将作用于实际参数。
【习3.2】下标和相等的数字方阵。
输出下列下标和相等的数字方阵(当n=4时)。
126712510
3581343611
49121498712
1011151616151413
本题目的:
二维数组作为方法的参数或返回值。
【答】二维数组中,每一条斜线上各元素的下标和相等,算法描述如图2.5所示。
图3.1下标和相等的数字方阵算法描述
方法声明如下,实现省略。
publicclassUpmat
{
//输出下标和相等的数字方阵,n指定阶数,up指定方向,返回二维数组
publicstaticint[][]upmat(intn,booleanup)
publicstaticint[][]upmat(intn)//默认方向向上。
方法重载
publicstaticvoidprint(intmat[][])//输出二维数组,二维数组作为参数
}
3.5字符串
1.字符串概念
3-1Java的String字符串有哪些特点?
比C/C++的字符数组有哪些优越之处?
【答】①Java的字符串常量表示形式同C/C++,是由双引号括起来的字符序列,其中可包含转义字符,如"hello!
"、"汉字\n"、""(空串)等。
字符串只能在同一行内,不能换行。
②Java的String字符串是一个类,属于引用数据类型。
java.lang.String类提供构造串对象、求串长length()、取字符charAt(i)、求子串substring()、判断相等equals(),比较大小compareTo()等操作。
compareTo()方法说明详见教材第4章Comparable接口,更多方法说明详见教材附录E。
String类表示常量字符串,不提供插入、删除子串操作。
③String与普通类不同的是,具有某些基本数据类型的特性。
Java为String类重载了