2010年05月自学考试04747《Java语言程序设计(一)》复习资料
发布时间:2019-08-14第1章 java语言基础
本章内容(一般掌握3%~5%)
本章重点:应用程序和小应用程序的基础知识,程序的开发过程,基本数据类型。 本章难点:程序的开发过程,了解一种Java程序的开发环境。
1.1 Java 语言特点
Java 语言最初的应用对象是消费性电子产品(即PDA 、电子游戏机、电视机顶盒之类的产品)。为了进入消费性电子产品市场,SUN公司专门成立了一个项目开发小组,目标是设计嵌在消费性电子产品的小型分布式系统软件,能够适用于异构网络、多主机体系结构,能实现信息安全传递。项目小组的最初设想是用C++语言完成这个目标。由于C++语言的复杂性和不安全性,不能胜任这项工作。为此,项目小组开发一个取名为Oak的语言。 Oak语言在消费性电子产品市场上没有获得青睐。但在当时,Internet开始流行,人们发明了一种网络传输协议,这种协议可以在文本中插入图片和声音,能使单调的Internet世界变得图文并茂。虽然Web页面拥用图文和声音,但仍然是静态的,不具备交互性。要让页面拥有动态画面,并能交互,需要在Web页面中嵌入一会段程序。由于在Internet上运行的数以千计不同类的计算机,这就要求编写这种程序的语言必须具有平台无关性,并要求语言必须简练,支撑环境要小,而安全性却很高。Oak语言恰好能够满足这些要求。
将Oak 语言正式应用于Internet还需要进一步完善,还要求有一个支持它的Web浏览器。能用于编写浏览器,并获得浏览器扶持的新版本Oak语言取名Java。Internet得到Java语言的支持,可以实现真正的交互,人们使用浏览器能“漫游”丰富多彩的Internet世界。
Java语言是适用于分布式计算环境的面向对象编程语言,它虽类似C和C++,但比C++简单,忽略了许多为提高计算效率,初学者较难掌握的程序语言特性。
Java语言主要有以下特点:
1. 强类型
Java语言是一种强类型语言,强类型能约束程序员必须遵守更多的编程规定,也能让编译器检测出程序中尽可能多的错误。
2. 编译和解释
Java语言是一种高级编程语言,用Java语言编写的源程序在计算机上运行需经过编译和解释执行两个严格区分的阶段。Java语言的编译程序先将Java源程序翻译成机器无关的字节码(bytecode),不是通常的编译程序将源程序翻译成计算机的机器代码。运行时,Java的运行系统和链接需要执行的类,并作必要的优化后,解释执行字节码程序。
3. 自动无用内存回收功能
Java语言具有自动无用内存回收功能,程序可以按需使用内存,但不需要对无用内存显式地撤销分配。系统有一个垃圾收集器(garbage collector),自动收集程序不再使用的内存。这样,能避免显式的撤销分配所引起的安全问题。Java语言不再含有任何不安全的语言成分。例如,没有指针,数组元素都要检查下标是否越界。
4. 面向对象
面向对象是程序员编写大型程序、有效控制程序复杂性的重要手段。Java语言在面向对象方面,比C++更“纯”,它的所有数据类型,包括布尔类型、整形、字符型等,都有相应的类,程序可完全基于对象编写。
面向对象语言主要有封装性、继承性和多态性三个特点。封装就是将实现细节隐藏起来,只给出如何使用的信息。数据及数据上的操作用类封装,对象是类的实例,外界使用对象中的数据及可用的操作受到一定的限制。继承体现众多的一种层次对象的特性,下一层的类可从上一层的类继承定义,从上一层类派生的类的对象能继承上一层对象的特性,同时可以改变和扩充一些特性,以适应其自身的特点。多态性的意义主要体现在逻辑上相同的不同层次上的操作,使用相同的操作名,根据具体对象,能自动选择对应的操作。Java语言很实用地实现了这三种特性。 5. 与平台无关
与平台无关是对程序可移植性最直接最有效的支持。Java语言的设计者在设计时重点考虑了Java程序的可移植性,采用多种机制来保证可移植性,其中最主要的是定义了一种虚拟机(virtual machine),以及虚拟机使用的java字节码。在任何平台上,Java源程序被Java编译器编译成虚拟机能够识别的字节码。这样,只要有Java虚拟机的
型,在任何平台上,同上种数据类型是一致的。例如,用int标识32位二进制位(bit)整型数据,那么无论在哪一台计算机上,Java的int数据都是32位整数。相反,C语言会随着硬软件平台的改变,用int标识的整数位数也可能不全相同。
Java语言提高可移植性的代价是降低程序的执行效率。出于java语言也是一种解释执行的语言,Java程序的执行速度与C程序的执行速度有较大的差别。不过,为了尽量弥补执行效率低的缺陷,java的字节码在设计上非常接近现代计算机的机器码,这有助于提高解释执行的速度。 6. 安全性
Java是在网络环境中使用的编程语言,必须考虑安全性问题,主要有以下两个方面:
设计的安全防范:Java语言没有指针,避免程序因为指针使用不当,访问不应该访问的内存空间;提供数组元素上标检测机制,禁止程序越界访问内存;提供内存自动回收机制,避免程序遗漏或重复释放内存。
运行安全检查:为了防止字节码程序可能被非法改动,解释执行前,先对字节码程序作检查,防止网络“黑客”对字节码程序已作了恶意改动,达到破坏系统的目的。最后,浏览器限制下载的小应用程序不允许访问本地文件,避免小应用程序破坏本地文件。 7. 分布式计算
Java语言支持客户机/服务器计算模式。Java程序能利用URL对象,能访问网络上的对象,如同访问本地的文件一样,实现数据分布。另外,Java的客户机/服务器模式也可以把计算从服务器分散到客户机端,实现操作分布。 8. 多线程
线程是比进程更小的一种可并发执行的单位,每个进程都有自己独立的内存空间和其他资源,当进程切换时需要进行数据和资源的保护与恢复。若干协同工作的线程可以共享内存空间和资源,线程切换不需要数据的保护与恢复。
Java的运行环境采用多线程实现,可以利用系统的空闲时间执行诸如内存回收等操作;Java语言提供语言级多线程支持,用Java语言能直接编写多线程程序。
1.2 Java应用程序和小应用程序
Java程序可以是独立的应用程序和能在浏览器上执行的小应用程序(Applet)。两种Java程序都由一个或多个扩展名为“.class”的文件组成。都需要java虚拟机(JVM)载入并翻译。这两种程序的主要区别是:小应用程序只能在与Java兼容的容器中运行,可以嵌入在HTML网页内,在网络上发布,当网页被浏览时,在浏览器中运行。小应程序的运行还要受到严格的安全限制,例如,它不能访问用计算机上的文件。Java应用程序没有这些限制,也不支持网页嵌入和下载运行。 小应用程序和应用程序在代码编写上也有很大差异。一个小应用程序必须定义成一个Applet类的子类,应用程序可以是Applet类的子类,也可以不是。应用程序必须在一个类中定义一个main()方法,该方法代表应用程序的入口。而小应用程序不必定义main()方法,它的执行由Applet类中定义的多个方法控制。 [例 1.1] 一个非常简单的应用程序。
public class Example1_1{//这是我的第一个应用程序 public static void main(String []args){ System.Out.println(“你好!欢迎你学习Java语言。”);
} }
上述java程序的执行将输出以下字样: 你好!欢迎你学习Java语言。
一个应用程序由若干个类组成,上面这个应用程序只有一个类,类的名字是Example1_1。public是java语言的关键字,表示声明的类Example1_1是公用的。class也是关键字,用来声明类。最外层的一对花括号以及括号内的内容叫做类体。public static void main(String []args)是类Example1_1的一个方法。一个应用程序必须只有一个类含有main()方法,这个类是应用程序的主类。public static void 是对main()方法的说明。应用程序的main()方法必须被说明成public static void。表示main()方法的访问权限是公有的,它是一个类方法,没有结果返回,参见第3章。String []args或String args[],声明main()方法的参数是一个字符串数组,参见第4章。
Java源程序命名受严格的限制。Java源文件的扩展名必须是“.java”如果源文件中有多个类,那么只能有一个public类;如果源文件中有public类,那么源文件的名字必须与这个类的名字完全相同。例如,例1.1应用程序的源
[例1.2]一个简单的小应用程序,用一同颜色显示两行文字: 欢迎你学习Java语言。
只要认真学习,多上机实习,一定能学好Java语言。 import java.applet.*; import java.awt.*;
public class Example1_2 extends Applet{ public void paint(Graphics g){ g.setColor(Color.blue);//设置显示的颜色为blue g.drawString(“欢迎你学Java语言”,30,20); g.setColor(Color.red);//设置显示的颜色为red g.drawString(“只要认真学习,多上机实习,一定能学好Java语言。”,30,50); } }
一个小应用程序也出若干个类组成,其中必须有一个类,它继承系统提供的Applet类,这个类是小应用程序的主类。主类必须是public的,源文件名必须与小应用程序的主类名相同。上述程序的源文件名必须是Example1_2.java。小应用程序的结构参见3.5节。
在结束这一节之前,先讨论一下程序中经常出现的注释。注释是程序中的说明文字,用于帮助阅读程序,它不是语句,不会影响程序的执行效率。Java语言的注释有三种形式:
行注释 // 变量r是贺的半径
块注释 /* 以下程序段是采用冒泡排序对数组元素实现从小到大排序 */ 文档注释 /* *类Student是学生类*/
行注释用于简短地说明前面代码的意义或功能。注释内容至行末结束,不能跨行。 例如:
int fontsize =30 ;//标题字体大小
块注释是多行注释,用于说明下面程序段的算法、功能等,块注释不可嵌套使用。 文档注释能被实用程序javadoc接受,它能自动生成程序的HTML文档。
1.3 Java程序的开发过程
Java程序的开发过程如图1.1所示。对于Java应用程序,先编写Java源程序,源程序经Java编译器编译后产生码文件,最后由Java解释器解释执行字节码文件。对于小应用程序,先编写源程序,然后经Java编译器编译后,产生字节码文件,最后由Web浏览器解释执行字节码文件。
以下以使用SUN公司提供的Java JDK(java Developer’s Kit)为例,并假设Java JDK 安装在d:\java目录下,则在该目录下还应包含以下几个文件和子目录:
(1) 子目录 d:\java\bin,这个子目录是Java JDK的核心,其中最主要的可执行文件有:
1) javac---编译器 2) java---解释器 3) jdb---调试器
4) appletviewer---java Applet解释器
(2) 子目录d:\java\lib,这个子目录存储的是函数库。
编写源程序时,使用一个文字编辑器,输入源程序文件,并保存。键入编译命令,使用Java编译器编译Java源程序。键入解释命令,通过解释器解释执行Java应用程序的字节码文件。对于小应用程序需通过支持Java的浏览器解释执行字节码文件。 设输入前面所述Java程序,源文件名为Example1_1.java,保存在D:\java目录下。 Java编译器的使用格式是: javac [选项] 源文件
例如,可用以下命令编译以上输入的Java应用程序: javac d:\java\Example1_1.java
编译时,可能编译器指定选项,java JDK 编译器的选项参见表1-1。
选项
-classpath<路径> -d<目录> -g -ng -nowarn -o -verbose
引用类的路径表
说明
编译后类文件存放的目录 生成调试信息表 不生成调试信息表 关闭编译器警告功能 优化类文件
显示编译过程中的详细信息
Java解释器java.exe用来解释执行Java类文件,解释器的使用格式为: java [选项]类名[参数]
其中,类名指定的类必须是main()方法的,即是一个Java应用程序。
对于使用开发环境情况来说,编辑源程序、编译、执行和调试直接使用环境提供的工具,使开发程序变得非常简单。例如,使用Eclipse开发环境。在eclipse环境下开发Java程序的方法请参见附录F。
1.4 标识符和关键字
如同别的程序语言一样,Java语言也有基本符号,由基本符号按一定的构词规则构成标识符等基本词汇,再由基本词汇和关键字按语言的句法构成Java程序。 1. 字符集
Java语言使用Unicode字符集,共有65535个字符,包括: (1) 数字符 10个(0~9)。
(2) 英文字母大、小写字符各26个(A~Z和a~z)。 (3) 下划线字符,美元符号。
(4) 文字字符,(汉字,日文片假名、平假名和朝鲜文字等)。 (5) 其他用于构成特殊符号的字符集。
2. 标识符
标识符用于命名程序对象。例如,类名、变量名、方法名等。Java语言的标识符可以按以下规则任意命名: (1) 由字母(包括英文字母、下划线字符、美元字符、文字字符)和数字字符组成。 (2) 限定标识符的第一个字符不能是数字符。
例如,下列4个字符串都可以个为标识符: Boy_$、$63Girl、颜色、小伙子 而以下4个字符不能作为标识符: 46A、%Val、c+2、Hello!
前两是因为首字符不合理,后两个含有不允许在标识符中出现的字符。 除了按上述规则命名的习惯约定:
一般变量名、方法名用小写英文字母开头;文字和常数用大写字母命名;类名首字母用大写字母;包名全部用小写字母。命名习惯是一种公共约定,Java语言的语法并没有这种限制,但是培养良好的编程习惯有利于程序维护和协作开发。
3. 关键字
为了表示程序结构、定义和修饰等,Java语言引入一组关键字,参见附录A。关键字是上些英文单词,在语言中,关键字已经被赋予特定的意义,不能用这些关键字作为标识符命名程序对象。在Java语言中,关键字的作用有以下多个方面:
描述程序结构、声明类、定义类的成员、简单数据类型、值和变量、异常情况处理、实例(对象)的创建和检验、流程控制等。
Java语言中所有关键字均由小写字母组成。每个关键字在程序中出现有特定位置和使用方法的要求。关键字不可以用做变量、方法、类或标号的标识符(名字)。
1.5 基本数据类型
为基本数据类型和非基本数据类型两大类。
基本数据类型也称为原始数据类型,是系统预先规定的一些常用类型。它们是:整数类型、浮点数(实数)类型、字符(文字)类型、逻辑类型(布尔型)。
非基本数据类型也称为复合数据类型,是由基本类型组合的新类型。非基本数据类型分为:数组、字符串、类、接口。
本小节只介绍基本数据类型,非基本数据类型将在以后章节中分别介绍。 1.5.1 逻辑类型
逻辑类型用关键字boolean标识,所以也称布尔型。逻辑类型只有真和假两个值,true 表示真,false 表示假。以下是逻辑变量定义的例子: boolean b; boolean bool;
boolean flg1,flg2, 美丽;//一次定义多个变量
boolean b1 = true,b2= false,丑=false;//定义时可以赋初值
逻辑变量用于记录某种条件成立与否,也用语句中作条件判断。 1.5.2 字符类型 字符类型用关键字char 标识。字符型数据是一个字符,内部表示是字符的Unicode代码,共用65535个不同的字符。在Java程序中,字符常量有普通字符和转义字符常两种。
用单引号括住一个字符,表示一个普通字符常量。例如,’a’、’B’、’$’、’国’。 对于被语言用作特定意义的字符,或者不能显式显示的字符,需用转义字符标记它们。
例如,换行符用\n标记,水平制表符用\t标记。常用的转义字符的标记方法见表1-2。其中,\nnn是用八进制代码表示的字符,\unnnn是用十六进制代码表示的字符。例如:\141表示字母a,\u0061也表示字母a.以下是字符变量定义的例子:
char ch; char ch1,ch2,漂亮;
char ch3 = ‘A’,ch4 = ‘家’,丑=’假’;//定义时可以赋给初值 表1-2转义字符及其含义 转义符 \b \n \r \t \v \f \\ \’ \” \nnn \unnnn
含义
退格(Backspace键)
换行符,光标位置移到下一行首 回车符,光标位置移到当前行首 水平制表符(Tab键) 竖向退格符 走纸换页 反斜杠符\ 单引号符’ 双引号符”
n为8进制数字,用八进制数据表示字符的代码 n为16进制数字,用16进制数据表示字符的代码
1.5.3 整数类型 整数是不带小数点和指数的数值数据。由于计算机只能表示整数的一个子集,表达更大范围内的整数需要更多的二进制位,Java语言将整型数据按数值范围大水不同分成四种:
3131
(1) 基本型:用int标识。4个字节,32位,取值范围是-2~2-1,即-2147483648~2147483647。
77
(2) 字节型:用byte标识。1个字节,8位,取值范围是-2~2-1,即-128~127。
1616
(3) 短整型:用short标识。2个字节,16位,取值范围是-2~2-1,即-23768~32767
6464
(4) 长整型:用long标识。8个字节,64位,取值范围是-2~2-1,即-923372036854775808L~923372036854775807L
每种整数类型处理不同范围的整数值,并且都是带符号的。
整型常量有十进制、八进制和十六进制三种写法。如下 面的示例所示:
0开头),0x3ABC(十六进制,以 0x开头,后随数字符和英文A到或5333l(以字母L或l结尾是长整数)。
long z,sum;int w =12,len =-1230;long big = 9876L;//定义同时可以赋初值。 1.5.4 浮点数类型 浮点数类型也称实型,浮点数是带小数点或指数的数值数据。 Java语言的浮点数有单精度和双精度两种。
1. 单精度型
3838
单精度型 用float标识,占4个字节,32位,取值-10~10。float之后加上字母F或f.例如:23.54f,12389.987F。 2. 双精度型
308308
double型常是的书写的方法有两种:双精度型 用double标识,占8个字节,64位,取值-10~10。
一种是直接写一个实数,或在实数后面加上字母D或d.例如:123.5439、123.5439D, 是科学计数法,用10的方幂表示(用字符e或E表示幂底10)。例如:123.24e40(科学计数法表示,值为123.24乘10的40次方)。
以下是浮点数类型变量定义的例子: float x,y;
double v=12.86,u=2431098.987D; float u=12.36f;
浮点数类型与整数不同,当执行运算时如果出现某种不正常的状态,浮点数类型不会抛出异常。例如,如果用0除浮点数类型的变量,则计算结果是一个特别的无限值。
习题
1. 指出Java语言的主要特点和Java程序的执行过程。
答:主要特点:
(1)强类型,(2) 编译和解释,(3) 自动无用内存回收功能,(4) 面向对象, (5) 与平台无关,(6)安全性,(7)分布式计算,(8)多线程。 Java程序的执行过程:是解释执行。 1.javac [选项] 源文件==编译
2.java [选项] 类名[参数] ==执行
2. 说出开发与运行Java程序的主要步骤。
3. 如何区分应用程序和小应用程序?
4. 说出Java源文件的命名规则。
5. 选择一种上机环境,参照实例,编写一个输出“hello world!”字样的Java程序。
6. Java语言使用什么字符集?共有多少个不同的字符?
7. Java语言标识符的命名规则是什么、
8. Java有哪些基本数据类型,它们的常量又是如何书写的?
9. 指出下列内容哪些是Java语言的整型常,哪些是浮点数类型常量,哪些两者都不是。 1)E-4, 2)A423 ,
3)-1E-31,4)0xABCL,5).32E31,6)087,7)0xL,8)003,9)0x12.5,10)077,11)11E,12)056L,13)0.,14).0
第2章 运算和语句
本章主要内容(次重点 10%) ¾ 数据运算 ¾ 语句
¾ Java程序实例
本章重点:算术运算、自增和自减运算、关系运算和逻辑,Java语句以及java程序实例。
本章难点:自增和自减运算、位运算和移位运算,while语句、do…while语句、for语句和Java程序实例。
2.1 数据运算
运算分量可以是常量、变量和方法调用。Java 在高级语言中,运算由表达式表示。表达式由运算符和运算分量组成,
语言的基本运算可分成以下几类:赋值运算,算术运算,自增和自减运算,关系运算,逻辑运算,条件运算和字符串连接运算等。
2.1.1 赋值运算 在Java语言中,符号“=”是赋值运算符,不是“相等”(相等运算符是“==”,见关系运算符的叙述)。赋值运算分为两类:一是简单赋值运算;二是复合赋值运算。
1. 简单赋值运算
简单赋值运算的一般形式如下: 变量 = 表达式
赋值运算的执行过程是:
(1) 计算赋值运算符的右端的表达式。
(2) 当赋值运算符两侧不一致时,将表达式值的类型自动转换成变量的类型。 (3) 将表达式的值赋值给变量,即存储到与变量对应的存储单元中。 完成一个赋值运算的表达式称为赋值表达式,赋值表达式是先计算表达式的值,然后将表达式的值赋值给变量。 例如,表达式x=x+1,表示完成表达式x+1的计算,将计算结果赋值给变量x。 这里的类型转换是指数值数据的类型自动转换,这样的自动转换只能由简单类型向复杂类型转换,不能从复杂的转换成简单的。即如下所示的从左到右转换: byte->short->int->long->float->double
例如,以下代码说明int类型能自动转换成double类型: int j=3; double y=2.0; y=j;//j的值为3,y的值为3.0
以下则是不正确的代码,double 类型不能自动转换成int类型。 j=y;
Java语言约定赋值运算也有值,它的值就是赋予变量的值,因此,赋值运算的结果可以继续赋值。例如: int j; double y=2.0;
3,,y的值为,当连续有多上赋值运算时,是从右至左逐个赋值。 2. 复合赋值运算
在程序中,经常遇到在变量现在值的基础上作某种修正的运算。例如 x=x+5
这类运算的特点是:变量既要参与运算,又要接受赋值。为避免对同一个变量的地址重复计算,引入复合赋值运算符。常用的复合赋值运算符有: +=、-=、*=、/=、%= 例如: x+=5;//等价于x=x+5 x *=u+v;//等价于x=x*(u+v),这里括号不能省略
xθ=e
的等效表达式为 x= xθ(e)
当e是一个复杂表达式时,等效表达式的括号是必需的。
2.1.2算术运算 算术运算要求运算分量的类型是数值类型的(整数类型和浮点数类型)。运算时,只需一个运算分量的是单目运算,需两个运算分量的是双目运算。算术运算的运算符是: 单目算术运算符:+(取正)、-(取负) 双目算术运算符:+(加)、-(减)、*(乘)、/(除)、%(求余数) 说明:
(1) 加、减、乘、除和求余数运算都是双目运算符,结合性都是从左至右。取正和取负是单目运算符,结合性是从
右至左,其优先级高于+、-、*,%等双目运算符。
(2) “/”为除法运算符,当除数和被除数均为整数类型数据时,则结果也是整数类型数据。例如7/4的结果为1。 (3) “%”为求余数运算符,求余数运算所得结果的符号与被除的符号相同。例如:5%3的结果为2,-5%3
的结果为-2,5%-3的结果为2。
用算术运算符、运算分量和括号连接起来,符合Java语言语法规则的计算式,称为算术表达式。例如,如果变量x和y已经被正确声明,并且已经赋予初值,则以下的式子就是一个正确的算术表达式:
X*2+y*(x-5)
2.1.3 自增和自减运算
自增运算符“++”和自减运算符“--”是单目运算符,要求运算分量是数值类型的变量。其作用是变量的值增1或减1。这两个运算符与变量结合有以下四种可能形式:
++i前缀形式,表示在引用变量i之前,先使i加1,以加1后的i值为运算结果。 --i前缀形式, 表示在引用变量i之前, 先使i减1,以减1后的i值为运算结果。 i++后缀形式,表示在收用变量i之后,才使i加1,即以增1前的i值为运算结果。 i--后缀形式,表示在引用变量i之后,才使i减1,即以减1前的i值为运算结果。 例如:
i=4;j=++i;//i结果为5,j的结果为5 i=4;j=i++;//i结果为5,j的结果为4 i=4;j=--i;//i结果为3,j的结果为3 i=4;j=i--;//i结果为3,j的结果为4
上述例子说明,对变量采用自增或自减,用前缀形式或用后缀形式,对变量本身来说,效果是相同的,但表达式的值不相同。前缀形式是变量运算之后的新值,后缀形式是变量运算之前的值。
自增自减运算能使程序更为简洁和高效,但在使用时需注意“++”和“