第 2章 Java语言概述
第 2章 Java语言概述
2.1 Java语言的优势与特点
2.2 Java语言的基本语法
2.3 流程控制语句
第 2章 Java语言概述
1991年,Sun公司的 James Gosling等人,为在电视
机、烤面包箱等家用消费类电子产品上进行交互式操
作而开发了一个名叫 Oak(一种橡树的名字 )的语言。由
于商业上的种种原因,这种语言始终没有投放到市场
中,而且连 Oak这个名字也成了问题,因为已经有上百
家公司在使用这个名字,所以 Sun公司根本无法将之注
册为商标。最终,Sun公司决定,将这种语言改名为
Java,并且在互联网上发布,免费提供下载。
第 2章 Java语言概述
当时, 由于 Oak的失败, 有一些传谣者鼓吹 Java这
些字母代表 "只是又一个无意义的缩写词 "(Just Another
Valueless Acronym)。 Sun公司否认了这一说法, 而且
说 Java是语言开发者在喝一种原产于印度尼西亚爪哇
群岛的咖啡时, 出于一时的灵感而碰撞出的火花 。
第 2章 Java语言概述
几个月后, 出乎所有人的意料, Java成为赛博空间
最热门的话题 。 Java被越来越多的用户使用, 受到越
来越多的重视 。 上百个 Java小应用程序在互联网上的
多媒体应用中流行起来 。 一些著名的公司, 如微软,
IBM,苹果电脑, 数字设备公司, 纷纷购买了 Java语言
的使用权, 随之大量出现了用 Java编写的软件产品 。
Java受到业界的重视与好评 。 微软总裁比尔 ·盖茨在悄
悄地观察了一段时间后, 也感慨地说,"Java是长时间
以来最卓越的程序设计语言 "。
第 2章 Java语言概述
Java为什么会在短时期内受到如此多的程序员欢迎?
为什么在计算机行业竞争激烈的今天, 一个计算机硬
件公司开发出来的语言, 会一下子得到几乎世界上各
大计算机软, 硬件公司的支持呢?
Java最重要的特征在于它的操作平台无关性, 这是
以往任何一种语言都不具备的特征 。 也就是说, 用
Java语言编写的程序可以在任何一台计算机上运行,
而不管该计算机使用何种操作系统, 要知道, 这可是
广大程序员的一个梦想 。
第 2章 Java语言概述
其次, Java是一种面向对象的语言 。 长期以来, 人
们一直在设法争取问题空间同求解空间在结构上的一
致, 以使我们在分析, 设计和实现程序时, 同我们认
识客观世界的过程尽可能一致, 因此产生了面向对象
的程序方法 。 Java就是这样一种面向对象的语言, 不
仅如此, 它还代表了面向对象程序设计方法在目前的
最高应用水平 。 对一个程序员来说, 这意味着可以将
注意力集中在应用程序的数据和处理数据的方法上,
而无需过多地考虑处理过程 。
第 2章 Java语言概述
此外, Java还是一种非常简单的语言 。 Java的前身
Oak,是为家用电器产品设计的, 只有简单易用才能推
广开来, 因此, 这种语言被设计得简单而高效 。 程序
员只需理解一些基本的概念, 就可以用它编写适合各
种情况的应用程序了 。
最后, 安全性也成为 Java受青睐的一个方面 。 因为
在网络环境中, 安全是需要认真考虑的一个问题 。 没
有安全的保障, 用户绝对不会从 Internet上随意一个站
点上下载一个 Java小应用程序, 并在自己的计算机上
运行 。 Java语言提供了若干种安全机制来抵御病毒产
生或侵入文件系统 。 这一点也让用户们非常放心 。
第 2章 Java语言概述
Java的出现确实给计算机行业吹来了一股清风;
它带来了很多新鲜而有趣的思想和观念;它甚至改变
了人们使用计算机的方式 。 就连环球信息网 WWW的
创始人也说,"计算机行业发展的下一个浪潮就是 Java,
并且很快就会发生 。 "
如今, 在美国硅谷, 不懂得 Java的人是无法找到工
作的 。 在我国, 许多计算机权威人士都断言, 谁先掌
握了 Java,谁就号准了世界的脉搏, 就能在信息时代
找到自己的立足之地 。
第 2章 Java语言概述
研究机构 Evans Data公司最近公布的调查结果显示,
Java将在 2003年超过 C/C++成为全球软件开发人员的首
选语言。 参加本次调查的编程人员来自 60多个国家,
他们中 60%的人在 2003年将更多地使用 Java,所用时间
超过使用 C/C++或 VB。公布本次调查结果的 Evans Data
公司副总裁 Garvin说,自该公司 1998年首次开始跟踪
Java的使用情况起,Java用户总数不断增加。她说:
"Java在北美之外的发展更强劲。至少一半被调查的来
自各国的开发人员目前使用 Java。事实上,他们使用
Java的平均时间由 1999年的 9.1%上升到目前的 17.7%。
第 2章 Java语言概述
"尽管最初存在由于 Sun公司的专有立场和该公司
与操作系统社区的矛盾而造成的有关 Java的争议,但
是 Java不断作为技术 "热点 "蚕食 C/C++市场。其主要原
因是 Java具有许多 C++所没有的优点,如简单性、更好
的内存管理和跨平台功能。相反,在过去三年里,
C++在各国开发人员中的占有率减少。 Evans Data说,
目前被调查的开发人员有 25%的时间使用 C++,而这一
数字将在 2002年进一步减少。但是这家市场研究机构
仍认为 C/C++由于其已经生成的巨大代码量,不可能很
快消逝。
第 2章 Java语言概述
至于 C#,一种与 C++相似但与 Microsoft.Net倡议密
切相连, 具备类似 Java语言特性的新语言, 这份调查
显示, 3/4的开发人员表示还没有采用它的计划 。
Garvin说, 有可能采用 C#的开发人员可能是那些已经
使用某种 Microsoft编程语言的用户 。
第 2章 Java语言概述
2.1 Java语言的优势与特点
Sun公司这样形容自己的 Java语言:它是一种简单,
面向对象, 分布式, 解释型, 稳定, 安全, 结构中立,
易移植, 高性能, 多线程的动态语言 。 这段长长的定
语准确地描述了 Java语言的基本特征, 也道出了 Java为
何流行的秘密 。
第 2章 Java语言概述
可以说, 程序设计语言的优点, Java几乎全都拥有 。
从实际的应用开发来看, 也确实如此 。 但有一点需注
意的是, 由于 Java是经过编译器生成字节码后再通过
解释器对其解释执行, 其运行速度会比较慢 。 下面就
上述的特点逐一进行阐述 。
第 2章 Java语言概述
1,简单性
Java是一种简单的语言 。 这点主要表现为简单易学,
在形式上它和 C/C++极为相似, 而且其运行系统小
(Java的基本解释器只有 40 KB,加上标准库和线程支持
也不过 215 KB)。
我们知道,C++中的结构、联合和类的概念重合之
处很多,而 Java只保留了类的概念,减少了复杂性。
运算符重载是 C++的一大特点,一度被认为简化了程
序设计,但实际上用得非常少,作用也不大,反而加
重了程序员的负担,Java把它也给去掉了。
第 2章 Java语言概述
多重继承一直是一个有争议的问题, 赞成者认为
它为面向对象语言带来了方便性和通用性, 增加了语
言的表达能力, 反对者声称它是一个不必要的特征,
容易混淆, 难以使用, 浪费机器资源, 实际价值有限,
所以 Java把它也取消了, 而带之以接口, interface"。
Gosling同时认为, C++的预处理程序, 标题文件, goto
语句和隐式类型转换, 都增加了程序的不可读性, 容
易出问题, 所以全部给取消了 。
第 2章 Java语言概述
2,面向对象
在程序的开发设计过程中,程序员一直在设法争
取问题空间同求解空间在结构上尽可能一致,以使我
们在分析、设计和实现程序时,同我们认识客观世界
的过程尽可能地一致,因此产生了面向对象程序设计
方法。所谓面向对象的设计方法,是基于信息隐藏和
抽象数据类型概念,把系统中所有资源,如数据、模
块以及系统都看成是对象。每个对象封装数据和方法,
而方法实施对数据的处理,并且通过继承机制实现代
码复用。
第 2章 Java语言概述
传统的面向对象语言各有不足, 如 C++语言, 由于
继承了 C的大量特性, 如独立的函数概念, 因而变得复
杂而难用, 而纯粹的面向对象语言如 Smalltalk,Eiffel,
却是动态性有余, 效率不高 。 Java完全具备面向对象
的四大特点:封装, 继承, 多态和动态 。 其封装性比
C++好, 它没有全程变量, 没有主函数 main。 在 Java中
绝大部分成员是对象, 只有简单数字类型, 字符类型,
布尔类型除外, 以便保持高性能 。 Java提供给用户一
系列的类 (class),一个或多个 class可以组成一个包
(package)。 Java的 class和 C++的一样有层次结构, 子类
可以继承父类的属性和方法 。 Java类中方法均缺省为
虚函数 。
第 2章 Java语言概述
Java的面向对象与许多语言都有相通之处,与 C++
自不必说,因为 Java几乎是 C++的一个子集,熟悉 C++
编程的人很快会习惯 Java编程。学过 Pascal的读者对
Java可能也有似曾相识的感觉,因为 Java的 package和
Pascal中的 Unit非常相似,都是表示某些程序块的输入。
运算符重载在 C++中一向被认为是一种优雅的多态机
制,但在实践中,人们发现,运算符重载会使程序变
得难以理解,Java的设计者最后取消了运算符重载,
只在字符串连接运算中留了一些运算符重载的痕迹,
例如用,+”实现字符串的连接。
第 2章 Java语言概述
Java语言面向对象结构的动态性很高, C++中, 如
果修改了某一个类, 整个程序都得重新编译 。 在 Java
中, 可以在类库中自由地加入新的方法和实例变量,
而不影响用户的程序执行 。 虽然 C++也可以实现这种
动态性, 但使用起来非常复杂, 代价也很高 。
第 2章 Java语言概述
3,分布式
Java是一种面向对象的程序设计语言, 它也支持网
络上的应用程序, 是一种分布式 (distributed)程序设计
语言 。 使用 Java提供的类库, 比如 java.net,可以方便
地支持 TCP/IP协议, 完成各种层次上的网络连接 。 请
看下面一个简单的 ftp登录的例子:
第 2章 Java语言概述
...
FtpClient f_client;
f_client=new FtpClient("hostname");
f.login("anonymous","");
f.binary();
...
第 2章 Java语言概述
另外, Java提供一个 Socket类, 这个类可以提供可
靠的流式网络连接 。 这样, 我们可以非常方便地创建
分布式的 Client和 Server应用程序 。 传统的网络编程是
一件复杂的事情, 但是通过 Java提供的网络类库, 可
以轻易地构造出网络应用, 如客户机 /服务器应用, 浏
览器 /服务器应用, 大大简化了工作难度 。 正如 Java的
设计者 Gosling所说, Java的设计就是为了, 最大限度
地利用网络, 。
第 2章 Java语言概述
4,解释型
我们知道, Java的编译器产生的是字节代码, 可把
它理解为一种中间代码, 而不是特定的机器码 。 该字
节码必须运行在一个解释器上, 所以说, Java是一种
解释型语言 。 由于产生的是中间代码 ——字节代码, 因
而可达到与平台无关的目的, 从而可高效地在不同平
台之间传输 。 同时, 该程序可在任何平台上运行, 只
要这个平台上安装了 Java解释器和运行系统即可 。
在解释环境中, 程序开发过程中标准的, 链接,
过程没有了, Java的, 链接, 实际上是把一个新类加
载到当前的环境中, 这和传统的程序开发过程中的编
译, 链接, 测试有较大的区别 。
第 2章 Java语言概述
5,健壮性
分布式计算环境要求软件具有高度的健壮性 。 C++
程序员都知道其在稳定性方面的最大问题在于指针的使
用和缺乏自动的内存管理 。 这使得程序员可能编写出在
语法和语义上均正确, 但却可能对系统产生巨大破坏作
用的软件 。 Java是一种比 C++还强的强壮型语言 。 它要
求显式的方法声明, 保证编译器可以发现方法调用错误 。
Gosling认为指针的主要作用在于数组和结构的访问及使
用 。 Java的数组可以解决前者的问题, 但加强了对数组
下标的检查 。 结构的访问和使用可通过类及类的方法访
问变量解决, 因而可以取消指针的概念 。
第 2章 Java语言概述
Java语言稳定性的另一个方面是自动的内存管理 。
用过 C/C++的读者知道, 比如我们可以调用函数
malloc()来进行内存的分配, 但在使用完后, 必须要对
占用的资源进行释放, 即再调用 free()函数释放掉分配
的内存, 如果稍不小心, 就可能造成系统故障或空间
的浪费 。 Java中专门有一个后台垃圾自动收集程序 ——
Garbage Collector。 它以较低的线程优先级对存储器进
行扫描, 自动释放掉不再使用的存储碎片, 从而使程
序员不用再担心内存的使用, 只是专注于程序的设计
即可 。
第 2章 Java语言概述
异常处理也是 Java健壮性的一个方面。一般认为,
异常处理是成熟语言的标志。在 Java中,通过使用
try/catch/finally语句,程序员可以把一组错误处理代码
放在一个集中的地方统一处理,这可简化错误的处理
及错误的恢复。
第 2章 Java语言概述
6,安全性
Java的安全性和健壮性是紧密联系的, 由于其主要
应用于网络程序的开发, 因而如果没有较高的安全性
作为保障的话, 用户从网络上下载程序将是非常危险
的 。 正如我们前面所描述的, Java取消了指针, 杜绝
了不怀好意的程序对内存恶意篡改 。
第 2章 Java语言概述
Java语言的安全机制基于, 不存在可信任的代码,
的概念 。 其运行环境提供了以下四级安全保障机制:
① 字节码校验器
② 类装载器
③ 运行时内存布局
④ 文件访问机制
第 2章 Java语言概述
当 Java字节码进入解释器时,首先必须经过字节码
校验器的检查。校验器就象一个忠诚的卫士,不能通
过检查的一律不准入内。即使是 Java编译器生成的完
全正确的字节码,校验器也必须再次对其检查,因为
Java程序的编译和解释执行期间,字节码可能会无意
或恶意地被篡改过。然后,Java解释器将决定程序中
类的内存布局,这就意味着不怀好意的程序无法预先
知道一个类的内存布局结构,因而也就无法利用该信
息来修改或破坏系统。
第 2章 Java语言概述
随后, 类装载器负责把来自网络的类加载到单独
的内存区域, 类和类之间相互不会干扰 。 最后, 客户
端用户还可以限制从网络上加载的类只能访问某些被
允许的系统, 如文件和硬盘 。 所以, 当这几种机制加
在一起, 再加上其他的增强办法, 如传输过程中使用
加密解密算法, 程序中做上特殊的标记等, 使得 Java
成为了最安全的系统之一 。
第 2章 Java语言概述
7,可移植性
Java语言的可移植性具有深远的意义, 它不仅给
软件开发者带来了, 一次性开发, 的方便, 而且迎合
了网络计算的思想 。 在 Java以前, 人们只是将 Internet
当作一个巨大的硬盘, 里面有无数的静止信息 。 当
Java出现后, Internet则变成了一个巨大的操作系统,
Java就是这个系统的语言 。 用这个语言写的任何程序,
如电子表格软件, 存放在某台机器上, Internet网上的
任何用户只要得到许可, 就可以下载并运行这个程序,
从而节省了大量的硬盘空间, 也省去了管理的麻烦 。
第 2章 Java语言概述
Java的设计者采用了多种机制来保证可移植性, 最
主要的有:
(1) Java从本质上讲是解释型的, 这意味着任何一
台机器, 只要配备了 Java解释器, 就可以运行 Java程序 。
(2) Java的数据类型在任何机器上都是一致的, 它
不支持特定硬件环境的数据类型 。
总之, Java的可移植性决定了它将成为未来网络环
境的, 世界语, 。
第 2章 Java语言概述
8,高性能
由前所述, 我们知道 Java是一个解释型语言 。 按照
系统结构的观点, 解释型语言除不可能达到编译型语
言的速度外, 其他一些性能并不比编译型语言差 。 有
人作过测试, Java程序的平均运算速度是 C语言的 1/20
倍 。 为了解决高性能问题, Java的设计者正在努力开
发出一种更具效率的编译器, 这种编译器可以在运行
时把 Java的字节码翻译成特定 CPU的机器码, 从而使转
化成机器码的字节码在性能上接近于 C或 C++。
第 2章 Java语言概述
9,多线程
Java高性能的另一个方面是它的多线程能力,他可
以同时运行多个线程,处理多个任务。多线程可称为
“轻量级进程”,它有点像 Unix下的进程概念,多线程
即多个模块并行运行;通过消息协调操作;通过信号灯
和锁保证关键模块的执行不被中断。线程之间可以共享
内存和全局变量,比进程的开销要小得多,因此也可以
将线程看作可以同时运行的函数。多个线程的并行执行,
仿佛有多个 CPU在运行。比如说,一个线程在执行复杂
的计算,而另一个线程完成与用户的交互。用户不必停
下来等待 Java程序完成冗长的操作,所以,多线程能够
增强用户的实时交互能力,提高程序的运行效率。
第 2章 Java语言概述
传统的语言程序中, 多线程编程是相当繁琐的,
因为同一时刻要发生许多事情, 程序员必须考虑它们
的执行顺序, 同步管理, 资源争用等情况 。 例如当使
用 C或 C++语言开发多线程应用程序, 首要的困难是要
保证多个例程可被若干并发线程运行 。 如果一个例程
改变了状态变量的值, 那么一次只可能有一个线程执
行 。 同时, 它还需要程序员负责例程的锁定与释放,
且非常容易形成, 死锁, 。
第 2章 Java语言概述
Java还通过关键字 synchronized来保证两个或更多
的线程不会同时执行一个被声明为同步的方法, 从而
保证某些关键操作 (如写数 )顺利进行而不会被中断 。
当然, Java的同步策略也有问题, 当被标记为
synchronized的函数执行时间较长时, 就可能造成很多
线程在等待该同步函数, 而阻止了程序的其他非同步
部分的执行, 降低了执行效率 。
第 2章 Java语言概述
2.2 Java语言的基本语法
与 C/C++相似,Java的数据类型可以分为两大类型:
基本类型 (简单数据类型 )和引用类型 (复合数据类型 )。
简单类型包括整型 (integer)、浮点型 (float)、字符型
(char)及布尔型 (boolean)。简单数据类型用户通常是不
能修改的,它用来实现一些基本的数据类型。
第 2章 Java语言概述
复合数据类型有类 (class)、接口 (interface)和数组
(array)。复合数据类型是用户根据用户的需要定义并
实现其运算的类型。简单类型的数据在函数调用中是
以传值方式进行的,而复合数据类型在函数调用中则
是以传地址的方式进行的。 Java的数据类型可用图
2.1表示。
第 2章 Java语言概述
图 2.1
整数类型 byte,short,int,long
浮点类型 float,double
字符型 char
布尔类型 boolean
类 class
接口 interface
数组 array
基本类型
引用类型
数据类型
第 2章 Java语言概述
变量是 Java程序中的基本存储单元, 它由类型和标
识符构成 。 Java字符集支持扩展的 16位字节码 (Unicode
字符集 ),提供多语言支持 。 表达式是常量, 变量, 方
法调用以及一个或多个运算符的任意组合, 是构成
Java语言的基本单元 。
本节我们将介绍 Java中简单数据类型、变量、表达
式及运算符的基本内容。
第 2章 Java语言概述
2.2.1 数据类型
Java程序都是由数据和对数据进行的操作构成的 。
数据是计算机用的基本数据, 数据类型决定了数据的
取值范围和运算符号 。
1,整型
Java语言的整型数据与 C/C++相似,按照存储位的
不同,分为 byte,short,int,long四种,分别表示从 8
位到 64位的整数。
第 2章 Java语言概述
表 2.1列出了整型所占内存位数和取值范围 。 其中,
int和 long类型是最常用的类型, 而 byte类型经常用在字
节码数据中, 比如网络传输数据或进行二进制数据的
输入 /输出时 。 由于 short类型在使用时要求数据的存储
须先高字节后低字节, 在某些机器中可能会出错, 故
使用较少 。
第 2章 Java语言概述
表 2.1 整型数属性表
数据类型 占用长度 /bit 取值范围
byte 8 -27~27-1
short 16 -215~215-1
int 32 -231~231-1
long 64 -263~263-1
第 2章 Java语言概述
同 C语言一样, Java的整数也可以用十进制, 八进
制和十六进制来表示 。 八进制数以 O打头, 数字字符为
0~ 7;十六进制数用 Ox(OX)打头, 数字字符为 0~ 9、
a~ f或 A~ F。 一个整型数隐含为 int型, 如果需要 long
类型的数, 必须在该数后加上字母 l (L)。
2,浮点型
Java的浮点类型分为两种:单精度浮点数和双精度
浮点数,分别用关键字 float和 double来表示。与 C/C++
不同,它们的存放位长与机器无关。表 2.2给出了浮点
数的属性。
第 2章 Java语言概述
表 2.2 实型数属性表
数据类型 占用长度 /bit 取值范围
float 32 1.4e-045~3.4e+038
double 64 4.9e-324~1.8e+308
第 2章 Java语言概述
浮点数的隐含类型为 double型, 当我们要 float型的
数时, 就需要显示说明, 即在该数后跟一个字母 f,告
诉编译器该数为 float类型 。 不管是 double型还是 float型,
当对实数使用比较运算符, = =”时, 由于精度的取值
问题, 必须小心使用 。 单精度实数的有效位为:二进
制 23位, 十进制为 7位精度 。 双精度实数有效位为:二
进制 52位, 十进制为 15位精度, 多余位四舍五入 。 下
面是实型变量定义的例子:
float variable1; // variable1 为单精度浮点数
double variable2; //variable2 为双精度浮点数
第 2章 Java语言概述
3,布尔型
Java中布尔型变量只有两个值:真 (true)或假 (false)。
与 C/C++不同, 布尔型数据是独立的数据类型, 所以既
不能将整数值赋给布尔变量, 也不能将布尔类型的数
转换成整型或其他类型 。 布尔型数据在机器中位长为 8
位 。 布尔型数据的定义举例如下:
boolean sign=true;
上例定义 sign为布尔变量, 且初值为 true。
第 2章 Java语言概述
4,字符型
Java中字符型变量的类型为 char,它是一个 16位的
Unicode码, 而不是我们在 C中所见到的 8位 ASCII码 。
下面用关键字 char定义一个字符变量:
char a='b'; //定义一个初值为, b”的字符型变量
在 C语言中, 字符与无符号整数是一样的, 因而可
以混合运算, 不会产生什么问题 。 可是在 Java中, 由
于 Java没有无符号整型类型, 因而字符型数据不能用
作整数 。 但可以通过转换来进行变通, 如:
char a='a';
char b=(char) (a+1);
第 2章 Java语言概述
即字符变量 a转换为整数 97后与 1相加, 最后转换
成字符, b”。
同 C/C++相同, Java字符集中一些不能显示的控制
字符可以用转义序列来表示, 如表 2.3所示 。
第 2章 Java语言概述
表 2.3 转义字符表
转义字符 功能描述
\ddd 1~ 3位八进制所表示的字符
\uxxxx 1~ 4位十六进制所表示的字符
\' 单引号
\" 双引号
\\ 反斜杠
\r 回车
\n 换行
\f 换页
\t 水平制表
\b 退格
第 2章 Java语言概述
2.2.2 变量
变量是 Java程序中的基本存储单元 。 实际上, 数据
在存储器中地址的代号, 包括变量名, 变量类型和作
用域三个不同部分 。 与 C/C++相似, Java变量必须先定
义, 后使用 。
第 2章 Java语言概述
1,变量标识符
Java中标识符是类, 对象, 界面, 方法, 变量和
用户定义的对象的集合 。 为使非英语国家的程序员方
便地用自己的母语定义标识符, Java标识符采用
Unicode字符集, 可为任意长度 。 Java中规定, 标识符
必须以字母, 下划线 ( _ )或美元符 ( $ )为首字母, 后面
字符由一个或多个字母, 下划线, 美元符或数字组成 。
下面我们对 Java中两个特殊的标识符 ——注释和关键字
加以说明 。
第 2章 Java语言概述
1) 注释
注释用来解释程序的正文, 增强程序的可读性 。
它只是为程序起一个说明的作用, 在编译系统作词法
分析前会被忽略掉 。 Java语言提供了三种形式的注释:
// text:行注释, 从, //”到本行结束的所有字符均
作为注释而被忽略 。
/*text*/:多行注释, 从, /*”到, */”之间所有字符
被忽略 。
第 2章 Java语言概述
/**text */:这是 Java语言特有的注释, 同, /*”相
似, 表示从, /**”到, */”之间所有的字符均为注释 。
它只能紧邻在某一个声明之前使用, 作为该声明的注
释, 注释的内容被包含进 java.doc程序自动生成的文档
中 。
第 2章 Java语言概述
上面注释的使用中, 我们必须要注意的是, Java的
注释不允许有嵌套注释, 注释串不允许出现在字符值
或字符串内 。 下面举例说明:
/* try this /* again! // /* everybody,*/
// it's a comment /* another comment */
上两例均表示一个注释 。
System.out.println("Is this a comment?// delete me");
该语句输出为, Is this a comment?//delete me”,而
不是我们想当然的, Is this a comment?”。
第 2章 Java语言概述
2) 关键字
Java中的关键字是编译器预留的, 不能挪作他用,
如果用户拿关键字作为自己的变量标识符, 则会出错 。
下面我们给出 Java中的关键字 。
abstract boolean break byte byvalue
case cast catch char class
const continue default do double
else extends false final finally
第 2章 Java语言概述
float for future generic goto
if implements import instanceof int
Interface inner long native new
null operator outer package private
Protected public rest return short
static super switch synchronized this
Throw transient true try void
while var volatile
第 2章 Java语言概述
2,变量缺省初始值
任何一门编程语言中定义的变量都对应一个值,
不存在没有值的变量 。 当定义一个变量而没有对其初
始化时, 系统默认其初始值为缺省初始值 。 不同数据
类型的缺省初始值如表 2.4所示 。
第 2章 Java语言概述
表 2.4 变量的缺省初始值
类 型 缺省值
byte (byte)0
short (short)0
int 0
long 0L
float 0.0f
double 0.0d
char ‘\n0000’
boolean false
Object null
第 2章 Java语言概述
3,变量的作用域
我们知道, 变量在使用前必须先要进行声明, 其
基本格式为
[accesstype] variabletype variablename
[=value],[,variablename[=value]…];
例如:
protected float grade;
boolean sign;
第 2章 Java语言概述
在上面的描述中, 第一个参数为访问类型, 它是
可选项 。 Java 的 变 量访 问类 型有 四 种,public,
protected,private protected,private。 后面会对这四种
类型作详细说明 。 数据类型可以是基本的数据类型,
类和接口 。 变量的说明可在使用位置之前的任何地方
进行 。
在使用变量时, 需考虑其作用范围, 即作用域的
问题 。 从变量的定义格式我们可以知道, 确定变量的
作用域包含两个方面:一个是其访问类型;另一个为
变量在程序中声明的位置 。 Java中变量四种访问类型
的具体作用如表 2.5所示 。
第 2章 Java语言概述
表 2.5 变量访问类型的说明
访问类型 功能描述
public 能被包内和包外的任何类型访问
protected 可被该变量所在类的子类及同一包中的类访问
private protected 可被该变量所在类及其子类访问
private 只能被定义该变量的类中的方法访问
第 2章 Java语言概述
另一个影响变量作用域的因素是变量声明的位置 。
在程序中, 当我们用, { }”括起一段代码时, 相当于
定义了一个新的域层次 。 作用域层次的作用是判断一
个变量是否可以访问和在什么时候失去效用 。 与 C/C++
相同, 一个变量只有当它在当前的作用域层次或比它
更高的层次中被声明时, 才能在当前作用域层次中使
用访问, 一旦离开一个作用域层次, 在该层次中定义
的所有变量就不能被访问了 。
第 2章 Java语言概述
2.2.3 运算符及表达式
运算符是对一个或多个操作数进行某种特定运算
的标志符号 。 在 Java中, 运算符很丰富,有常用的算术
运算符, 逻辑运算符, 位运算符和对象操作运算符 。
如果我们按操作数的多少来分, 又有单目运算符, 两
目运算符及三目运算符 。 表达式是运算符, 常量和变
量的组合 。 在这节中, 先介绍运算符的基本概念, 然
后讨论表达式的用法 。
第 2章 Java语言概述
1,算术运算符
与 C/C++相似, Java算术运算符用于整型或实型数
的运算, 可分为一元运算符和二元运算符两种 。 一元
运算符如表 2.6所示 。
表 2.6 一元算术运算符表
运算符 用 法 功能描述
+ +OP 正值
? ?OP 负值
++ ++OP,OP++ 加 1(自增 )
?? ??OP,OP?? 减 1(自减 )
第 2章 Java语言概述
上表中, 自增, 自减运算符既可以放于操作数之
前, 也可以放于操作数之后, 这是初学者需注意的地
方 。 当放在操作数之前, 则是先进行自增 /自减运算,
再把其结果用于后继的操作;如果放在操作数之后,
则是先进行别的运算, 然后再进行自增 /自减运算 。 另
外, 自增 /自减运算符只能作用于变量, 而不能作用于
常量或表达式 。 看下面的例子:
int i=2;
int j=3;
int m=++j+i;
int k=m+i++;
第 2章 Java语言概述
在运行完上述四条指令后, i,j的值均加 1成为 3,
4,而 m,k的值变成了 6,8。 需要注意的是, 由于第
三条语句中出现了 ++j,故 m的值为 6,第四条语句中是
i++,所以 k的值为 8。 从上面的例子中, 可以知道, 自
增 /自减运算符使用灵活, 但容易造成副作用, 实际应
用时须十分小心 。 再看一个例子:
int i=2;
int j=3;
System.out.println(i+++j);
System.out.println(+++j);
第 2章 Java语言概述
当运行上述的四条指令时, 第三条指令的输出结
果为 5,而第四条指令出错 。 这是因为对于第三条指令
而言, 系统把 i+++j解释为 i++(+j),结果为 5,而第四条
指令被解释为 ++(+j),由于自增 /自减运算符不能作用
于表达式, 所以出错 。
Java的二元运算符有 +,?,*,/,%五种, 其用法
与 C/C++类似, 见表 2.7所示 。
第 2章 Java语言概述
表 2.7 二元运算符用法表
运算符 用 法 功能描述
+ OP1+OP2 加
? OP1?OP2 减
* OP1*OP2 乘
/ OP1/OP2 除
% OP1%OP2 求余
第 2章 Java语言概述
前四条运算符都是常用的算术运算, 第四条运算
符为取模运算, 即求两操作数相除的余数:当被除数
为正时, 结果为正, 当被除数为负数结果为负 。
实际应用中,算术运算的操作数常常具有不同的
类型,比如说,一个操作数为 int型,另一个操作数为
long型,一旦碰到这种情况,就需要进行类型的转换。
一般原则是保证结果的数据类型与精度最高的操作数
数据类型一致。转换规则如表 2.8所示。
第 2章 Java语言概述
表 2.8 类型转换规则
类型 1 类型 2 结 果
byte/short byte int
byte/short int int
byte/short/int long long
byte/short/int/long float float
byte/short/int/long/float double double
第 2章 Java语言概述
2,关系运算符
关系运算符用于两个值之间的关系比较, 其返回
值为布尔类型, 表 2.9给出了关系运算符的使用方法 。
表 2.9 关系运算符表
运算符 用 法 功能描述
> OP1>OP2 大于为真
>= OP1>=OP2 大于等于为真
< OP1<OP2 小于为真
<= OP1<=OP2 小于等于为真
= = OP1= =OP2 等于为真
! = OP1! =OP2 不等于为真
第 2章 Java语言概述
我们知道,在 C/C++中,真或假的值是用,1”或
,0”来表示的,而在 Java中关系运算符的结果则要么为
true,要么为 false。另外,在关系运算符的使用中,算
术类型只能与算术类型比较,布尔类型、复合类型也
只能与同类型相比较。
3,布尔运算符
与 C/C++不同, Java中, 逻辑运算符只能对布尔逻
辑型数据进行操作, 其返回值同样为逻辑型布尔值 。
其用法如表 2.10所示 。
第 2章 Java语言概述
表 2.10 逻辑运算符表
操作数 OP1 操作数 OP2 OP1&&OP2 OP1 || OP2 ! OP1
true true true true false
true false false true false
false false false false true
false true false true true
第 2章 Java语言概述
逻辑运算符中, 逻辑与 (&&)/逻辑或 (||)运算符为二
元操作符, 而逻辑非 (!)为一元操作符 。 下例是判断某
一年是否为闰年的程序, 我们只给出部分语句 。
...
int year;
if(year%4= =0&& year %100 ! =0 || year %400= =0)
System.out.println("所给年份 "+year+"是闰年 ! ");
...
第 2章 Java语言概述
4,位运算符
位运算符用来对二进制数进行测试, 置位或移位
等操作, 操作数只能为整型或字符型数据, 其用法如
表 2.11所示 。
对于上表中前四种运算符,其真值表如表 2.12所示。
第 2章 Java语言概述
表 2.11 位运算符表
运算符 用 法 功能描述
~ ~OP 按位取反
& OP1&OP2 按位与
| OP1|OP2 按位或
^ OP1^OP2 按位异或
>> OP1>>OP2 OP1右移 OP2位
<< OP1<<OP2 OP1左移 OP2位
>>> OP1>>>OP2 OP1无符号右移 OP2位
第 2章 Java语言概述
表 2.12 位操作真值表
OP1位值 OP2位值 ~OP1 OP1&OP2 OP1|OP2 OP1^OP2
0 0 1 0 0 0
1 0 0 0 1 1
0 1 1 0 1 1
1 1 0 1 1 0
第 2章 Java语言概述
下面我们看一个按位异或的例子:
...
int x=17;
int y=10;
System.out.println("The value is"+x^y);
...
该段程序的输出结果为 27,其实际运算如下:
x,10001
y,01010
^,11011=27
第 2章 Java语言概述
至于后面三种运算符, 均属于移位运算符 。 在不
产生溢出的情况下, 左移一位相当于乘 2,故有:
x*12=x* (8+4) =x<<3+x<<2
右移运算符, >>”将操作数移出右端的低位舍弃,
把最高位作为补位, 所以, 右移一位相当于除 2取商,
与左移相似, 有,
x/8=x>>3
运算符, >>>”是无符号右移, 不考虑最高位的符号
位, 所以补位均为 0。
第 2章 Java语言概述
例 2.1
import java.lang.Math;
public class Move {
public static void main(String args[]){
int x,y;
int n=1;
long result=0;
x=(int) (Math.random()*300);
y=(int)(Math.random()*400);
for(int i=0;i<=32;i++) {
if((y&n)!=0)
result+=x<<i;
n<<=1;
第 2章 Java语言概述
}
System.out.println("The result is"+result);
}
}
在本程序中, 我们利用类 Math中的随机函数
random()来产生两个整数, 由于该函数返回值为 double
型, 因而我们利用了强制类型转换来进行赋值 。 运行
结果为
System Output,The result is21357
System Output,The result is18655
第 2章 Java语言概述
5,赋值运算符
赋值运算符, =”把一个数据赋给一个变量, 其一
般形式为
variable_type variable_name=expression;
例如:
int x=100;
int y=200;
float z=100.0;
第 2章 Java语言概述
Java中赋值语句与 C/C++相似, 可以分为简单赋值
运算符和复合赋值运算符两类 。 比如, 上面的例子就
是简单的赋值语句 。 当赋值符号, =”前面加上不同的
运算符组成一些复杂的赋值语句后, 就成了复合赋值
运算符 。 如:
x/=2; // 等价于 x=x/2;
x%=4; // 等价于 x=x%4;
赋值运算符的基本用法可见表 2.13。
第 2章 Java语言概述
表 2.13 复合赋值运算符用法表
运算符 用 法 等价于
+= OP1+=OP2 OP1=OP1+OP2
?= OP2?=OP2 OP1=OP1?OP2
*= OP1*=OP2 OP1=OP1*OP2
/= OP1/=OP2 OP1=OP1/OP2
%= OP1%=OP2 OP1=OP1%OP2
|= OP1|=OP2 OP1=OP1|OP2
&= OP1&=OP2 OP1=OP1&OP2
^= OP1^=OP2 OP1=OP1^OP2
>>= OP1>>=OP2 OP1=OP1>>OP2
<<= OP1<<=OP2 OP1=OP1<<OP2
>>>= OP1>>>=OP2 OP1=OP1>>>OP2
第 2章 Java语言概述
6,条件运算符
条件运算符是一个三元运算符, 其一般形式为
expression? statement1, statement2;
其语义为:首先计算表达式 expression的值, 如果
该值为真 (true),则将 statement1的值作为整个表达式的
值, 反之, 将 statement2作为整个表达式的值 。 如:
max= x >y? x, y;
该语句取 x,y的最大值 。 需要注意的是, 该运算
符规定 statement1和 statement2需返回相同类型的数据,
且不能为 void。
第 2章 Java语言概述
7,对象运算符
Java中对对象的操作有专门的对象运算符
instanceof。它用来测试一个对象是否是某个类或其子
类的实例,若是则返回 true,反之返回 false。例如:
...
if(e.target instanceof MenuItem) {
String nam=(String) e.arg;
...}
该段代码功能是测试组件上产生的事件是否对应于
菜单 。
第 2章 Java语言概述
8,运算符的优先级
运算符是有优先级的, 它决定表达式中各运算执行的先
后顺序 。 总的来说, 运算符优先级具有如下规则:
(1) 一元运算符比二元运算符优先级高 。
(2) 算术运算符比关系运算符优先级高 。
(3) 关系运算符比按位运算符优先级高 。
(4) 大于和小于运算符比等于和不等于运算符优先级高 。
(5) 按位运算符比逻辑运算符优先级高 。
(6) 逻辑与 (&&)比逻辑或 (||)优先级高 。
(7) 赋值运算符优先级最低 。
第 2章 Java语言概述
表 2.14 运算符的优先级及结合性
运算符 优先级 结合性
[ ]( )
最高
最低
左向
++ ?? ! ~ instanceof 右向
New 右向
* / % 左向
+ ? 左向
>> >>> << 左向
<> <= >= 左向
== != 左向
& 左向
^ 左向
| 左向
&& 左向
|| 左向
,右向
= += ?= *= /= %= ^= 右向
&= /= <<= >>= >>>= 右向
,左向
第 2章 Java语言概述
9,表达式
表达式是由运算符和操作数组合而成的,包含常
量、变量、方法以及一个或多个运算符。一个表达式
包含的多个操作,其顺序是由各运算符的优先级和是
否有括号操作符决定。当表达式在完成运算之后,返
回一个值,其数据类型由参加运算的数据的类型决定。
第 2章 Java语言概述
2.3 流程控制语句
流程控制语句提供了控制程序执行步骤的基本手
段, 可以说是程序的核心部分 。 我们知道, 任何程序
决不会只是顺序地执行语句序列, 程序运行时需要同
用户进行交互, 需根据用户的输入决定执行序列, 这
就需有条件转移及循环执行 。 Java同其他编程语言一
样, 提供了许多流程控制语句 。 本节我们讨论其流程
控制语句的基本语法及特点 。
第 2章 Java语言概述
2.3.1 概述
Java所提供的流程控制语句几乎与 C/C++完全相
同 。 具体来说, Java的流程控制可通过如下一些语句
来实现:
① while和 do-while语句
② for语句
③ if-else语句
④ switch语句
⑤ 异常处理语句
⑥ 分支语句
第 2章 Java语言概述
Java与 C/C++之间的差别很细微, 可归纳为两点:
(1) 在 C语言中, 条件表达式可以是数值型, 而在
Java条件语句中, 条件表达式必须是布尔型, 不能是
数值 。
(2) Java取消了对 goto语句的支持 。 goto语句的使用
一直是程序设计者争论的话题, 这是因为 goto语句的
使用不仅降低了程序的可读性, 而且往往会带来一些
不可预测的错误 。
对于 Java中流程控制语句的使用情况,我们可通过
表 2.15来描述。
第 2章 Java语言概述
表 2.15 控制语句的用法
类 型 用法描述
if-else if(boolean)statement1;else statement2;
switch
switch(expression0)
{case expression1:statement1; …
case expressionN:statementN;
default:statementN+1; }
break Break [label];
continue Continue [lable];
return Return expression;
for for(expression1;expression2;expression3)statement;
while while(boolean)statement;
do-while
do
statement;
while(boolean);
label lable:statement;
第 2章 Java语言概述
2.3.2 条件语句
条件语句 if-else控制条件的转移 。 if语句对给定的
条件加以判断, 根据判定结果执行相应操作;如果表
达式为真, 执行 if语句体, 如果为假, 则执行 else后面
的语句体 。
if语句可以使程序根据一些条件有选择地执行语句。
比如可在程序中设置 boolean变量 DEBUG的值来打印调
试信息。如果 DEBUG是 true,程序就打印出调试信息;
反之就不打印。
第 2章 Java语言概述
具体的程序如下:
if (DEBUG)
{ System.out.println("DEBUG Information,x = " + x); }
上面是一个简单的 if语句的例子 。 总的说来, if语
句分为简单条件语句和复合条件语句, 其语法格式为
第 2章 Java语言概述
① 简单条件语句
if (condition ) 或 if (condition)
{ statement1;
statement; else
} statement2;
第 2章 Java语言概述
② 复合条件语句
if(condition1) statement1;
else if (condition2) statement2;
else if(condition3) statement3;
...
else statementN;
第 2章 Java语言概述
比如当程序需要根据不同的输入信息执行不同的操
作 (例如经常碰到的对话框的选项操作 )时, 可以使用 if
和 else语句来实现这个目的:
…
// response is either OK or Cancel depending
// on the button that the user pressed
…
if (response = = OK) {
// 在这里添加执行 OK动作的代码
} else {
// 在这里添加执行 Cancel动作的代码
}…
第 2章 Java语言概述
使用 Java复合条件语句时, 一个 if语句后可以跟任
意个 else if语句, 但只能有一个 else语句 。 例 2.2将学生
的考试成绩转换成不同的等级,90分以上为 A,80分以
上但小于 90分为 B,依次类推, F表示不及格 。
第 2章 Java语言概述
例 2.2
public class MyClass1{
public static void main(String[] args) {
int testscore = DialogBox.requestInt("Please input a int
number,");
//类 DialogBox见附录
char grade;
if (testscore >= 90) {
grade = 'A';
} else if (testscore >= 80) {
grade = 'B';
第 2章 Java语言概述
} else if (testscore >= 70) {
grade = 'C';
} else if (testscore >= 60) {
grade = 'D';
} else {
grade = 'F';
}
Transcript.println("Grade = " + grade);
//类 Transcript见附录, 以下同
}
}
第 2章 Java语言概述
程序运行时,会弹出一个对话框,如图 2.2所示。
如果我们在其中输入的值为 55,则结果为不及格 F,输
出如图 2.3所示。
图 2.2 图 2.3
第 2章 Java语言概述
我们在前面讨论运算符的时候知道, Java编程语言
支持运算符,?:,, 它不仅是 Java中惟一的三元运算
符, 也是一个简化的 if语句 。 下面看一段代码:
...
if (a>b)
{ System.out.println("The Max number is," + a); } else
{ System.out.println("The Max number is," + b); }
...
第 2章 Java语言概述
2.3.3 循环语句
编程过程中,我们往往会碰到循环控制。几乎所
有的实用程序都包含循环,而循环结构是程序设计的
基本结构之一,它和顺序结构、选择结构共同作为各
种复杂程序的基本构造单元。与 C/C++一样,Java提供
了三种格式的循环控制语句,while语句,do-while语句
和 for语句,下面我们分别加以介绍。
第 2章 Java语言概述
1,while 语句
while语句的功能是当条件成立时, 重复执行子语
句 。 while语句的语法为
while (expression)
{ statement; }
首先, while语句执行并检查条件表达式 expression,
它返回一个 boolean类型数 (true或者 false)。 如果表达式
返回 true,while语句执行语句 statement。 之后 while语
句继续测试条件表达式并执行直到条件返回 false。
第 2章 Java语言概述
使用循环语句须注意的是, 在循环体中必须有能
够对循环条件进行修改的语句, 否则会导致死循环 。
下面我们给出一个例子 WhileDemo。 此函数的功能
是:首先接收用户输入的字符串 (该字符串以字符 ‘ *’
结束 ),然后使用 while语句来测试字符串的各个字符,
并复制字符串到另一串中, 直到碰到字符 ‘ *’ 才结束 。
字符串的用法读者可参阅第四章 。
第 2章 Java语言概述
例 2.3
public class WhileDemo{
public static void main(String[] args) {
String sourceString = DialogBox.request("Please input a
string ended with
character * ");
StringBuffer resultString = new StringBuffer();
int i = 0;
char c = sourceString.charAt(i);
while (c != '*') {
第 2章 Java语言概述
resultString.append(c);
c = sourceString.charAt(++i);
}
Transcript.println("The source string is:");
Transcript.println(sourceString);
Transcript.println("The result string is:");
Transcript.println(resultString);
}
}
当我们输入字符串, Welcome to Java Wrold!*”时, 结果
如图 2.4所示 。
第 2章 Java语言概述
图 2.4
第 2章 Java语言概述
2,do-while 语句
如果需要循环执行的语句至少执行一次, 可使用 do-
while语句, 它实现, 直到型 until”结构, do-while的基本
格式为
do
{
statement;
} while (boolean_expression);
第 2章 Java语言概述
不像 while语句, do-while语句是先执行循环中的语
句再判断循环条件, 所以 do-while语句的循环体至少执
行一次 。 实际上, do-while语句完全可以与 while语句互
换, 比如例 2.3也可以改写成例 2.4所示的程序, 效果是
一样的 。
第 2章 Java语言概述
例 2.4
public class DoWhileDemo {
public static void main(String[] args) {
String sourceString = DialogBox.request("Please input a
string ended with
character * ");
StringBuffer resultString = new StringBuffer();
int i = 0;
char c = sourceString.charAt(i);
do {
第 2章 Java语言概述
resultString.append(c);
c = sourceString.charAt(++i);
} while (c != '*');
Transcript.println("The source string is:");
Transcript.println(sourceString);
Transcript.println("The result string is:");
Transcript.println(resultString);
}
}
第 2章 Java语言概述
3,for 语句
for语句是最标准的循环语句 。 与C /C++相同, 它
是 Java语言中最灵活的一种控制结构, 它有多种变形,
可实现不同的循环功能 。 for语句的一般格式为
for (初始条件;终止条件;增量 )
{ statement; }
初始条件是为循环变量置初值,它在循环开始的时
候就执行一次。终止条件决定循环是否继续,该条件
表达式在每次循环的时候均作判断,如表达式结果为
false,则循环结束。
第 2章 Java语言概述
量是循环一次增加多少 (即步长 )的表达式 。 括号内
的三个表达式均可以为空 。 实际上, 为了实现无限循
环, 这三个表达式都可以省略 。 例如:
...
for ( ; ; ) // 表示无限循环
{,.,}
例 2.5中使用了一个 for循环语句来输入/输出一个
数组 (数组的内容参见第 3章 )的所有元素 。
第 2章 Java语言概述
例 2.5
public class MyClass1 {
public static void main(String[] args) {
int[] Aintarray = new int[5];
for (int i=0;i<Aintarray.length;i++)
Aintarray[i]=i*i;
for (int i = 0; i < Aintarray.length; i++) {
Transcript.print(Aintarray[i] + " ");
}
Transcript.println();
}
}
第 2章 Java语言概述
图 2.5
第 2章 Java语言概述
2.3.4 switch开关语句
switch是 Java所提供的多分支选择语句 。 现实生活
中常常会碰到多种可能性的情况, 虽然可用复合条件
语句来处理, 但会使程序变得冗长繁琐, 可读性也会
降低 。 switch语句能够很方便地处理这些多种可能性 。
switch语句的一般格式如下:
switch (expression)
{
case constant1:
statement1;
break;
第 2章 Java语言概述
case constant2:
statement2;
break;
...
case constantN:
statementN;
break;
default:
statementN+1;
break;
}
第 2章 Java语言概述
上面结构中, 每条语句均用 break语句加以终止,
这是因为, 如果没有 break语句, 程序将继续执行下一
个 case语句, 直到结束 。 如果没有与常量相匹配的 case
语句, 则执行 default语句 。 switch表达式与 case常量表
达式的类型可为 byte,char,short,int及 long类型, 不
能是关系表达式和逻辑表达式 。
switch语句根据一个有序类型表达式有条件地执行
语句 。 例 2.6程序的功能是:接受用户输入的一个整型
变量 month(它的数值代表了月份 )。 然后根据此值显示
对应的月份 。
第 2章 Java语言概述
例 2.6
public class SwitchDemo {
public static void main(String[] args) {
int month = DialogBox.requestInt("Please input a int number
between 1-12,");
switch (month) {
case 1,System.out.println("Now is,January"); break;
case 2,System.out.println("Now is,February"); break;
case 3,System.out.println("Now is,March"); break;
case 4,System.out.println("Now is,April"); break;
第 2章 Java语言概述
case 5,System.out.println("Now is,May"); break;
case 6,System.out.println("Now is,June"); break;
case 7,System.out.println("Now is,July"); break;
case 8,System.out.println("Now is,August"); break;
case 9,System.out.println("Now is,September"); break;
case 10,System.out.println("Now is,October"); break;
case 11,System.out.println("Now is,November"); break;
case 12,System.out.println("Now is,December"); break;
default,System.out.println("You input a unvalid number! Try
again,"); break;
第 2章 Java语言概述
}
}
}
我们也可以使用 if语句来实现上面的程序, 但代码就显得
比较繁琐 。 这里我们给出部分代码:
int month = DiologBox.requestInt("Please input a int number
between 1-12,");
if (month == 1) {
System.out.println("Now is,January ");
} else if (month == 2) {
第 2章 Java语言概述
System.out.println("Now is,February ");
} else if (month ==3) {
System.out.println("Now is,March ");
} else if (month ==4) {
System.out.println("Now is,April ");
...
与例 2.6相比,上述代码的可读性明显要比使用
switch语句差。使用 if语句还是使用 switch语句可根据
可读性及其他因素来作决定。
第 2章 Java语言概述
if语句可以在更大范围进行选择, 而 switch只能在
变量为有序类型, 且提供给 case语句的数值惟一时才能
选择 。 总之, 使用 switch语句, 我们须注意如下事项:
(1) switch语句只能取代 if语句的部分功能, 因为其
只能对 switch后括号内表达式的值与常量进行比较, 而
if语句可作多种比较 。
(2) case 常量表达式出现次序可相互调换, 不影响
执行结果 。
第 2章 Java语言概述
(3) 括号内的表达式只能为整型或字符型 。
(4) 同一个 switch语句不能有两个 case常量值相等 。
(5) 每一步之后必须用 break语句终止, 否则失去开
关的效果 。
第 2章 Java语言概述
2.3.5 转移语句
转移语句是用来直接控制执行流程的语句 。 Java语
言提供了 3个转移语句,break,continue和 return语句 。
它们的功能就是改变 while,do-while,for及 switch语句
的正常运行 。 比如说, 我们在介绍 for语句的时候曾经
提到过死循环 for(; ;)的问题, 如果利用转移语句的
break语句, 就能达到改变循环顺序的目的, 从而跳出
死循环 。 下面我们对上述的三个转移语句分别加以介绍 。
第 2章 Java语言概述
1,break语句
break语句可以终止当前的循环和开关语句的执行,
接着执行后继的下一条指令 。 它的基本语法形式如下:
break [label];
其中,括号中的参数为标号,它为可选项。我们
在前面已经碰到过未带标号的 break语句。用未带标号
的 break语句终止 swtich语句,控制流程会马上转到
switch语句下方的语句。
第 2章 Java语言概述
例 2.7的功能是从一个给定的数组中查找某个指定的数
值:首先通过随机函数产生 10个随机数并显示出来,
然后通过接收窗口输入一个数,当数值被找到时,
break语句就会终止 for循环,控制流程就转到 for语句下
面的语句继续执行。程序如下:
第 2章 Java语言概述
例 2.7
public class MyClass1 {
public static void main(String[] args) {
int[] sourceArray = new int[10];
int searchfor = DialogBox.requestInt("Please input a int
number, ");
for (int i=0;i<sourceArray.length;i++)
sourceArray[i]=(int) (Math.random()*100);
Transcript.print("The number in array is,");
for (int i=0;i<sourceArray.length;i++)
Transcript.print(+sourceArray[i]+" ");
Transcript.println();
第 2章 Java语言概述
int i = 0;
boolean found = false;
for ( ; i < sourceArray.length; i++)
if (sourceArray[i] == searchfor) {
found = true;
break;
第 2章 Java语言概述
}
if (found)
Transcript.println("Found " + searchfor + " at index "
+ i);
else
Transcript.println("The number "+searchfor + " not be
found in the array");
}
}
该程序的运行结果如图 2.6,2.7所示 。
第 2章 Java语言概述
图 2.7
图 2.6
第 2章 Java语言概述
从本质上说,不带标号的 break语句用于终止内部
的 switch,for,while或者 do-while,如例 2.7,而带标
号的 break语句用于终止一个外部的语句,它通过 break
语句中所带的标号来实现。大家知道,C语言中的标号
语句一般是以冒号 (,)作为其语句表示,而且往往同
goto语句配合使用。虽然 Java不支持 goto语句,但其保
留了标号语句的使用。例 2.8与例 2.7有点相似,但它是
在一个二维数组中搜索一个数值,且是利用两个嵌套
的 for循环遍历了整个数组;当数值被找到时,标志形
式的 break语句就终止标志的 search语句。这个 search语
句位于 for循环外部。
第 2章 Java语言概述
例 2.8
public class MyClass2 {
public static void main(String[] args) {
int[][] sourceArray = new int[3][4];
int searchfor = DialogBox.requestInt("Please input a int
number, ");
for (int i=0;i<sourceArray.length;i++)
for(int j=0;j<sourceArray[i].length;j++)
sourceArray[i][j]=(int) (Math.random()*100);
Transcript.print("The number in array is,");
Transcript.println();
第 2章 Java语言概述
for (int i=0; i<sourceArray.length; i++)
for(int j=0; j<sourceArray[i].length; j++)
{
Transcript.print(+sourceArray[i][j]+" ");
if ((j/3)==1)
Transcript.println();
}
Transcript.println();
int i = 0;
int j = 0;
第 2章 Java语言概述
boolean found = false;
search:
for ( ; i < sourceArray.length; i++)
for (j = 0; j < sourceArray[i].length; j++)
if (sourceArray[i][j] == searchfor)
{ found = true;
break search;
}
if (found)
Transcript.println("Found " + searchfor + " at index " +
i+','+j);
else
第 2章 Java语言概述
Transcript.println("The number "+searchfor + " not be found
in the array");
}
}
如输入的数值为 9,则运行该程序后, 结果如图 2.8所示 。
第 2章 Java语言概述
图 2.8
第 2章 Java语言概述
2,continue 语句
与 break语句相反, continue语句的功能是跳过循环
体中随后的语句, 进行下一次循环的操作, 其一般使
用格式为
continue [lable];
其中, lable表示 continue语句也可以带标号 。
不带标号的 continue语句用于跳过当前的 for,while
或者 do-while循环 。
第 2章 Java语言概述
不带标号的 continue语句使用实例见例 2.9。 该例对给定
的字符串按某个字符进行匹配, 如果当前字母不是指
定的字符, continue语句就, 短路, 循环其他部分并开
始下一次匹配;如果成功, 程序就对计数器增 1,再将
对应的字符转换为大写字母, 最后输出相关的统计数
及转换后的字符串 。
第 2章 Java语言概述
例 2.9
public class MyClass1 {
public static void main(String[] args) {
String InStr =DialogBox.request("Please input a String,");
StringBuffer FindStr=new StringBuffer(InStr);
int numAs = 0;
for (int i = 0; i < FindStr.length(); i++)
{
if (FindStr.charAt(i) != 'a')
第 2章 Java语言概述
continue; // 跳过以下的本次循环语句, 开始下一次循环
numAs++;
FindStr.setCharAt(i,'A');
}
Transcript.println("Found " + numAs + " a's in the
string.");
Transcript.println(FindStr);
}
}
第 2章 Java语言概述
带标号的 continue语句将忽略外部给定标志的循环 。
例 2.10使用了一个嵌套的循环来搜索一个子字符串 。 在
该程序中使用了两个带标号的语句,, continue test;,
及, break test;, 。 当内部循环进行一次子串匹配且
不成功时, 则返回到外部循环开始下一次子串的匹配,
这就是, continue test;”语句的功能 。 反之, 当子串匹
配成功, 则, break test;, 语句保证程序从循环中终
止出来, 不再进行循环的操作 。 程序如下:
第 2章 Java语言概述
例 2.10
public class MyClass1 {
public static void main(String[] args) {
String SourceStr = DialogBox.request("Please input a String
searched,");;
String MatchStr = DialogBox.request("Please input a String
used to Match other
string,");
boolean foundIt = false;
test:
for (int i = 0; i <= SourceStr.length() - MatchStr.length(); i++)
第 2章 Java语言概述
{ int n = MatchStr.length();
int j = i;
int k = 0;
while (n-- != 0)
{
if (SourceStr.charAt(j++) !=
MatchStr.charAt(k++))
continue test;
}
foundIt = true;
break test;
}
第 2章 Java语言概述
Transcript.println("The Match result is,"+(foundIt? "Found
it", "Didn't find it"));
}
}
我们首先输入一字符串:, Shen Zhen University!”,
然后输入另一需匹配的串:, Shen”,则程序的运行结
果如图 2.9所示 。
第 2章 Java语言概述
图 2.9
第 2章 Java语言概述
3,return语句
return语句即为返回语句, 主要功能是从一个方法
返回到另一个方法 。 我们知道, 程序设计往往需要在
一个方法中调用另一个方法, 调用者称之为主调方法,
被调用的方法称为子方法, 这与 C++是一致的 。 当我
们从子方法返回到主方法时, 就得使用 return语句进行
说明 。 return语句的一般使用格式为
return [return_value];
第 2章 Java语言概述
从其格式中, 我们知道, 该指令可以返回值也可
以不返回值 。 如果不需要返回值, 说明子方法的返回
类型为 void,例如:
public int getMax(int x,int y)
{ return x>y?x, y ; }
此函数功能是比较两个整型数并返回其中的最大值 。
第 2章 Java语言概述
2.1 Java语言的优势与特点
2.2 Java语言的基本语法
2.3 流程控制语句
第 2章 Java语言概述
1991年,Sun公司的 James Gosling等人,为在电视
机、烤面包箱等家用消费类电子产品上进行交互式操
作而开发了一个名叫 Oak(一种橡树的名字 )的语言。由
于商业上的种种原因,这种语言始终没有投放到市场
中,而且连 Oak这个名字也成了问题,因为已经有上百
家公司在使用这个名字,所以 Sun公司根本无法将之注
册为商标。最终,Sun公司决定,将这种语言改名为
Java,并且在互联网上发布,免费提供下载。
第 2章 Java语言概述
当时, 由于 Oak的失败, 有一些传谣者鼓吹 Java这
些字母代表 "只是又一个无意义的缩写词 "(Just Another
Valueless Acronym)。 Sun公司否认了这一说法, 而且
说 Java是语言开发者在喝一种原产于印度尼西亚爪哇
群岛的咖啡时, 出于一时的灵感而碰撞出的火花 。
第 2章 Java语言概述
几个月后, 出乎所有人的意料, Java成为赛博空间
最热门的话题 。 Java被越来越多的用户使用, 受到越
来越多的重视 。 上百个 Java小应用程序在互联网上的
多媒体应用中流行起来 。 一些著名的公司, 如微软,
IBM,苹果电脑, 数字设备公司, 纷纷购买了 Java语言
的使用权, 随之大量出现了用 Java编写的软件产品 。
Java受到业界的重视与好评 。 微软总裁比尔 ·盖茨在悄
悄地观察了一段时间后, 也感慨地说,"Java是长时间
以来最卓越的程序设计语言 "。
第 2章 Java语言概述
Java为什么会在短时期内受到如此多的程序员欢迎?
为什么在计算机行业竞争激烈的今天, 一个计算机硬
件公司开发出来的语言, 会一下子得到几乎世界上各
大计算机软, 硬件公司的支持呢?
Java最重要的特征在于它的操作平台无关性, 这是
以往任何一种语言都不具备的特征 。 也就是说, 用
Java语言编写的程序可以在任何一台计算机上运行,
而不管该计算机使用何种操作系统, 要知道, 这可是
广大程序员的一个梦想 。
第 2章 Java语言概述
其次, Java是一种面向对象的语言 。 长期以来, 人
们一直在设法争取问题空间同求解空间在结构上的一
致, 以使我们在分析, 设计和实现程序时, 同我们认
识客观世界的过程尽可能一致, 因此产生了面向对象
的程序方法 。 Java就是这样一种面向对象的语言, 不
仅如此, 它还代表了面向对象程序设计方法在目前的
最高应用水平 。 对一个程序员来说, 这意味着可以将
注意力集中在应用程序的数据和处理数据的方法上,
而无需过多地考虑处理过程 。
第 2章 Java语言概述
此外, Java还是一种非常简单的语言 。 Java的前身
Oak,是为家用电器产品设计的, 只有简单易用才能推
广开来, 因此, 这种语言被设计得简单而高效 。 程序
员只需理解一些基本的概念, 就可以用它编写适合各
种情况的应用程序了 。
最后, 安全性也成为 Java受青睐的一个方面 。 因为
在网络环境中, 安全是需要认真考虑的一个问题 。 没
有安全的保障, 用户绝对不会从 Internet上随意一个站
点上下载一个 Java小应用程序, 并在自己的计算机上
运行 。 Java语言提供了若干种安全机制来抵御病毒产
生或侵入文件系统 。 这一点也让用户们非常放心 。
第 2章 Java语言概述
Java的出现确实给计算机行业吹来了一股清风;
它带来了很多新鲜而有趣的思想和观念;它甚至改变
了人们使用计算机的方式 。 就连环球信息网 WWW的
创始人也说,"计算机行业发展的下一个浪潮就是 Java,
并且很快就会发生 。 "
如今, 在美国硅谷, 不懂得 Java的人是无法找到工
作的 。 在我国, 许多计算机权威人士都断言, 谁先掌
握了 Java,谁就号准了世界的脉搏, 就能在信息时代
找到自己的立足之地 。
第 2章 Java语言概述
研究机构 Evans Data公司最近公布的调查结果显示,
Java将在 2003年超过 C/C++成为全球软件开发人员的首
选语言。 参加本次调查的编程人员来自 60多个国家,
他们中 60%的人在 2003年将更多地使用 Java,所用时间
超过使用 C/C++或 VB。公布本次调查结果的 Evans Data
公司副总裁 Garvin说,自该公司 1998年首次开始跟踪
Java的使用情况起,Java用户总数不断增加。她说:
"Java在北美之外的发展更强劲。至少一半被调查的来
自各国的开发人员目前使用 Java。事实上,他们使用
Java的平均时间由 1999年的 9.1%上升到目前的 17.7%。
第 2章 Java语言概述
"尽管最初存在由于 Sun公司的专有立场和该公司
与操作系统社区的矛盾而造成的有关 Java的争议,但
是 Java不断作为技术 "热点 "蚕食 C/C++市场。其主要原
因是 Java具有许多 C++所没有的优点,如简单性、更好
的内存管理和跨平台功能。相反,在过去三年里,
C++在各国开发人员中的占有率减少。 Evans Data说,
目前被调查的开发人员有 25%的时间使用 C++,而这一
数字将在 2002年进一步减少。但是这家市场研究机构
仍认为 C/C++由于其已经生成的巨大代码量,不可能很
快消逝。
第 2章 Java语言概述
至于 C#,一种与 C++相似但与 Microsoft.Net倡议密
切相连, 具备类似 Java语言特性的新语言, 这份调查
显示, 3/4的开发人员表示还没有采用它的计划 。
Garvin说, 有可能采用 C#的开发人员可能是那些已经
使用某种 Microsoft编程语言的用户 。
第 2章 Java语言概述
2.1 Java语言的优势与特点
Sun公司这样形容自己的 Java语言:它是一种简单,
面向对象, 分布式, 解释型, 稳定, 安全, 结构中立,
易移植, 高性能, 多线程的动态语言 。 这段长长的定
语准确地描述了 Java语言的基本特征, 也道出了 Java为
何流行的秘密 。
第 2章 Java语言概述
可以说, 程序设计语言的优点, Java几乎全都拥有 。
从实际的应用开发来看, 也确实如此 。 但有一点需注
意的是, 由于 Java是经过编译器生成字节码后再通过
解释器对其解释执行, 其运行速度会比较慢 。 下面就
上述的特点逐一进行阐述 。
第 2章 Java语言概述
1,简单性
Java是一种简单的语言 。 这点主要表现为简单易学,
在形式上它和 C/C++极为相似, 而且其运行系统小
(Java的基本解释器只有 40 KB,加上标准库和线程支持
也不过 215 KB)。
我们知道,C++中的结构、联合和类的概念重合之
处很多,而 Java只保留了类的概念,减少了复杂性。
运算符重载是 C++的一大特点,一度被认为简化了程
序设计,但实际上用得非常少,作用也不大,反而加
重了程序员的负担,Java把它也给去掉了。
第 2章 Java语言概述
多重继承一直是一个有争议的问题, 赞成者认为
它为面向对象语言带来了方便性和通用性, 增加了语
言的表达能力, 反对者声称它是一个不必要的特征,
容易混淆, 难以使用, 浪费机器资源, 实际价值有限,
所以 Java把它也取消了, 而带之以接口, interface"。
Gosling同时认为, C++的预处理程序, 标题文件, goto
语句和隐式类型转换, 都增加了程序的不可读性, 容
易出问题, 所以全部给取消了 。
第 2章 Java语言概述
2,面向对象
在程序的开发设计过程中,程序员一直在设法争
取问题空间同求解空间在结构上尽可能一致,以使我
们在分析、设计和实现程序时,同我们认识客观世界
的过程尽可能地一致,因此产生了面向对象程序设计
方法。所谓面向对象的设计方法,是基于信息隐藏和
抽象数据类型概念,把系统中所有资源,如数据、模
块以及系统都看成是对象。每个对象封装数据和方法,
而方法实施对数据的处理,并且通过继承机制实现代
码复用。
第 2章 Java语言概述
传统的面向对象语言各有不足, 如 C++语言, 由于
继承了 C的大量特性, 如独立的函数概念, 因而变得复
杂而难用, 而纯粹的面向对象语言如 Smalltalk,Eiffel,
却是动态性有余, 效率不高 。 Java完全具备面向对象
的四大特点:封装, 继承, 多态和动态 。 其封装性比
C++好, 它没有全程变量, 没有主函数 main。 在 Java中
绝大部分成员是对象, 只有简单数字类型, 字符类型,
布尔类型除外, 以便保持高性能 。 Java提供给用户一
系列的类 (class),一个或多个 class可以组成一个包
(package)。 Java的 class和 C++的一样有层次结构, 子类
可以继承父类的属性和方法 。 Java类中方法均缺省为
虚函数 。
第 2章 Java语言概述
Java的面向对象与许多语言都有相通之处,与 C++
自不必说,因为 Java几乎是 C++的一个子集,熟悉 C++
编程的人很快会习惯 Java编程。学过 Pascal的读者对
Java可能也有似曾相识的感觉,因为 Java的 package和
Pascal中的 Unit非常相似,都是表示某些程序块的输入。
运算符重载在 C++中一向被认为是一种优雅的多态机
制,但在实践中,人们发现,运算符重载会使程序变
得难以理解,Java的设计者最后取消了运算符重载,
只在字符串连接运算中留了一些运算符重载的痕迹,
例如用,+”实现字符串的连接。
第 2章 Java语言概述
Java语言面向对象结构的动态性很高, C++中, 如
果修改了某一个类, 整个程序都得重新编译 。 在 Java
中, 可以在类库中自由地加入新的方法和实例变量,
而不影响用户的程序执行 。 虽然 C++也可以实现这种
动态性, 但使用起来非常复杂, 代价也很高 。
第 2章 Java语言概述
3,分布式
Java是一种面向对象的程序设计语言, 它也支持网
络上的应用程序, 是一种分布式 (distributed)程序设计
语言 。 使用 Java提供的类库, 比如 java.net,可以方便
地支持 TCP/IP协议, 完成各种层次上的网络连接 。 请
看下面一个简单的 ftp登录的例子:
第 2章 Java语言概述
...
FtpClient f_client;
f_client=new FtpClient("hostname");
f.login("anonymous","");
f.binary();
...
第 2章 Java语言概述
另外, Java提供一个 Socket类, 这个类可以提供可
靠的流式网络连接 。 这样, 我们可以非常方便地创建
分布式的 Client和 Server应用程序 。 传统的网络编程是
一件复杂的事情, 但是通过 Java提供的网络类库, 可
以轻易地构造出网络应用, 如客户机 /服务器应用, 浏
览器 /服务器应用, 大大简化了工作难度 。 正如 Java的
设计者 Gosling所说, Java的设计就是为了, 最大限度
地利用网络, 。
第 2章 Java语言概述
4,解释型
我们知道, Java的编译器产生的是字节代码, 可把
它理解为一种中间代码, 而不是特定的机器码 。 该字
节码必须运行在一个解释器上, 所以说, Java是一种
解释型语言 。 由于产生的是中间代码 ——字节代码, 因
而可达到与平台无关的目的, 从而可高效地在不同平
台之间传输 。 同时, 该程序可在任何平台上运行, 只
要这个平台上安装了 Java解释器和运行系统即可 。
在解释环境中, 程序开发过程中标准的, 链接,
过程没有了, Java的, 链接, 实际上是把一个新类加
载到当前的环境中, 这和传统的程序开发过程中的编
译, 链接, 测试有较大的区别 。
第 2章 Java语言概述
5,健壮性
分布式计算环境要求软件具有高度的健壮性 。 C++
程序员都知道其在稳定性方面的最大问题在于指针的使
用和缺乏自动的内存管理 。 这使得程序员可能编写出在
语法和语义上均正确, 但却可能对系统产生巨大破坏作
用的软件 。 Java是一种比 C++还强的强壮型语言 。 它要
求显式的方法声明, 保证编译器可以发现方法调用错误 。
Gosling认为指针的主要作用在于数组和结构的访问及使
用 。 Java的数组可以解决前者的问题, 但加强了对数组
下标的检查 。 结构的访问和使用可通过类及类的方法访
问变量解决, 因而可以取消指针的概念 。
第 2章 Java语言概述
Java语言稳定性的另一个方面是自动的内存管理 。
用过 C/C++的读者知道, 比如我们可以调用函数
malloc()来进行内存的分配, 但在使用完后, 必须要对
占用的资源进行释放, 即再调用 free()函数释放掉分配
的内存, 如果稍不小心, 就可能造成系统故障或空间
的浪费 。 Java中专门有一个后台垃圾自动收集程序 ——
Garbage Collector。 它以较低的线程优先级对存储器进
行扫描, 自动释放掉不再使用的存储碎片, 从而使程
序员不用再担心内存的使用, 只是专注于程序的设计
即可 。
第 2章 Java语言概述
异常处理也是 Java健壮性的一个方面。一般认为,
异常处理是成熟语言的标志。在 Java中,通过使用
try/catch/finally语句,程序员可以把一组错误处理代码
放在一个集中的地方统一处理,这可简化错误的处理
及错误的恢复。
第 2章 Java语言概述
6,安全性
Java的安全性和健壮性是紧密联系的, 由于其主要
应用于网络程序的开发, 因而如果没有较高的安全性
作为保障的话, 用户从网络上下载程序将是非常危险
的 。 正如我们前面所描述的, Java取消了指针, 杜绝
了不怀好意的程序对内存恶意篡改 。
第 2章 Java语言概述
Java语言的安全机制基于, 不存在可信任的代码,
的概念 。 其运行环境提供了以下四级安全保障机制:
① 字节码校验器
② 类装载器
③ 运行时内存布局
④ 文件访问机制
第 2章 Java语言概述
当 Java字节码进入解释器时,首先必须经过字节码
校验器的检查。校验器就象一个忠诚的卫士,不能通
过检查的一律不准入内。即使是 Java编译器生成的完
全正确的字节码,校验器也必须再次对其检查,因为
Java程序的编译和解释执行期间,字节码可能会无意
或恶意地被篡改过。然后,Java解释器将决定程序中
类的内存布局,这就意味着不怀好意的程序无法预先
知道一个类的内存布局结构,因而也就无法利用该信
息来修改或破坏系统。
第 2章 Java语言概述
随后, 类装载器负责把来自网络的类加载到单独
的内存区域, 类和类之间相互不会干扰 。 最后, 客户
端用户还可以限制从网络上加载的类只能访问某些被
允许的系统, 如文件和硬盘 。 所以, 当这几种机制加
在一起, 再加上其他的增强办法, 如传输过程中使用
加密解密算法, 程序中做上特殊的标记等, 使得 Java
成为了最安全的系统之一 。
第 2章 Java语言概述
7,可移植性
Java语言的可移植性具有深远的意义, 它不仅给
软件开发者带来了, 一次性开发, 的方便, 而且迎合
了网络计算的思想 。 在 Java以前, 人们只是将 Internet
当作一个巨大的硬盘, 里面有无数的静止信息 。 当
Java出现后, Internet则变成了一个巨大的操作系统,
Java就是这个系统的语言 。 用这个语言写的任何程序,
如电子表格软件, 存放在某台机器上, Internet网上的
任何用户只要得到许可, 就可以下载并运行这个程序,
从而节省了大量的硬盘空间, 也省去了管理的麻烦 。
第 2章 Java语言概述
Java的设计者采用了多种机制来保证可移植性, 最
主要的有:
(1) Java从本质上讲是解释型的, 这意味着任何一
台机器, 只要配备了 Java解释器, 就可以运行 Java程序 。
(2) Java的数据类型在任何机器上都是一致的, 它
不支持特定硬件环境的数据类型 。
总之, Java的可移植性决定了它将成为未来网络环
境的, 世界语, 。
第 2章 Java语言概述
8,高性能
由前所述, 我们知道 Java是一个解释型语言 。 按照
系统结构的观点, 解释型语言除不可能达到编译型语
言的速度外, 其他一些性能并不比编译型语言差 。 有
人作过测试, Java程序的平均运算速度是 C语言的 1/20
倍 。 为了解决高性能问题, Java的设计者正在努力开
发出一种更具效率的编译器, 这种编译器可以在运行
时把 Java的字节码翻译成特定 CPU的机器码, 从而使转
化成机器码的字节码在性能上接近于 C或 C++。
第 2章 Java语言概述
9,多线程
Java高性能的另一个方面是它的多线程能力,他可
以同时运行多个线程,处理多个任务。多线程可称为
“轻量级进程”,它有点像 Unix下的进程概念,多线程
即多个模块并行运行;通过消息协调操作;通过信号灯
和锁保证关键模块的执行不被中断。线程之间可以共享
内存和全局变量,比进程的开销要小得多,因此也可以
将线程看作可以同时运行的函数。多个线程的并行执行,
仿佛有多个 CPU在运行。比如说,一个线程在执行复杂
的计算,而另一个线程完成与用户的交互。用户不必停
下来等待 Java程序完成冗长的操作,所以,多线程能够
增强用户的实时交互能力,提高程序的运行效率。
第 2章 Java语言概述
传统的语言程序中, 多线程编程是相当繁琐的,
因为同一时刻要发生许多事情, 程序员必须考虑它们
的执行顺序, 同步管理, 资源争用等情况 。 例如当使
用 C或 C++语言开发多线程应用程序, 首要的困难是要
保证多个例程可被若干并发线程运行 。 如果一个例程
改变了状态变量的值, 那么一次只可能有一个线程执
行 。 同时, 它还需要程序员负责例程的锁定与释放,
且非常容易形成, 死锁, 。
第 2章 Java语言概述
Java还通过关键字 synchronized来保证两个或更多
的线程不会同时执行一个被声明为同步的方法, 从而
保证某些关键操作 (如写数 )顺利进行而不会被中断 。
当然, Java的同步策略也有问题, 当被标记为
synchronized的函数执行时间较长时, 就可能造成很多
线程在等待该同步函数, 而阻止了程序的其他非同步
部分的执行, 降低了执行效率 。
第 2章 Java语言概述
2.2 Java语言的基本语法
与 C/C++相似,Java的数据类型可以分为两大类型:
基本类型 (简单数据类型 )和引用类型 (复合数据类型 )。
简单类型包括整型 (integer)、浮点型 (float)、字符型
(char)及布尔型 (boolean)。简单数据类型用户通常是不
能修改的,它用来实现一些基本的数据类型。
第 2章 Java语言概述
复合数据类型有类 (class)、接口 (interface)和数组
(array)。复合数据类型是用户根据用户的需要定义并
实现其运算的类型。简单类型的数据在函数调用中是
以传值方式进行的,而复合数据类型在函数调用中则
是以传地址的方式进行的。 Java的数据类型可用图
2.1表示。
第 2章 Java语言概述
图 2.1
整数类型 byte,short,int,long
浮点类型 float,double
字符型 char
布尔类型 boolean
类 class
接口 interface
数组 array
基本类型
引用类型
数据类型
第 2章 Java语言概述
变量是 Java程序中的基本存储单元, 它由类型和标
识符构成 。 Java字符集支持扩展的 16位字节码 (Unicode
字符集 ),提供多语言支持 。 表达式是常量, 变量, 方
法调用以及一个或多个运算符的任意组合, 是构成
Java语言的基本单元 。
本节我们将介绍 Java中简单数据类型、变量、表达
式及运算符的基本内容。
第 2章 Java语言概述
2.2.1 数据类型
Java程序都是由数据和对数据进行的操作构成的 。
数据是计算机用的基本数据, 数据类型决定了数据的
取值范围和运算符号 。
1,整型
Java语言的整型数据与 C/C++相似,按照存储位的
不同,分为 byte,short,int,long四种,分别表示从 8
位到 64位的整数。
第 2章 Java语言概述
表 2.1列出了整型所占内存位数和取值范围 。 其中,
int和 long类型是最常用的类型, 而 byte类型经常用在字
节码数据中, 比如网络传输数据或进行二进制数据的
输入 /输出时 。 由于 short类型在使用时要求数据的存储
须先高字节后低字节, 在某些机器中可能会出错, 故
使用较少 。
第 2章 Java语言概述
表 2.1 整型数属性表
数据类型 占用长度 /bit 取值范围
byte 8 -27~27-1
short 16 -215~215-1
int 32 -231~231-1
long 64 -263~263-1
第 2章 Java语言概述
同 C语言一样, Java的整数也可以用十进制, 八进
制和十六进制来表示 。 八进制数以 O打头, 数字字符为
0~ 7;十六进制数用 Ox(OX)打头, 数字字符为 0~ 9、
a~ f或 A~ F。 一个整型数隐含为 int型, 如果需要 long
类型的数, 必须在该数后加上字母 l (L)。
2,浮点型
Java的浮点类型分为两种:单精度浮点数和双精度
浮点数,分别用关键字 float和 double来表示。与 C/C++
不同,它们的存放位长与机器无关。表 2.2给出了浮点
数的属性。
第 2章 Java语言概述
表 2.2 实型数属性表
数据类型 占用长度 /bit 取值范围
float 32 1.4e-045~3.4e+038
double 64 4.9e-324~1.8e+308
第 2章 Java语言概述
浮点数的隐含类型为 double型, 当我们要 float型的
数时, 就需要显示说明, 即在该数后跟一个字母 f,告
诉编译器该数为 float类型 。 不管是 double型还是 float型,
当对实数使用比较运算符, = =”时, 由于精度的取值
问题, 必须小心使用 。 单精度实数的有效位为:二进
制 23位, 十进制为 7位精度 。 双精度实数有效位为:二
进制 52位, 十进制为 15位精度, 多余位四舍五入 。 下
面是实型变量定义的例子:
float variable1; // variable1 为单精度浮点数
double variable2; //variable2 为双精度浮点数
第 2章 Java语言概述
3,布尔型
Java中布尔型变量只有两个值:真 (true)或假 (false)。
与 C/C++不同, 布尔型数据是独立的数据类型, 所以既
不能将整数值赋给布尔变量, 也不能将布尔类型的数
转换成整型或其他类型 。 布尔型数据在机器中位长为 8
位 。 布尔型数据的定义举例如下:
boolean sign=true;
上例定义 sign为布尔变量, 且初值为 true。
第 2章 Java语言概述
4,字符型
Java中字符型变量的类型为 char,它是一个 16位的
Unicode码, 而不是我们在 C中所见到的 8位 ASCII码 。
下面用关键字 char定义一个字符变量:
char a='b'; //定义一个初值为, b”的字符型变量
在 C语言中, 字符与无符号整数是一样的, 因而可
以混合运算, 不会产生什么问题 。 可是在 Java中, 由
于 Java没有无符号整型类型, 因而字符型数据不能用
作整数 。 但可以通过转换来进行变通, 如:
char a='a';
char b=(char) (a+1);
第 2章 Java语言概述
即字符变量 a转换为整数 97后与 1相加, 最后转换
成字符, b”。
同 C/C++相同, Java字符集中一些不能显示的控制
字符可以用转义序列来表示, 如表 2.3所示 。
第 2章 Java语言概述
表 2.3 转义字符表
转义字符 功能描述
\ddd 1~ 3位八进制所表示的字符
\uxxxx 1~ 4位十六进制所表示的字符
\' 单引号
\" 双引号
\\ 反斜杠
\r 回车
\n 换行
\f 换页
\t 水平制表
\b 退格
第 2章 Java语言概述
2.2.2 变量
变量是 Java程序中的基本存储单元 。 实际上, 数据
在存储器中地址的代号, 包括变量名, 变量类型和作
用域三个不同部分 。 与 C/C++相似, Java变量必须先定
义, 后使用 。
第 2章 Java语言概述
1,变量标识符
Java中标识符是类, 对象, 界面, 方法, 变量和
用户定义的对象的集合 。 为使非英语国家的程序员方
便地用自己的母语定义标识符, Java标识符采用
Unicode字符集, 可为任意长度 。 Java中规定, 标识符
必须以字母, 下划线 ( _ )或美元符 ( $ )为首字母, 后面
字符由一个或多个字母, 下划线, 美元符或数字组成 。
下面我们对 Java中两个特殊的标识符 ——注释和关键字
加以说明 。
第 2章 Java语言概述
1) 注释
注释用来解释程序的正文, 增强程序的可读性 。
它只是为程序起一个说明的作用, 在编译系统作词法
分析前会被忽略掉 。 Java语言提供了三种形式的注释:
// text:行注释, 从, //”到本行结束的所有字符均
作为注释而被忽略 。
/*text*/:多行注释, 从, /*”到, */”之间所有字符
被忽略 。
第 2章 Java语言概述
/**text */:这是 Java语言特有的注释, 同, /*”相
似, 表示从, /**”到, */”之间所有的字符均为注释 。
它只能紧邻在某一个声明之前使用, 作为该声明的注
释, 注释的内容被包含进 java.doc程序自动生成的文档
中 。
第 2章 Java语言概述
上面注释的使用中, 我们必须要注意的是, Java的
注释不允许有嵌套注释, 注释串不允许出现在字符值
或字符串内 。 下面举例说明:
/* try this /* again! // /* everybody,*/
// it's a comment /* another comment */
上两例均表示一个注释 。
System.out.println("Is this a comment?// delete me");
该语句输出为, Is this a comment?//delete me”,而
不是我们想当然的, Is this a comment?”。
第 2章 Java语言概述
2) 关键字
Java中的关键字是编译器预留的, 不能挪作他用,
如果用户拿关键字作为自己的变量标识符, 则会出错 。
下面我们给出 Java中的关键字 。
abstract boolean break byte byvalue
case cast catch char class
const continue default do double
else extends false final finally
第 2章 Java语言概述
float for future generic goto
if implements import instanceof int
Interface inner long native new
null operator outer package private
Protected public rest return short
static super switch synchronized this
Throw transient true try void
while var volatile
第 2章 Java语言概述
2,变量缺省初始值
任何一门编程语言中定义的变量都对应一个值,
不存在没有值的变量 。 当定义一个变量而没有对其初
始化时, 系统默认其初始值为缺省初始值 。 不同数据
类型的缺省初始值如表 2.4所示 。
第 2章 Java语言概述
表 2.4 变量的缺省初始值
类 型 缺省值
byte (byte)0
short (short)0
int 0
long 0L
float 0.0f
double 0.0d
char ‘\n0000’
boolean false
Object null
第 2章 Java语言概述
3,变量的作用域
我们知道, 变量在使用前必须先要进行声明, 其
基本格式为
[accesstype] variabletype variablename
[=value],[,variablename[=value]…];
例如:
protected float grade;
boolean sign;
第 2章 Java语言概述
在上面的描述中, 第一个参数为访问类型, 它是
可选项 。 Java 的 变 量访 问类 型有 四 种,public,
protected,private protected,private。 后面会对这四种
类型作详细说明 。 数据类型可以是基本的数据类型,
类和接口 。 变量的说明可在使用位置之前的任何地方
进行 。
在使用变量时, 需考虑其作用范围, 即作用域的
问题 。 从变量的定义格式我们可以知道, 确定变量的
作用域包含两个方面:一个是其访问类型;另一个为
变量在程序中声明的位置 。 Java中变量四种访问类型
的具体作用如表 2.5所示 。
第 2章 Java语言概述
表 2.5 变量访问类型的说明
访问类型 功能描述
public 能被包内和包外的任何类型访问
protected 可被该变量所在类的子类及同一包中的类访问
private protected 可被该变量所在类及其子类访问
private 只能被定义该变量的类中的方法访问
第 2章 Java语言概述
另一个影响变量作用域的因素是变量声明的位置 。
在程序中, 当我们用, { }”括起一段代码时, 相当于
定义了一个新的域层次 。 作用域层次的作用是判断一
个变量是否可以访问和在什么时候失去效用 。 与 C/C++
相同, 一个变量只有当它在当前的作用域层次或比它
更高的层次中被声明时, 才能在当前作用域层次中使
用访问, 一旦离开一个作用域层次, 在该层次中定义
的所有变量就不能被访问了 。
第 2章 Java语言概述
2.2.3 运算符及表达式
运算符是对一个或多个操作数进行某种特定运算
的标志符号 。 在 Java中, 运算符很丰富,有常用的算术
运算符, 逻辑运算符, 位运算符和对象操作运算符 。
如果我们按操作数的多少来分, 又有单目运算符, 两
目运算符及三目运算符 。 表达式是运算符, 常量和变
量的组合 。 在这节中, 先介绍运算符的基本概念, 然
后讨论表达式的用法 。
第 2章 Java语言概述
1,算术运算符
与 C/C++相似, Java算术运算符用于整型或实型数
的运算, 可分为一元运算符和二元运算符两种 。 一元
运算符如表 2.6所示 。
表 2.6 一元算术运算符表
运算符 用 法 功能描述
+ +OP 正值
? ?OP 负值
++ ++OP,OP++ 加 1(自增 )
?? ??OP,OP?? 减 1(自减 )
第 2章 Java语言概述
上表中, 自增, 自减运算符既可以放于操作数之
前, 也可以放于操作数之后, 这是初学者需注意的地
方 。 当放在操作数之前, 则是先进行自增 /自减运算,
再把其结果用于后继的操作;如果放在操作数之后,
则是先进行别的运算, 然后再进行自增 /自减运算 。 另
外, 自增 /自减运算符只能作用于变量, 而不能作用于
常量或表达式 。 看下面的例子:
int i=2;
int j=3;
int m=++j+i;
int k=m+i++;
第 2章 Java语言概述
在运行完上述四条指令后, i,j的值均加 1成为 3,
4,而 m,k的值变成了 6,8。 需要注意的是, 由于第
三条语句中出现了 ++j,故 m的值为 6,第四条语句中是
i++,所以 k的值为 8。 从上面的例子中, 可以知道, 自
增 /自减运算符使用灵活, 但容易造成副作用, 实际应
用时须十分小心 。 再看一个例子:
int i=2;
int j=3;
System.out.println(i+++j);
System.out.println(+++j);
第 2章 Java语言概述
当运行上述的四条指令时, 第三条指令的输出结
果为 5,而第四条指令出错 。 这是因为对于第三条指令
而言, 系统把 i+++j解释为 i++(+j),结果为 5,而第四条
指令被解释为 ++(+j),由于自增 /自减运算符不能作用
于表达式, 所以出错 。
Java的二元运算符有 +,?,*,/,%五种, 其用法
与 C/C++类似, 见表 2.7所示 。
第 2章 Java语言概述
表 2.7 二元运算符用法表
运算符 用 法 功能描述
+ OP1+OP2 加
? OP1?OP2 减
* OP1*OP2 乘
/ OP1/OP2 除
% OP1%OP2 求余
第 2章 Java语言概述
前四条运算符都是常用的算术运算, 第四条运算
符为取模运算, 即求两操作数相除的余数:当被除数
为正时, 结果为正, 当被除数为负数结果为负 。
实际应用中,算术运算的操作数常常具有不同的
类型,比如说,一个操作数为 int型,另一个操作数为
long型,一旦碰到这种情况,就需要进行类型的转换。
一般原则是保证结果的数据类型与精度最高的操作数
数据类型一致。转换规则如表 2.8所示。
第 2章 Java语言概述
表 2.8 类型转换规则
类型 1 类型 2 结 果
byte/short byte int
byte/short int int
byte/short/int long long
byte/short/int/long float float
byte/short/int/long/float double double
第 2章 Java语言概述
2,关系运算符
关系运算符用于两个值之间的关系比较, 其返回
值为布尔类型, 表 2.9给出了关系运算符的使用方法 。
表 2.9 关系运算符表
运算符 用 法 功能描述
> OP1>OP2 大于为真
>= OP1>=OP2 大于等于为真
< OP1<OP2 小于为真
<= OP1<=OP2 小于等于为真
= = OP1= =OP2 等于为真
! = OP1! =OP2 不等于为真
第 2章 Java语言概述
我们知道,在 C/C++中,真或假的值是用,1”或
,0”来表示的,而在 Java中关系运算符的结果则要么为
true,要么为 false。另外,在关系运算符的使用中,算
术类型只能与算术类型比较,布尔类型、复合类型也
只能与同类型相比较。
3,布尔运算符
与 C/C++不同, Java中, 逻辑运算符只能对布尔逻
辑型数据进行操作, 其返回值同样为逻辑型布尔值 。
其用法如表 2.10所示 。
第 2章 Java语言概述
表 2.10 逻辑运算符表
操作数 OP1 操作数 OP2 OP1&&OP2 OP1 || OP2 ! OP1
true true true true false
true false false true false
false false false false true
false true false true true
第 2章 Java语言概述
逻辑运算符中, 逻辑与 (&&)/逻辑或 (||)运算符为二
元操作符, 而逻辑非 (!)为一元操作符 。 下例是判断某
一年是否为闰年的程序, 我们只给出部分语句 。
...
int year;
if(year%4= =0&& year %100 ! =0 || year %400= =0)
System.out.println("所给年份 "+year+"是闰年 ! ");
...
第 2章 Java语言概述
4,位运算符
位运算符用来对二进制数进行测试, 置位或移位
等操作, 操作数只能为整型或字符型数据, 其用法如
表 2.11所示 。
对于上表中前四种运算符,其真值表如表 2.12所示。
第 2章 Java语言概述
表 2.11 位运算符表
运算符 用 法 功能描述
~ ~OP 按位取反
& OP1&OP2 按位与
| OP1|OP2 按位或
^ OP1^OP2 按位异或
>> OP1>>OP2 OP1右移 OP2位
<< OP1<<OP2 OP1左移 OP2位
>>> OP1>>>OP2 OP1无符号右移 OP2位
第 2章 Java语言概述
表 2.12 位操作真值表
OP1位值 OP2位值 ~OP1 OP1&OP2 OP1|OP2 OP1^OP2
0 0 1 0 0 0
1 0 0 0 1 1
0 1 1 0 1 1
1 1 0 1 1 0
第 2章 Java语言概述
下面我们看一个按位异或的例子:
...
int x=17;
int y=10;
System.out.println("The value is"+x^y);
...
该段程序的输出结果为 27,其实际运算如下:
x,10001
y,01010
^,11011=27
第 2章 Java语言概述
至于后面三种运算符, 均属于移位运算符 。 在不
产生溢出的情况下, 左移一位相当于乘 2,故有:
x*12=x* (8+4) =x<<3+x<<2
右移运算符, >>”将操作数移出右端的低位舍弃,
把最高位作为补位, 所以, 右移一位相当于除 2取商,
与左移相似, 有,
x/8=x>>3
运算符, >>>”是无符号右移, 不考虑最高位的符号
位, 所以补位均为 0。
第 2章 Java语言概述
例 2.1
import java.lang.Math;
public class Move {
public static void main(String args[]){
int x,y;
int n=1;
long result=0;
x=(int) (Math.random()*300);
y=(int)(Math.random()*400);
for(int i=0;i<=32;i++) {
if((y&n)!=0)
result+=x<<i;
n<<=1;
第 2章 Java语言概述
}
System.out.println("The result is"+result);
}
}
在本程序中, 我们利用类 Math中的随机函数
random()来产生两个整数, 由于该函数返回值为 double
型, 因而我们利用了强制类型转换来进行赋值 。 运行
结果为
System Output,The result is21357
System Output,The result is18655
第 2章 Java语言概述
5,赋值运算符
赋值运算符, =”把一个数据赋给一个变量, 其一
般形式为
variable_type variable_name=expression;
例如:
int x=100;
int y=200;
float z=100.0;
第 2章 Java语言概述
Java中赋值语句与 C/C++相似, 可以分为简单赋值
运算符和复合赋值运算符两类 。 比如, 上面的例子就
是简单的赋值语句 。 当赋值符号, =”前面加上不同的
运算符组成一些复杂的赋值语句后, 就成了复合赋值
运算符 。 如:
x/=2; // 等价于 x=x/2;
x%=4; // 等价于 x=x%4;
赋值运算符的基本用法可见表 2.13。
第 2章 Java语言概述
表 2.13 复合赋值运算符用法表
运算符 用 法 等价于
+= OP1+=OP2 OP1=OP1+OP2
?= OP2?=OP2 OP1=OP1?OP2
*= OP1*=OP2 OP1=OP1*OP2
/= OP1/=OP2 OP1=OP1/OP2
%= OP1%=OP2 OP1=OP1%OP2
|= OP1|=OP2 OP1=OP1|OP2
&= OP1&=OP2 OP1=OP1&OP2
^= OP1^=OP2 OP1=OP1^OP2
>>= OP1>>=OP2 OP1=OP1>>OP2
<<= OP1<<=OP2 OP1=OP1<<OP2
>>>= OP1>>>=OP2 OP1=OP1>>>OP2
第 2章 Java语言概述
6,条件运算符
条件运算符是一个三元运算符, 其一般形式为
expression? statement1, statement2;
其语义为:首先计算表达式 expression的值, 如果
该值为真 (true),则将 statement1的值作为整个表达式的
值, 反之, 将 statement2作为整个表达式的值 。 如:
max= x >y? x, y;
该语句取 x,y的最大值 。 需要注意的是, 该运算
符规定 statement1和 statement2需返回相同类型的数据,
且不能为 void。
第 2章 Java语言概述
7,对象运算符
Java中对对象的操作有专门的对象运算符
instanceof。它用来测试一个对象是否是某个类或其子
类的实例,若是则返回 true,反之返回 false。例如:
...
if(e.target instanceof MenuItem) {
String nam=(String) e.arg;
...}
该段代码功能是测试组件上产生的事件是否对应于
菜单 。
第 2章 Java语言概述
8,运算符的优先级
运算符是有优先级的, 它决定表达式中各运算执行的先
后顺序 。 总的来说, 运算符优先级具有如下规则:
(1) 一元运算符比二元运算符优先级高 。
(2) 算术运算符比关系运算符优先级高 。
(3) 关系运算符比按位运算符优先级高 。
(4) 大于和小于运算符比等于和不等于运算符优先级高 。
(5) 按位运算符比逻辑运算符优先级高 。
(6) 逻辑与 (&&)比逻辑或 (||)优先级高 。
(7) 赋值运算符优先级最低 。
第 2章 Java语言概述
表 2.14 运算符的优先级及结合性
运算符 优先级 结合性
[ ]( )
最高
最低
左向
++ ?? ! ~ instanceof 右向
New 右向
* / % 左向
+ ? 左向
>> >>> << 左向
<> <= >= 左向
== != 左向
& 左向
^ 左向
| 左向
&& 左向
|| 左向
,右向
= += ?= *= /= %= ^= 右向
&= /= <<= >>= >>>= 右向
,左向
第 2章 Java语言概述
9,表达式
表达式是由运算符和操作数组合而成的,包含常
量、变量、方法以及一个或多个运算符。一个表达式
包含的多个操作,其顺序是由各运算符的优先级和是
否有括号操作符决定。当表达式在完成运算之后,返
回一个值,其数据类型由参加运算的数据的类型决定。
第 2章 Java语言概述
2.3 流程控制语句
流程控制语句提供了控制程序执行步骤的基本手
段, 可以说是程序的核心部分 。 我们知道, 任何程序
决不会只是顺序地执行语句序列, 程序运行时需要同
用户进行交互, 需根据用户的输入决定执行序列, 这
就需有条件转移及循环执行 。 Java同其他编程语言一
样, 提供了许多流程控制语句 。 本节我们讨论其流程
控制语句的基本语法及特点 。
第 2章 Java语言概述
2.3.1 概述
Java所提供的流程控制语句几乎与 C/C++完全相
同 。 具体来说, Java的流程控制可通过如下一些语句
来实现:
① while和 do-while语句
② for语句
③ if-else语句
④ switch语句
⑤ 异常处理语句
⑥ 分支语句
第 2章 Java语言概述
Java与 C/C++之间的差别很细微, 可归纳为两点:
(1) 在 C语言中, 条件表达式可以是数值型, 而在
Java条件语句中, 条件表达式必须是布尔型, 不能是
数值 。
(2) Java取消了对 goto语句的支持 。 goto语句的使用
一直是程序设计者争论的话题, 这是因为 goto语句的
使用不仅降低了程序的可读性, 而且往往会带来一些
不可预测的错误 。
对于 Java中流程控制语句的使用情况,我们可通过
表 2.15来描述。
第 2章 Java语言概述
表 2.15 控制语句的用法
类 型 用法描述
if-else if(boolean)statement1;else statement2;
switch
switch(expression0)
{case expression1:statement1; …
case expressionN:statementN;
default:statementN+1; }
break Break [label];
continue Continue [lable];
return Return expression;
for for(expression1;expression2;expression3)statement;
while while(boolean)statement;
do-while
do
statement;
while(boolean);
label lable:statement;
第 2章 Java语言概述
2.3.2 条件语句
条件语句 if-else控制条件的转移 。 if语句对给定的
条件加以判断, 根据判定结果执行相应操作;如果表
达式为真, 执行 if语句体, 如果为假, 则执行 else后面
的语句体 。
if语句可以使程序根据一些条件有选择地执行语句。
比如可在程序中设置 boolean变量 DEBUG的值来打印调
试信息。如果 DEBUG是 true,程序就打印出调试信息;
反之就不打印。
第 2章 Java语言概述
具体的程序如下:
if (DEBUG)
{ System.out.println("DEBUG Information,x = " + x); }
上面是一个简单的 if语句的例子 。 总的说来, if语
句分为简单条件语句和复合条件语句, 其语法格式为
第 2章 Java语言概述
① 简单条件语句
if (condition ) 或 if (condition)
{ statement1;
statement; else
} statement2;
第 2章 Java语言概述
② 复合条件语句
if(condition1) statement1;
else if (condition2) statement2;
else if(condition3) statement3;
...
else statementN;
第 2章 Java语言概述
比如当程序需要根据不同的输入信息执行不同的操
作 (例如经常碰到的对话框的选项操作 )时, 可以使用 if
和 else语句来实现这个目的:
…
// response is either OK or Cancel depending
// on the button that the user pressed
…
if (response = = OK) {
// 在这里添加执行 OK动作的代码
} else {
// 在这里添加执行 Cancel动作的代码
}…
第 2章 Java语言概述
使用 Java复合条件语句时, 一个 if语句后可以跟任
意个 else if语句, 但只能有一个 else语句 。 例 2.2将学生
的考试成绩转换成不同的等级,90分以上为 A,80分以
上但小于 90分为 B,依次类推, F表示不及格 。
第 2章 Java语言概述
例 2.2
public class MyClass1{
public static void main(String[] args) {
int testscore = DialogBox.requestInt("Please input a int
number,");
//类 DialogBox见附录
char grade;
if (testscore >= 90) {
grade = 'A';
} else if (testscore >= 80) {
grade = 'B';
第 2章 Java语言概述
} else if (testscore >= 70) {
grade = 'C';
} else if (testscore >= 60) {
grade = 'D';
} else {
grade = 'F';
}
Transcript.println("Grade = " + grade);
//类 Transcript见附录, 以下同
}
}
第 2章 Java语言概述
程序运行时,会弹出一个对话框,如图 2.2所示。
如果我们在其中输入的值为 55,则结果为不及格 F,输
出如图 2.3所示。
图 2.2 图 2.3
第 2章 Java语言概述
我们在前面讨论运算符的时候知道, Java编程语言
支持运算符,?:,, 它不仅是 Java中惟一的三元运算
符, 也是一个简化的 if语句 。 下面看一段代码:
...
if (a>b)
{ System.out.println("The Max number is," + a); } else
{ System.out.println("The Max number is," + b); }
...
第 2章 Java语言概述
2.3.3 循环语句
编程过程中,我们往往会碰到循环控制。几乎所
有的实用程序都包含循环,而循环结构是程序设计的
基本结构之一,它和顺序结构、选择结构共同作为各
种复杂程序的基本构造单元。与 C/C++一样,Java提供
了三种格式的循环控制语句,while语句,do-while语句
和 for语句,下面我们分别加以介绍。
第 2章 Java语言概述
1,while 语句
while语句的功能是当条件成立时, 重复执行子语
句 。 while语句的语法为
while (expression)
{ statement; }
首先, while语句执行并检查条件表达式 expression,
它返回一个 boolean类型数 (true或者 false)。 如果表达式
返回 true,while语句执行语句 statement。 之后 while语
句继续测试条件表达式并执行直到条件返回 false。
第 2章 Java语言概述
使用循环语句须注意的是, 在循环体中必须有能
够对循环条件进行修改的语句, 否则会导致死循环 。
下面我们给出一个例子 WhileDemo。 此函数的功能
是:首先接收用户输入的字符串 (该字符串以字符 ‘ *’
结束 ),然后使用 while语句来测试字符串的各个字符,
并复制字符串到另一串中, 直到碰到字符 ‘ *’ 才结束 。
字符串的用法读者可参阅第四章 。
第 2章 Java语言概述
例 2.3
public class WhileDemo{
public static void main(String[] args) {
String sourceString = DialogBox.request("Please input a
string ended with
character * ");
StringBuffer resultString = new StringBuffer();
int i = 0;
char c = sourceString.charAt(i);
while (c != '*') {
第 2章 Java语言概述
resultString.append(c);
c = sourceString.charAt(++i);
}
Transcript.println("The source string is:");
Transcript.println(sourceString);
Transcript.println("The result string is:");
Transcript.println(resultString);
}
}
当我们输入字符串, Welcome to Java Wrold!*”时, 结果
如图 2.4所示 。
第 2章 Java语言概述
图 2.4
第 2章 Java语言概述
2,do-while 语句
如果需要循环执行的语句至少执行一次, 可使用 do-
while语句, 它实现, 直到型 until”结构, do-while的基本
格式为
do
{
statement;
} while (boolean_expression);
第 2章 Java语言概述
不像 while语句, do-while语句是先执行循环中的语
句再判断循环条件, 所以 do-while语句的循环体至少执
行一次 。 实际上, do-while语句完全可以与 while语句互
换, 比如例 2.3也可以改写成例 2.4所示的程序, 效果是
一样的 。
第 2章 Java语言概述
例 2.4
public class DoWhileDemo {
public static void main(String[] args) {
String sourceString = DialogBox.request("Please input a
string ended with
character * ");
StringBuffer resultString = new StringBuffer();
int i = 0;
char c = sourceString.charAt(i);
do {
第 2章 Java语言概述
resultString.append(c);
c = sourceString.charAt(++i);
} while (c != '*');
Transcript.println("The source string is:");
Transcript.println(sourceString);
Transcript.println("The result string is:");
Transcript.println(resultString);
}
}
第 2章 Java语言概述
3,for 语句
for语句是最标准的循环语句 。 与C /C++相同, 它
是 Java语言中最灵活的一种控制结构, 它有多种变形,
可实现不同的循环功能 。 for语句的一般格式为
for (初始条件;终止条件;增量 )
{ statement; }
初始条件是为循环变量置初值,它在循环开始的时
候就执行一次。终止条件决定循环是否继续,该条件
表达式在每次循环的时候均作判断,如表达式结果为
false,则循环结束。
第 2章 Java语言概述
量是循环一次增加多少 (即步长 )的表达式 。 括号内
的三个表达式均可以为空 。 实际上, 为了实现无限循
环, 这三个表达式都可以省略 。 例如:
...
for ( ; ; ) // 表示无限循环
{,.,}
例 2.5中使用了一个 for循环语句来输入/输出一个
数组 (数组的内容参见第 3章 )的所有元素 。
第 2章 Java语言概述
例 2.5
public class MyClass1 {
public static void main(String[] args) {
int[] Aintarray = new int[5];
for (int i=0;i<Aintarray.length;i++)
Aintarray[i]=i*i;
for (int i = 0; i < Aintarray.length; i++) {
Transcript.print(Aintarray[i] + " ");
}
Transcript.println();
}
}
第 2章 Java语言概述
图 2.5
第 2章 Java语言概述
2.3.4 switch开关语句
switch是 Java所提供的多分支选择语句 。 现实生活
中常常会碰到多种可能性的情况, 虽然可用复合条件
语句来处理, 但会使程序变得冗长繁琐, 可读性也会
降低 。 switch语句能够很方便地处理这些多种可能性 。
switch语句的一般格式如下:
switch (expression)
{
case constant1:
statement1;
break;
第 2章 Java语言概述
case constant2:
statement2;
break;
...
case constantN:
statementN;
break;
default:
statementN+1;
break;
}
第 2章 Java语言概述
上面结构中, 每条语句均用 break语句加以终止,
这是因为, 如果没有 break语句, 程序将继续执行下一
个 case语句, 直到结束 。 如果没有与常量相匹配的 case
语句, 则执行 default语句 。 switch表达式与 case常量表
达式的类型可为 byte,char,short,int及 long类型, 不
能是关系表达式和逻辑表达式 。
switch语句根据一个有序类型表达式有条件地执行
语句 。 例 2.6程序的功能是:接受用户输入的一个整型
变量 month(它的数值代表了月份 )。 然后根据此值显示
对应的月份 。
第 2章 Java语言概述
例 2.6
public class SwitchDemo {
public static void main(String[] args) {
int month = DialogBox.requestInt("Please input a int number
between 1-12,");
switch (month) {
case 1,System.out.println("Now is,January"); break;
case 2,System.out.println("Now is,February"); break;
case 3,System.out.println("Now is,March"); break;
case 4,System.out.println("Now is,April"); break;
第 2章 Java语言概述
case 5,System.out.println("Now is,May"); break;
case 6,System.out.println("Now is,June"); break;
case 7,System.out.println("Now is,July"); break;
case 8,System.out.println("Now is,August"); break;
case 9,System.out.println("Now is,September"); break;
case 10,System.out.println("Now is,October"); break;
case 11,System.out.println("Now is,November"); break;
case 12,System.out.println("Now is,December"); break;
default,System.out.println("You input a unvalid number! Try
again,"); break;
第 2章 Java语言概述
}
}
}
我们也可以使用 if语句来实现上面的程序, 但代码就显得
比较繁琐 。 这里我们给出部分代码:
int month = DiologBox.requestInt("Please input a int number
between 1-12,");
if (month == 1) {
System.out.println("Now is,January ");
} else if (month == 2) {
第 2章 Java语言概述
System.out.println("Now is,February ");
} else if (month ==3) {
System.out.println("Now is,March ");
} else if (month ==4) {
System.out.println("Now is,April ");
...
与例 2.6相比,上述代码的可读性明显要比使用
switch语句差。使用 if语句还是使用 switch语句可根据
可读性及其他因素来作决定。
第 2章 Java语言概述
if语句可以在更大范围进行选择, 而 switch只能在
变量为有序类型, 且提供给 case语句的数值惟一时才能
选择 。 总之, 使用 switch语句, 我们须注意如下事项:
(1) switch语句只能取代 if语句的部分功能, 因为其
只能对 switch后括号内表达式的值与常量进行比较, 而
if语句可作多种比较 。
(2) case 常量表达式出现次序可相互调换, 不影响
执行结果 。
第 2章 Java语言概述
(3) 括号内的表达式只能为整型或字符型 。
(4) 同一个 switch语句不能有两个 case常量值相等 。
(5) 每一步之后必须用 break语句终止, 否则失去开
关的效果 。
第 2章 Java语言概述
2.3.5 转移语句
转移语句是用来直接控制执行流程的语句 。 Java语
言提供了 3个转移语句,break,continue和 return语句 。
它们的功能就是改变 while,do-while,for及 switch语句
的正常运行 。 比如说, 我们在介绍 for语句的时候曾经
提到过死循环 for(; ;)的问题, 如果利用转移语句的
break语句, 就能达到改变循环顺序的目的, 从而跳出
死循环 。 下面我们对上述的三个转移语句分别加以介绍 。
第 2章 Java语言概述
1,break语句
break语句可以终止当前的循环和开关语句的执行,
接着执行后继的下一条指令 。 它的基本语法形式如下:
break [label];
其中,括号中的参数为标号,它为可选项。我们
在前面已经碰到过未带标号的 break语句。用未带标号
的 break语句终止 swtich语句,控制流程会马上转到
switch语句下方的语句。
第 2章 Java语言概述
例 2.7的功能是从一个给定的数组中查找某个指定的数
值:首先通过随机函数产生 10个随机数并显示出来,
然后通过接收窗口输入一个数,当数值被找到时,
break语句就会终止 for循环,控制流程就转到 for语句下
面的语句继续执行。程序如下:
第 2章 Java语言概述
例 2.7
public class MyClass1 {
public static void main(String[] args) {
int[] sourceArray = new int[10];
int searchfor = DialogBox.requestInt("Please input a int
number, ");
for (int i=0;i<sourceArray.length;i++)
sourceArray[i]=(int) (Math.random()*100);
Transcript.print("The number in array is,");
for (int i=0;i<sourceArray.length;i++)
Transcript.print(+sourceArray[i]+" ");
Transcript.println();
第 2章 Java语言概述
int i = 0;
boolean found = false;
for ( ; i < sourceArray.length; i++)
if (sourceArray[i] == searchfor) {
found = true;
break;
第 2章 Java语言概述
}
if (found)
Transcript.println("Found " + searchfor + " at index "
+ i);
else
Transcript.println("The number "+searchfor + " not be
found in the array");
}
}
该程序的运行结果如图 2.6,2.7所示 。
第 2章 Java语言概述
图 2.7
图 2.6
第 2章 Java语言概述
从本质上说,不带标号的 break语句用于终止内部
的 switch,for,while或者 do-while,如例 2.7,而带标
号的 break语句用于终止一个外部的语句,它通过 break
语句中所带的标号来实现。大家知道,C语言中的标号
语句一般是以冒号 (,)作为其语句表示,而且往往同
goto语句配合使用。虽然 Java不支持 goto语句,但其保
留了标号语句的使用。例 2.8与例 2.7有点相似,但它是
在一个二维数组中搜索一个数值,且是利用两个嵌套
的 for循环遍历了整个数组;当数值被找到时,标志形
式的 break语句就终止标志的 search语句。这个 search语
句位于 for循环外部。
第 2章 Java语言概述
例 2.8
public class MyClass2 {
public static void main(String[] args) {
int[][] sourceArray = new int[3][4];
int searchfor = DialogBox.requestInt("Please input a int
number, ");
for (int i=0;i<sourceArray.length;i++)
for(int j=0;j<sourceArray[i].length;j++)
sourceArray[i][j]=(int) (Math.random()*100);
Transcript.print("The number in array is,");
Transcript.println();
第 2章 Java语言概述
for (int i=0; i<sourceArray.length; i++)
for(int j=0; j<sourceArray[i].length; j++)
{
Transcript.print(+sourceArray[i][j]+" ");
if ((j/3)==1)
Transcript.println();
}
Transcript.println();
int i = 0;
int j = 0;
第 2章 Java语言概述
boolean found = false;
search:
for ( ; i < sourceArray.length; i++)
for (j = 0; j < sourceArray[i].length; j++)
if (sourceArray[i][j] == searchfor)
{ found = true;
break search;
}
if (found)
Transcript.println("Found " + searchfor + " at index " +
i+','+j);
else
第 2章 Java语言概述
Transcript.println("The number "+searchfor + " not be found
in the array");
}
}
如输入的数值为 9,则运行该程序后, 结果如图 2.8所示 。
第 2章 Java语言概述
图 2.8
第 2章 Java语言概述
2,continue 语句
与 break语句相反, continue语句的功能是跳过循环
体中随后的语句, 进行下一次循环的操作, 其一般使
用格式为
continue [lable];
其中, lable表示 continue语句也可以带标号 。
不带标号的 continue语句用于跳过当前的 for,while
或者 do-while循环 。
第 2章 Java语言概述
不带标号的 continue语句使用实例见例 2.9。 该例对给定
的字符串按某个字符进行匹配, 如果当前字母不是指
定的字符, continue语句就, 短路, 循环其他部分并开
始下一次匹配;如果成功, 程序就对计数器增 1,再将
对应的字符转换为大写字母, 最后输出相关的统计数
及转换后的字符串 。
第 2章 Java语言概述
例 2.9
public class MyClass1 {
public static void main(String[] args) {
String InStr =DialogBox.request("Please input a String,");
StringBuffer FindStr=new StringBuffer(InStr);
int numAs = 0;
for (int i = 0; i < FindStr.length(); i++)
{
if (FindStr.charAt(i) != 'a')
第 2章 Java语言概述
continue; // 跳过以下的本次循环语句, 开始下一次循环
numAs++;
FindStr.setCharAt(i,'A');
}
Transcript.println("Found " + numAs + " a's in the
string.");
Transcript.println(FindStr);
}
}
第 2章 Java语言概述
带标号的 continue语句将忽略外部给定标志的循环 。
例 2.10使用了一个嵌套的循环来搜索一个子字符串 。 在
该程序中使用了两个带标号的语句,, continue test;,
及, break test;, 。 当内部循环进行一次子串匹配且
不成功时, 则返回到外部循环开始下一次子串的匹配,
这就是, continue test;”语句的功能 。 反之, 当子串匹
配成功, 则, break test;, 语句保证程序从循环中终
止出来, 不再进行循环的操作 。 程序如下:
第 2章 Java语言概述
例 2.10
public class MyClass1 {
public static void main(String[] args) {
String SourceStr = DialogBox.request("Please input a String
searched,");;
String MatchStr = DialogBox.request("Please input a String
used to Match other
string,");
boolean foundIt = false;
test:
for (int i = 0; i <= SourceStr.length() - MatchStr.length(); i++)
第 2章 Java语言概述
{ int n = MatchStr.length();
int j = i;
int k = 0;
while (n-- != 0)
{
if (SourceStr.charAt(j++) !=
MatchStr.charAt(k++))
continue test;
}
foundIt = true;
break test;
}
第 2章 Java语言概述
Transcript.println("The Match result is,"+(foundIt? "Found
it", "Didn't find it"));
}
}
我们首先输入一字符串:, Shen Zhen University!”,
然后输入另一需匹配的串:, Shen”,则程序的运行结
果如图 2.9所示 。
第 2章 Java语言概述
图 2.9
第 2章 Java语言概述
3,return语句
return语句即为返回语句, 主要功能是从一个方法
返回到另一个方法 。 我们知道, 程序设计往往需要在
一个方法中调用另一个方法, 调用者称之为主调方法,
被调用的方法称为子方法, 这与 C++是一致的 。 当我
们从子方法返回到主方法时, 就得使用 return语句进行
说明 。 return语句的一般使用格式为
return [return_value];
第 2章 Java语言概述
从其格式中, 我们知道, 该指令可以返回值也可
以不返回值 。 如果不需要返回值, 说明子方法的返回
类型为 void,例如:
public int getMax(int x,int y)
{ return x>y?x, y ; }
此函数功能是比较两个整型数并返回其中的最大值 。