资源描述
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概述
2
2
Java语言基础
4
4
类的封装、继承和多态
6
2
8
接口、内部类和Java API基础
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
合 计
48
16
64
4. 实验教学目标与基本要求
“Java程序设计”是理论与实践相结合的课程,不仅要求学生掌握基础知识,理解基本原理,更要在实践环节中培养软件设计的基本技能。实践性环节是巩固所学理论知识、积累程序设计经验的必不可少的重要环节,是提高程序设计能力和计算机操作技能的有力保障。实验和课程设计等都是加强程序设计训练所必需的实践环节。
课程实验要求是,熟练使用一种Java开发环境(如MyEclipse),掌握编译、运行和调试Java程序的操作,针对不同情况进行软件测试,完善程序并提高程序性能。
实验类型有验证和设计两种。验证型实验的要求是,仿制已有例题,验证面向对象程序设计的理论和方法,理解基本原理;设计型实验的要求是,应用图形用户界面、线程、Applet、文件操作和流、网络通信、数据库应用等章的知识点,掌握解决这些实际应用问题的软件设计方法,设计具有一定规模、较复杂、较综合并解决实际问题的应用程序,具备独立分析问题、解决问题的能力和综合应用程序的设计能力。
本课程安排的上机实验学时为16时,课内开设的8个实验说明如下。
项 目
内 容
实验时数
实验1
Java语言基础和面向对象概念训练
2
实验2
接口和实现接口的类,异常处理
2
实验3
图形用户界面
2
实验4
线程设计,线程互斥与同步
2
实验5
输入/输出流,文件操作
2
实验6
URL、TCP Socket、UDP Socket等网络通信
2
实验7
JDBC数据库应用设计
2
实验8
基于JSP的Web应用设计
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.3】 为例1.2的Line类增加以下方法:
public double length() //返回直线长度
{
int a=start.x-end.x, b=start.y-end.y;
return Math.sqrt(a*a+b*b); //Math.sqrt(x)返回x的平方根
}
1-7 Java对源程序文件中的声明语句及文件其命名规则有什么要求?
【答】在一个Java源程序文件(*.java)中,可以使用package语句声明包,使用import语句导入包,之后使用class或interface声明多个类或接口。其中,声明为public权限的类或接口只能有一个,且文件名必须与该类名相同。
1-8 程序中的错误有哪几种?分别在什么时刻被发现?
【答】语法错、语义错、逻辑错。编译时能够发现语法错,运行时能够发现语义错,运行时不能发现逻辑错。
第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; //编译错“无效的赋值运算”
② 逗号是分隔符,仅用于分隔表达式,不是运算符,不能出现在表达式中。例如:
for (int i=0, j=0; i<n && j<n; i++, j++) //正确,逗号是分隔符
int x=0, y=0; //正确,逗号是分隔符
System.out.println(""+(x=1,y=2)); //编译错,表达式不能包含逗号
x=1, y=2; //编译错,逗号仅用于分隔表达式,不是运算符
x=1;y=2; //正确
③ Java语言增加boolean类型用于逻辑运算,其值不是0或1。例如:
boolean b=0; //编译错“不能将int类型转换成boolean类型”
关系运算、逻辑运算和instanceof运算的结果都是boolean类型。整数不能进行逻辑运算。
Java语言严格区分boolean与int类型,运算类型不能混淆。boolean类型与整数类型或其他类型不能进行算术运算、关系运算、逻辑运算。例如:
boolean b=false +0; //编译错“boolean类型与int类型不能进行+运算”
if、while等语句中的条件表达式不能是赋值运算,否则产生编译错。
if (i=0) //编译错,i=0运算结果是int类型,而不是boolean
while (i=0) //编译错
④ 字符串连接运算符(+)自动将其他类型变量值转换成字符串类型。
2. 整数运算的数据类型及数据溢出
2-4 表达式(byte)127+(byte)127的运算结果是__________,其数据类型是__________。
【答】254,int
〖解释〗Java的整数默认是int类型,byte类型只是形式上的,取相应int值的最低1个字节。所有byte和short整数运算仍然是int类型运算,运算结果是int类型,当运算结果在byte数据范围内时,也可视作byte类型。
2-5 已知Integer.MAX_VALUE值为2147483647,表达式Integer.MAX_VALUE+1的运算结果是__________________。
【答】-2147483648,即0x80000000
〖解释〗Integer.MAX_VALUE值为0x7fffffff,0x7fffffff+1=0x80000000,数据溢出。运算过程如图2.1所示。
图2.3 int整数数据溢出
2-6 设int min=Integer.MIN_VALUE;,表达式min+min的运算结果是______________。
【答】0
〖解释〗Integer.MIN_VALUE值为0x80000000,0x80000000+0x80000000=0,数据溢出。
2-7 设int min=Integer.MIN_VALUE;,表达式(long)(min+min)的运算结果是________。
【答】0
〖解释〗Integer.MIN_VALUE值为0x80000000,0x80000000+0x80000000=0,数据溢出。强制类型转换,只是把0强制转换成long类型。
2-8 设int min=Integer.MIN_VALUE;,表达式(long)min+(long)min的运算结果是____。
【答】0xffffffff 00000000,或-4294967296。
〖解释〗Integer.MIN_VALUE值为0x80000000,先强制转换成long类型,值为0xffffffff80000000,再作为long类型运算,数据不溢出。
2-9 设int min=Integer.MIN_VALUE; long g=min+min;,则g的值是________。
【答】0
〖解释〗min+min作为int类型运算,数据溢出。
2-10 设int min=Integer.MIN_VALUE; long g=min; g+=min;,则g的值是________。
【答】0xffffffff 00000000,或-4294967296。
〖解释〗long g=min; 赋值将min自动扩容到long类型,再运算,long数据不溢出。
3. 整数位运算
2-11 表达式125&10的值是___________,表达式125 | 10的值是____________。
【答】8,127
〖解释〗int整数二进制位运算,运算过程如图2.2所示。
图2.5 int整数二进制位运算
4. 浮点数运算
2-12 设double x,将x按四舍五入方式强制转换成int类型的表达式的是__________。
【答】(int)(x+0.5)
5. 字符类型及运算
2-13 Java语言的char字符类型与C/C++语言相比有什么差别?
【答】两者字符常量表示形式相同,都是用单引号将字符括起来作为字符常量。
不同之处如下:
① C/C++语言的char类型表示ASCII字符,包括数字、字母、符号等,字长为1字节,取值范围为0~127;一个汉字用2字节表示。
② Java语言的char类型表示Unicode字符,包括ASCII字符和汉字等,一个ASCII字符和汉字均占用2字节,取值范围为\u0000~\uFFFF(即0~65535)。
2-14 表达式'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'。
2-15 设char ch1=108, ch2=73;,以下语句有什么错误?如何改正?
ch1=ch1+ch2;
【答】编译错,不能将int转换成char。改正如下:
ch1=(char)(ch1+ch2);
〖解释〗与byte和short类型存储和运算原理相同,char也是以int存储和运算的,在0~65535范围内的整数可看成一个Unicode字符的编码,因此能够以字符显示。两个char作为数值参加算术运算时,仍然是int类型运算,运算结果是int类型。所以,不能赋值给char变量。
2.2 流程控制语句
2-16 Java语言的语句与C/C++语言有什么差别?
【答】Java语言语句的语法同C/C++语言,Java语言不支持goto语句。
【习2.7】 理解Java的字符类型。
① 以下程序段输出ASCII码可打印字符表。
System.out.println("ASCII码可打印字符(\\u0021~\\u007e)表");
for (char ch='\u0021'; ch<='\u007e'; ch++) //输出ASCII码可打印字符表
{ System.out.print(ch+" ");
if (ch%32==0)
System.out.println();
}
程序运行结果如下:
ASCII码可打印字符(\u0021~\u007e)表
! " # $ % & ' ( ) * + , - . / 0 1 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 (char ch='\u4e00'; ch<='\u9fa5'; ch++) //Unicode汉字字符表'一'~'龥'
③ Unicode字符的取值范围是0~65535(\u0000~\uffff),反之,并不是0~65535之中每个值都对应一个字符,标准输出语句输出没有对应字符的编码时,输出结果是问号“?”。例如,128没有对应字符,以下欲输出编码为128的字符,输出结果是问号。
System.out.println((char)128); //输出“?”
2-17 指出下列程序段中的错误以及出错原因。
int s=0;
for (int i=0; i<10; i++)
s+=i;
i++;
【答】最后一句产生编译错。变量i的作用域在for语句中,在for语句之外则不能使用。
2.3 数组
1. 一维数组
2-18 与C/C++的数组相比,Java的数组做了哪些改进?具有怎样的优越性?
【答】① Java数组都是动态数组,在声明数组变量之后,使用new运算符申请数组存储空间。
② 提供length属性表示数组长度。
③ Java的数组是引用数据类型,两个数组变量之间的赋值是引用赋值,传递地址等引用特性,没有申请新的存储空间。
④ Java将严格检查数组元素下标范围,程序运行时,如果a[i]的下标i取值超出0~a.length-1范围,则作为错误处理,产生“数组下标越界”异常,程序运行终止。
⑤ 数组名不作指针使用。
2-19 以下数组声明错误的是__________________。
(A)int[] a; (B)int a[3]; (C)int a[]={1,2,3}; (D)int a[]=new int[3];
【答】B
〖解释〗Java数组是动态数组,声明数组变量时不需要接线指定数组长度,只有使用new运算符申请数组存储空间时才需要指定数组长度。
2-20 设int a[]=new int[5], b[]=a; 执行语句b[0]=99;后,a中各元素值为____________。
【答】{99,0,0,0,0}
〖解释〗Java的数组是引用数据类型,两个数组变量之间的赋值是引用赋值,即两个数组变量引用同一个数组,修改其中某一元素将同时改变另一数组变量的相应元素,如图2.3所示。
图2.11 数组的引用模型
2. 二维数组
2-21 画出下列程序段表示mat存储结构示意图,并写出其中数据。
int n=5, k=1;
int mat [][]=new int [n][];
for (int i=0; i<n; i++)
{ mat[i]=new int [n-i];
for (int j=0; j<n-i; j++)
mat[i][j] = k++;
}
【答】上三角形二维数组存储结构及初值如图2.4所示。
图2.13 上三角形二维数组的存储结构
2.4 静态方法
2-22 Java类中的方法与C/C++中的函数有什么差别?
【答】① Java类中的方法都是类的成员方法,没有C/C++中的全局函数。
② Java类的成员方法中,不能用*或&声明参数,方法体中不能用static声明局部变量。
2-23 Java方法的参数能够作为输出型参数吗?
【答】Java方法的参数传递原则与赋值原则相同,根据参数类型不同分二种情况:
① 基本数据类型参数是输入型参数,形式参数只能接收实际参数赋值,形式参数改变后值不能作用于实际参数,可以声明返回值向实际参数传递运算结果值。
② 引用数据类型参数是输出型参数,形式参数接收实际参数的引用赋值,即形式参数和实际参数引用同一个引用类型数据(数组或对象),任何通过形式参数对引用数据的更改都将作用于实际参数。
【习2.11】 下标和相等的数字方阵。
输出下列下标和相等的数字方阵(当n=4时)。
1 2 6 7 1 2 5 10
3 5 8 13 4 3 6 11
4 9 12 14 9 8 7 12
10 11 15 16 16 15 14 13
本题目的:二维数组作为方法的参数或返回值。
【答】二维数组中,每一条斜线上各元素的下标和相等,算法描述如图2.5所示。
图2.15 下标和相等的数字方阵算法描述
方法声明如下,实现省略。
public class Upmat
{
//输出下标和相等的数字方阵,n指定阶数,up指定方向,返回二维数组
public static int[][] upmat(int n, boolean up)
public static int[][] upmat(int n) //默认方向向上。方法重载
public static void print(int mat[][]) //输出二维数组,二维数组作为参数
}
2.5 字符串
1. 字符串概念
2-24 Java的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类重载了赋值和连接运算。例如:
String str = "abc"; //字符串变量能够赋值为字符串常量
str = "abc" + "xyz"; //“+”将两个字符串首尾相接连起来,结果为"abcxyz"
str += "xyz"; //+=定义为字符串变量在原串基础上连接另一个字符串
"i=" + 10 //Java自动将其他类型值转换为字符串,结果为"i=10"
④ Java的字符串对象不是字符数组,所以,不能以数组下标格式str[i]对指定位置的字符进行操作。例如,以下语句有语法错:
str[1]='a'; //语法错误,没有str[1]表示方式
⑤ C/C++语言采用字符数组表示字符串,以str[i]形式对字符串str的第i个字符进行存取操作,并在库文件string.h中提供诸如strlen()、strcpy()、strcmp()、strcat()等函数实现字符串操作。这种表示方式是不健壮、不安全的,它没有对数组所使用的存储空间进行控制,也没有对数组下标进行越界检查,会产生更改字符串结束符"\0"等错误,strcpy(char *str1, char *str2)函数甚至可以将一个长字符串复制到一个短字符串的字符数组中,字符数组使用超出其预定范围的存储空间,非法占用本不属于它的存储空间,导致随意更改其他变量值等严重错误,strcat(char *str1, char *str2)函数存在同样问题。
2-25 怎样将数值类型的数据转换成字符串?
【答】将数值与空串进行字符串连接运算,例如:
int i=123;
String s = i+""; //字符串连接运算,运算结果类型为String
2-26 设char ch=97;,表达式"\"(char)"+(ch+0)+"='"+ch+"'\""的运算结果是__________。
【答】"(char)97='a'"
〖解释〗char ch=97,即char ch='a';。
ch+0进行的是算术运算,操作数的数据类型相容,结果取较长的数据类型,因此,当char ch=97时,ch+0结果为int类型的97。其后表达式各项进行字符串连接运算,得到结果。
Java不支持程序员对运算符重载功能。但Java自己将“+”运算符重载为字符串连接运算,并且自动将其他类型转换成String。
重载是多态的一种形式,以下两个表达式都是“+”运算,根据操作数类型的不同,能够区别所进行的不同运算:
ch+0 //整数加法运算,运算结果类型为int
ch+"" //字符串连接运算,运算结果类型为String
2-27 能否以s[i]格式读写Java String字符串中的字符?为什么?
【答】Java的字符串不是字符数组。Java没有提供s[i]格式表示字符串中指定字符。原因分析:如果Java重载[]运算符提供s[i]格式,则s[i]格式表示可读写,即可通过以下两种方式对字符串中指定字符进行读取和赋值操作,例如:
String s="abc";
char ch=s[0]; //读取串中指定元素值
s[0]='x'; //写,对串中指定元素赋值
而String类是常量字符串,只能读不能写字符。因此,String类提供charAt(i)方法读取第i个字符,功能同读取s[i],而没有提供写字符方法,java.lang.StringBuffer类有setCharAt(i,ch)方法设置第i个字符为ch。
通过声明方法对对象属性进行读写操作,符合类的封装概念,详见教材第3章封装概念。
2-28 怎样比较两个字符?怎样比较两个字符串?有几种比较字符串的方法?
【答】char字符是基本数据类型,可以使用==和!=运算符比较是否相等,也可使用>、>=、<、<=运算符比较大小。
String字符串是类,提供equals(obj)方法判断是否相等,返回boolean类型。提供compareTo(cobj)比较大小,返回int类型,当返回0时,表示两者相等;当返回正数时,表示当前对象大;当返回负数时,表示当前对象小,说明详见教材第4章Comparable接口。
2-29 怎样将数值按指定格式转换成字符串?
【答】String声明如下静态方法format()返回指定格式的字符串:
public static String format(String format, Object... args) //返回format指定格式的字符串
其中,格式字符串format定义为:
%[参数索引$][宽度][.精度]变换类型
〈变换类型〉取值有:b(boolean)、c(字符)、C(字母大写)、d(十进制整数)、o(八进制整数)、x(十六进制整数)、e(浮点数指数形式)、f(浮点数小数形式)、s(字符串字母小写)、S(字符串字母大写)。参数索引指定第几个参数,省略时为默认次序。当指定宽度不足时,以实际宽度显示;可用变量指定宽度。例如:
String.format("%4d",1) //结果为“ 1”。宽度为4位,不足时,前补空格
String.format("%04d",1) //结果为“0001”。宽度不足4位时,前补0
String.format("%+4d",Integer.MIN_VALUE) //结果为“-2147483648”。+表示总显示正负号
//当指定宽度不足时,以实际宽度显示
String.format("%,d",Integer.MAX_VALUE) //结果为“2,147,483,647”。以,逗号作千位分隔
String.format("Sum=1+...+%2$d=%1$d",55,10) //结果为“Sum=1+...+10=55”
String.format("%x", 0177) //八进制整数0177的十六进制形式为“7f”
String.format("%o", 0x80000000) //十六进制整数0x80000000的八进制形式“20000000000”
String.format("%8x", 127) //十进制整数127的十六进制形式为“ 7f”
String.format("%08x", 255) //十进制整数255的十六进制形式为“000000ff”
String.format("%08x", -1) //十进制整数-1的十六进制形式为“ffffffff”
String.format("%+08x", -1) //运行错,抛出异常,十六进制不支持正负号
String.format("%9.2f", 1234.56789) //结果为“ 1234.57”。以9位宽度2位小数表示浮点数
String.format("%e", 1234.56789) //结果为“1.234568e+03”,浮点数科学记数法格式
int n=10;
String.format("%"+n+"c", ' ') //返回长度为n的空格字符串。用变量指定宽度
2. 标准输入
2-30 程序运行时有哪几种方式能够输入数据?怎样获得输入数据?输入数据是什么类型?怎样获得输入数值数据?
【答】输入数据方式有多种:命令行参数、标准输入和图形用户界面等。
① 命令行参数
JDK和MyEclipse均提供命令行参数输入方式,操作命令详见教材第1章。
程序通过main(String args[])方法的args参数获得命令行参数输入的以空格分隔的多个字符串,见教材第1章例1.1。
② 标准输入
使用标准输入常量System.in调用InputStream字节输入流类的read()方法获得从键盘输入的数据,要处理异常。异常和流的基本概念详见教材第5、9章,例见教材例2.10和以下习2.7。
③ 图形用户界面
从图形用户界面的文本行等编辑组件中可获得输入数据,详见教材第6章。
上述三种方式输入的数据都是String类型。如果要输入数值数据,就先输入字符串,再将字符串转换成数值。
3. 将数值字符串转换成相应数值
2-31 怎样将数值字符串转换成其所表示的整数或浮点数数值?
【答】 调用java.lang.Integer类的以下静态方法parseInt(s)将字符串s转换成十进制整数。
public static int parseInt(String s) throws NumberFormatException
调用java.lang.Double类的以下静态方法parseDouble(s)将字符串s转换成浮点数值。
public static double parseDouble(String s) throws NumberFormatException
如果字符串不能转换成整数或浮点数,将抛出数值格式异常。详见教材第4~5章。
【习2.15】 获得实数字符串表示的浮点数值。
本例实现java.lang.Double类中parseDouble(s)方法,从实数字符串获得其表示的浮点数值。给出两种算法。
① 由数字序列和运算符
展开阅读全文