




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第2章Java语言概述2.1Java语言的优势与特点2.2Java语言的基本语法2.3流程控制语句1991年,Sun公司的JamesGosling等人,为在电视机、烤面包箱等家用消费类电子产品上进行交互式操作而开发了一个名叫Oak(一种橡树的名字)的语言。由于商业上的种种原因,这种语言始终没有投放到市场中,而且连Oak这个名字也成了问题,因为已经有上百家公司在使用这个名字,所以Sun公司根本无法将之注册为商标。最终,Sun公司决定,将这种语言改名为Java,并且在互联网上发布,免费提供下载。
当时,由于Oak的失败,有一些传谣者鼓吹Java这些字母代表"只是又一个无意义的缩写词"(JustAnotherValuelessAcronym)。Sun公司否认了这一说法,而且说Java是语言开发者在喝一种原产于印度尼西亚爪哇群岛的咖啡时,出于一时的灵感而碰撞出的火花。
几个月后,出乎所有人的意料,Java成为赛博空间最热门的话题。Java被越来越多的用户使用,受到越来越多的重视。上百个Java小应用程序在互联网上的多媒体应用中流行起来。一些著名的公司,如微软、IBM、苹果电脑、数字设备公司,纷纷购买了Java语言的使用权,随之大量出现了用Java编写的软件产品。Java受到业界的重视与好评。微软总裁比尔·盖茨在悄悄地观察了一段时间后,也感慨地说:"Java是长时间以来最卓越的程序设计语言"。Java为什么会在短时期内受到如此多的程序员欢迎?为什么在计算机行业竞争激烈的今天,一个计算机硬件公司开发出来的语言,会一下子得到几乎世界上各大计算机软、硬件公司的支持呢?
Java最重要的特征在于它的操作平台无关性,这是以往任何一种语言都不具备的特征。也就是说,用Java语言编写的程序可以在任何一台计算机上运行,而不管该计算机使用何种操作系统,要知道,这可是广大程序员的一个梦想。
其次,Java是一种面向对象的语言。长期以来,人们一直在设法争取问题空间同求解空间在结构上的一致,以使我们在分析、设计和实现程序时,同我们认识客观世界的过程尽可能一致,因此产生了面向对象的程序方法。Java就是这样一种面向对象的语言,不仅如此,它还代表了面向对象程序设计方法在目前的最高应用水平。对一个程序员来说,这意味着可以将注意力集中在应用程序的数据和处理数据的方法上,而无需过多地考虑处理过程。
此外,Java还是一种非常简单的语言。Java的前身Oak,是为家用电器产品设计的,只有简单易用才能推广开来,因此,这种语言被设计得简单而高效。程序员只需理解一些基本的概念,就可以用它编写适合各种情况的应用程序了。最后,安全性也成为Java受青睐的一个方面。因为在网络环境中,安全是需要认真考虑的一个问题。没有安全的保障,用户绝对不会从Internet上随意一个站点上下载一个Java小应用程序,并在自己的计算机上运行。Java语言提供了若干种安全机制来抵御病毒产生或侵入文件系统。这一点也让用户们非常放心。Java的出现确实给计算机行业吹来了一股清风;它带来了很多新鲜而有趣的思想和观念;它甚至改变了人们使用计算机的方式。就连环球信息网WWW的创始人也说:"计算机行业发展的下一个浪潮就是Java,并且很快就会发生。"
如今,在美国硅谷,不懂得Java的人是无法找到工作的。在我国,许多计算机权威人士都断言,谁先掌握了Java,谁就号准了世界的脉搏,就能在信息时代找到自己的立足之地。
研究机构EvansData公司最近公布的调查结果显示,Java将在2003年超过C/C++成为全球软件开发人员的首选语言。参加本次调查的编程人员来自60多个国家,他们中60%的人在2003年将更多地使用Java,所用时间超过使用C/C++或VB。公布本次调查结果的EvansData公司副总裁Garvin说,自该公司1998年首次开始跟踪Java的使用情况起,Java用户总数不断增加。她说:"Java在北美之外的发展更强劲。至少一半被调查的来自各国的开发人员目前使用Java。事实上,他们使用Java的平均时间由1999年的9.1%上升到目前的17.7%。"尽管最初存在由于Sun公司的专有立场和该公司与操作系统社区的矛盾而造成的有关Java的争议,但是Java不断作为技术"热点"蚕食C/C++市场。其主要原因是Java具有许多C++所没有的优点,如简单性、更好的内存管理和跨平台功能。相反,在过去三年里,C++在各国开发人员中的占有率减少。EvansData说,目前被调查的开发人员有25%的时间使用C++,而这一数字将在2002年进一步减少。但是这家市场研究机构仍认为C/C++由于其已经生成的巨大代码量,不可能很快消逝。
至于C#,一种与C++相似但与Microsoft.Net倡议密切相连,具备类似Java语言特性的新语言,这份调查显示,3/4的开发人员表示还没有采用它的计划。Garvin说,有可能采用C#的开发人员可能是那些已经使用某种Microsoft编程语言的用户。2.1Java语言的优势与特点Sun公司这样形容自己的Java语言:它是一种简单、面向对象、分布式、解释型、稳定、安全、结构中立、易移植、高性能、多线程的动态语言。这段长长的定语准确地描述了Java语言的基本特征,也道出了Java为何流行的秘密。
可以说,程序设计语言的优点,Java几乎全都拥有。从实际的应用开发来看,也确实如此。但有一点需注意的是,由于Java是经过编译器生成字节码后再通过解释器对其解释执行,其运行速度会比较慢。下面就上述的特点逐一进行阐述。1.简单性
Java是一种简单的语言。这点主要表现为简单易学,在形式上它和C/C++极为相似,而且其运行系统小(Java的基本解释器只有40KB,加上标准库和线程支持也不过215KB)。我们知道,C++中的结构、联合和类的概念重合之处很多,而Java只保留了类的概念,减少了复杂性。运算符重载是C++的一大特点,一度被认为简化了程序设计,但实际上用得非常少,作用也不大,反而加重了程序员的负担,Java把它也给去掉了。
多重继承一直是一个有争议的问题,赞成者认为它为面向对象语言带来了方便性和通用性,增加了语言的表达能力,反对者声称它是一个不必要的特征,容易混淆,难以使用,浪费机器资源,实际价值有限,所以Java把它也取消了,而带之以接口“interface"。Gosling同时认为,C++的预处理程序、标题文件、goto语句和隐式类型转换,都增加了程序的不可读性,容易出问题,所以全部给取消了。2.面向对象在程序的开发设计过程中,程序员一直在设法争取问题空间同求解空间在结构上尽可能一致,以使我们在分析、设计和实现程序时,同我们认识客观世界的过程尽可能地一致,因此产生了面向对象程序设计方法。所谓面向对象的设计方法,是基于信息隐藏和抽象数据类型概念,把系统中所有资源,如数据、模块以及系统都看成是对象。每个对象封装数据和方法,而方法实施对数据的处理,并且通过继承机制实现代码复用。
传统的面向对象语言各有不足,如C++语言,由于继承了C的大量特性,如独立的函数概念,因而变得复杂而难用,而纯粹的面向对象语言如Smalltalk、Eiffel,却是动态性有余,效率不高。Java完全具备面向对象的四大特点:封装、继承、多态和动态。其封装性比C++好,它没有全程变量,没有主函数main。在Java中绝大部分成员是对象,只有简单数字类型、字符类型、布尔类型除外,以便保持高性能。Java提供给用户一系列的类(class),一个或多个class可以组成一个包(package)。Java的class和C++的一样有层次结构,子类可以继承父类的属性和方法。Java类中方法均缺省为虚函数。Java的面向对象与许多语言都有相通之处,与C++自不必说,因为Java几乎是C++的一个子集,熟悉C++编程的人很快会习惯Java编程。学过Pascal的读者对Java可能也有似曾相识的感觉,因为Java的package和Pascal中的Unit非常相似,都是表示某些程序块的输入。运算符重载在C++中一向被认为是一种优雅的多态机制,但在实践中,人们发现,运算符重载会使程序变得难以理解,Java的设计者最后取消了运算符重载,只在字符串连接运算中留了一些运算符重载的痕迹,例如用“+”实现字符串的连接。Java语言面向对象结构的动态性很高,C++中,如果修改了某一个类,整个程序都得重新编译。在Java中,可以在类库中自由地加入新的方法和实例变量,而不影响用户的程序执行。虽然C++也可以实现这种动态性,但使用起来非常复杂,代价也很高。3.分布式
Java是一种面向对象的程序设计语言,它也支持网络上的应用程序,是一种分布式(distributed)程序设计语言。使用Java提供的类库,比如,可以方便地支持TCP/IP协议,完成各种层次上的网络连接。请看下面一个简单的ftp登录的例子:...FtpClientf_client;f_client=newFtpClient("hostname");f.login("anonymous","");f.binary();...
另外,Java提供一个Socket类,这个类可以提供可靠的流式网络连接。这样,我们可以非常方便地创建分布式的Client和Server应用程序。传统的网络编程是一件复杂的事情,但是通过Java提供的网络类库,可以轻易地构造出网络应用,如客户机/服务器应用,浏览器/服务器应用,大大简化了工作难度。正如Java的设计者Gosling所说,Java的设计就是为了“最大限度地利用网络”。4.解释型我们知道,Java的编译器产生的是字节代码,可把它理解为一种中间代码,而不是特定的机器码。该字节码必须运行在一个解释器上,所以说,Java是一种解释型语言。由于产生的是中间代码——字节代码,因而可达到与平台无关的目的,从而可高效地在不同平台之间传输。同时,该程序可在任何平台上运行,只要这个平台上安装了Java解释器和运行系统即可。在解释环境中,程序开发过程中标准的“链接”过程没有了,Java的“链接”实际上是把一个新类加载到当前的环境中,这和传统的程序开发过程中的编译、链接、测试有较大的区别。5.健壮性分布式计算环境要求软件具有高度的健壮性。C++程序员都知道其在稳定性方面的最大问题在于指针的使用和缺乏自动的内存管理。这使得程序员可能编写出在语法和语义上均正确,但却可能对系统产生巨大破坏作用的软件。Java是一种比C++还强的强壮型语言。它要求显式的方法声明,保证编译器可以发现方法调用错误。Gosling认为指针的主要作用在于数组和结构的访问及使用。Java的数组可以解决前者的问题,但加强了对数组下标的检查。结构的访问和使用可通过类及类的方法访问变量解决,因而可以取消指针的概念。Java语言稳定性的另一个方面是自动的内存管理。用过C/C++的读者知道,比如我们可以调用函数malloc()来进行内存的分配,但在使用完后,必须要对占用的资源进行释放,即再调用free()函数释放掉分配的内存,如果稍不小心,就可能造成系统故障或空间的浪费。Java中专门有一个后台垃圾自动收集程序——GarbageCollector。它以较低的线程优先级对存储器进行扫描,自动释放掉不再使用的存储碎片,从而使程序员不用再担心内存的使用,只是专注于程序的设计即可。
异常处理也是Java健壮性的一个方面。一般认为,异常处理是成熟语言的标志。在Java中,通过使用try/catch/finally语句,程序员可以把一组错误处理代码放在一个集中的地方统一处理,这可简化错误的处理及错误的恢复。6.安全性
Java的安全性和健壮性是紧密联系的,由于其主要应用于网络程序的开发,因而如果没有较高的安全性作为保障的话,用户从网络上下载程序将是非常危险的。正如我们前面所描述的,Java取消了指针,杜绝了不怀好意的程序对内存恶意篡改。
Java语言的安全机制基于“不存在可信任的代码”的概念。其运行环境提供了以下四级安全保障机制:①字节码校验器②类装载器③运行时内存布局④文件访问机制
当Java字节码进入解释器时,首先必须经过字节码校验器的检查。校验器就象一个忠诚的卫士,不能通过检查的一律不准入内。即使是Java编译器生成的完全正确的字节码,校验器也必须再次对其检查,因为Java程序的编译和解释执行期间,字节码可能会无意或恶意地被篡改过。然后,Java解释器将决定程序中类的内存布局,这就意味着不怀好意的程序无法预先知道一个类的内存布局结构,因而也就无法利用该信息来修改或破坏系统。
随后,类装载器负责把来自网络的类加载到单独的内存区域,类和类之间相互不会干扰。最后,客户端用户还可以限制从网络上加载的类只能访问某些被允许的系统,如文件和硬盘。所以,当这几种机制加在一起,再加上其他的增强办法,如传输过程中使用加密解密算法,程序中做上特殊的标记等,使得Java成为了最安全的系统之一。7.可移植性
Java语言的可移植性具有深远的意义,它不仅给软件开发者带来了“一次性开发”的方便,而且迎合了网络计算的思想。在Java以前,人们只是将Internet当作一个巨大的硬盘,里面有无数的静止信息。当Java出现后,Internet则变成了一个巨大的操作系统,Java就是这个系统的语言。用这个语言写的任何程序,如电子表格软件,存放在某台机器上,Internet网上的任何用户只要得到许可,就可以下载并运行这个程序,从而节省了大量的硬盘空间,也省去了管理的麻烦。Java的设计者采用了多种机制来保证可移植性,最主要的有:
(1)Java从本质上讲是解释型的,这意味着任何一台机器,只要配备了Java解释器,就可以运行Java程序。
(2)Java的数据类型在任何机器上都是一致的,它不支持特定硬件环境的数据类型。总之,Java的可移植性决定了它将成为未来网络环境的“世界语”。8.高性能由前所述,我们知道Java是一个解释型语言。按照系统结构的观点,解释型语言除不可能达到编译型语言的速度外,其他一些性能并不比编译型语言差。有人作过测试,Java程序的平均运算速度是C语言的1/20倍。为了解决高性能问题,Java的设计者正在努力开发出一种更具效率的编译器,这种编译器可以在运行时把Java的字节码翻译成特定CPU的机器码,从而使转化成机器码的字节码在性能上接近于C或C++。9.多线程
Java高性能的另一个方面是它的多线程能力,他可以同时运行多个线程,处理多个任务。多线程可称为“轻量级进程”,它有点像Unix下的进程概念,多线程即多个模块并行运行;通过消息协调操作;通过信号灯和锁保证关键模块的执行不被中断。线程之间可以共享内存和全局变量,比进程的开销要小得多,因此也可以将线程看作可以同时运行的函数。多个线程的并行执行,仿佛有多个CPU在运行。比如说,一个线程在执行复杂的计算,而另一个线程完成与用户的交互。用户不必停下来等待Java程序完成冗长的操作,所以,多线程能够增强用户的实时交互能力,提高程序的运行效率。
传统的语言程序中,多线程编程是相当繁琐的,因为同一时刻要发生许多事情,程序员必须考虑它们的执行顺序、同步管理、资源争用等情况。例如当使用C或C++语言开发多线程应用程序,首要的困难是要保证多个例程可被若干并发线程运行。如果一个例程改变了状态变量的值,那么一次只可能有一个线程执行。同时,它还需要程序员负责例程的锁定与释放,且非常容易形成“死锁”。Java还通过关键字synchronized来保证两个或更多的线程不会同时执行一个被声明为同步的方法,从而保证某些关键操作(如写数)顺利进行而不会被中断。当然,Java的同步策略也有问题,当被标记为synchronized的函数执行时间较长时,就可能造成很多线程在等待该同步函数,而阻止了程序的其他非同步部分的执行,降低了执行效率。2.2Java语言的基本语法
与C/C++相似,Java的数据类型可以分为两大类型:基本类型(简单数据类型)和引用类型(复合数据类型)。简单类型包括整型(integer)、浮点型(float)、字符型(char)及布尔型(boolean)。简单数据类型用户通常是不能修改的,它用来实现一些基本的数据类型。
复合数据类型有类(class)、接口(interface)和数组(array)。复合数据类型是用户根据用户的需要定义并实现其运算的类型。简单类型的数据在函数调用中是以传值方式进行的,而复合数据类型在函数调用中则是以传地址的方式进行的。Java的数据类型可用图2.1表示。
图2.1
整数类型byte、short、int、long
浮点类型float、double
字符型char
布尔类型boolean
类class
接口interface
数组array基本类型引用类型数据类型
变量是Java程序中的基本存储单元,它由类型和标识符构成。Java字符集支持扩展的16位字节码(Unicode字符集),提供多语言支持。表达式是常量、变量、方法调用以及一个或多个运算符的任意组合,是构成Java语言的基本单元。本节我们将介绍Java中简单数据类型、变量、表达式及运算符的基本内容。2.2.1数据类型
Java程序都是由数据和对数据进行的操作构成的。数据是计算机用的基本数据,数据类型决定了数据的取值范围和运算符号。
1.整型
Java语言的整型数据与C/C++相似,按照存储位的不同,分为byte、short、int、long四种,分别表示从8位到64位的整数。
表2.1列出了整型所占内存位数和取值范围。其中,int和long类型是最常用的类型,而byte类型经常用在字节码数据中,比如网络传输数据或进行二进制数据的输入/输出时。由于short类型在使用时要求数据的存储须先高字节后低字节,在某些机器中可能会出错,故使用较少。表2.1整型数属性表
数据类型
占用长度/bit
取值范围byte8-27~27-1short16-215~215-1int32-231~231-1long64-263~263-1
同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.2实型数属性表
数据类型
占用长度/bit
取值范围float321.4e-045~3.4e+038double644.9e-324~1.8e+308
浮点数的隐含类型为double型,当我们要float型的数时,就需要显示说明,即在该数后跟一个字母f,告诉编译器该数为float类型。不管是double型还是float型,当对实数使用比较运算符“==”时,由于精度的取值问题,必须小心使用。单精度实数的有效位为:二进制23位,十进制为7位精度。双精度实数有效位为:二进制52位,十进制为15位精度,多余位四舍五入。下面是实型变量定义的例子:
floatvariable1; //variable1为单精度浮点数
doublevariable2; //variable2为双精度浮点数3.布尔型
Java中布尔型变量只有两个值:真(true)或假(false)。与C/C++不同,布尔型数据是独立的数据类型,所以既不能将整数值赋给布尔变量,也不能将布尔类型的数转换成整型或其他类型。布尔型数据在机器中位长为8位。布尔型数据的定义举例如下:
booleansign=true;
上例定义sign为布尔变量,且初值为true。4.字符型
Java中字符型变量的类型为char,它是一个16位的Unicode码,而不是我们在C中所见到的8位ASCII码。下面用关键字char定义一个字符变量:
chara='b'; //定义一个初值为“b”的字符型变量在C语言中,字符与无符号整数是一样的,因而可以混合运算,不会产生什么问题。可是在Java中,由于Java没有无符号整型类型,因而字符型数据不能用作整数。但可以通过转换来进行变通,如:
chara='a';charb=(char)(a+1);
即字符变量a转换为整数97后与1相加,最后转换成字符“b”。同C/C++相同,Java字符集中一些不能显示的控制字符可以用转义序列来表示,如表2.3所示。表2.3转义字符表
转义字符
功能描述\ddd1~3位八进制所表示的字符\uxxxx1~4位十六进制所表示的字符\'
单引号\"
双引号\\
反斜杠\r
回车\n
换行\f
换页\t
水平制表\b
退格2.2.2变量变量是Java程序中的基本存储单元。实际上,数据在存储器中地址的代号,包括变量名、变量类型和作用域三个不同部分。与C/C++相似,Java变量必须先定义,后使用。1.变量标识符
Java中标识符是类、对象、界面、方法、变量和用户定义的对象的集合。为使非英语国家的程序员方便地用自己的母语定义标识符,Java标识符采用Unicode字符集,可为任意长度。Java中规定,标识符必须以字母、下划线(_)或美元符($)为首字母,后面字符由一个或多个字母、下划线、美元符或数字组成。下面我们对Java中两个特殊的标识符——注释和关键字加以说明。1)注释注释用来解释程序的正文,增强程序的可读性。它只是为程序起一个说明的作用,在编译系统作词法分析前会被忽略掉。Java语言提供了三种形式的注释:
//text:行注释,从“//”到本行结束的所有字符均作为注释而被忽略。
/*text*/:多行注释,从“/*”到“*/”之间所有字符被忽略。
/**text*/:这是Java语言特有的注释,同“/*”相似,表示从“/**”到“*/”之间所有的字符均为注释。它只能紧邻在某一个声明之前使用,作为该声明的注释,注释的内容被包含进java.doc程序自动生成的文档中。
上面注释的使用中,我们必须要注意的是,Java的注释不允许有嵌套注释,注释串不允许出现在字符值或字符串内。下面举例说明:
/*trythis/*again!///*everybody.*///it'sacomment/*anothercomment*/
上两例均表示一个注释。
System.out.println("Isthisacomment?//deleteme");
该语句输出为“Isthisacomment?//deleteme”,而不是我们想当然的“Isthisacomment?”。2)关键字
Java中的关键字是编译器预留的,不能挪作他用,如果用户拿关键字作为自己的变量标识符,则会出错。下面我们给出Java中的关键字。abstract boolean break byte byvaluecase cast catch char class const continue default do doubleelse extends false final finallyfloat for future generic gotoif implementsimportinstanceof intInterfaceinner long native newnull operator outer package privateProtectedpublic rest return shortstatic super switch synchronized thisThrow transient true tryvoidwhile var volatile2.变量缺省初始值任何一门编程语言中定义的变量都对应一个值,不存在没有值的变量。当定义一个变量而没有对其初始化时,系统默认其初始值为缺省初始值。不同数据类型的缺省初始值如表2.4所示。表2.4变量的缺省初始值
类型缺省值
byte(byte)0
short(short)0
int0
long0L
float0.0f
double0.0d
char‘\n0000’
booleanfalse
Objectnull3.变量的作用域我们知道,变量在使用前必须先要进行声明,其基本格式为
[accesstype]variabletypevariablename[=value],[,variablename[=value]…];
例如:
protectedfloatgrade;booleansign;
在上面的描述中,第一个参数为访问类型,它是可选项。Java的变量访问类型有四种:public、protected、privateprotected、private。后面会对这四种类型作详细说明。数据类型可以是基本的数据类型、类和接口。变量的说明可在使用位置之前的任何地方进行。在使用变量时,需考虑其作用范围,即作用域的问题。从变量的定义格式我们可以知道,确定变量的作用域包含两个方面:一个是其访问类型;另一个为变量在程序中声明的位置。Java中变量四种访问类型的具体作用如表2.5所示。表2.5变量访问类型的说明
访问类型
功能描述public能被包内和包外的任何类型访问protected可被该变量所在类的子类及同一包中的类访问privateprotected可被该变量所在类及其子类访问private只能被定义该变量的类中的方法访问
另一个影响变量作用域的因素是变量声明的位置。在程序中,当我们用“{}”括起一段代码时,相当于定义了一个新的域层次。作用域层次的作用是判断一个变量是否可以访问和在什么时候失去效用。与C/C++相同,一个变量只有当它在当前的作用域层次或比它更高的层次中被声明时,才能在当前作用域层次中使用访问,一旦离开一个作用域层次,在该层次中定义的所有变量就不能被访问了。2.2.3运算符及表达式运算符是对一个或多个操作数进行某种特定运算的标志符号。在Java中,运算符很丰富,有常用的算术运算符、逻辑运算符、位运算符和对象操作运算符。如果我们按操作数的多少来分,又有单目运算符、两目运算符及三目运算符。表达式是运算符、常量和变量的组合。在这节中,先介绍运算符的基本概念,然后讨论表达式的用法。1.算术运算符与C/C++相似,Java算术运算符用于整型或实型数的运算,可分为一元运算符和二元运算符两种。一元运算符如表2.6所示。表2.6一元算术运算符表
运算符
用法
功能描述++OP
正值−−OP
负值++++OP,OP++
加1(自增)−−−−OP,OP−−
减1(自减)
上表中,自增、自减运算符既可以放于操作数之前,也可以放于操作数之后,这是初学者需注意的地方。当放在操作数之前,则是先进行自增/自减运算,再把其结果用于后继的操作;如果放在操作数之后,则是先进行别的运算,然后再进行自增/自减运算。另外,自增/自减运算符只能作用于变量,而不能作用于常量或表达式。看下面的例子:
inti=2; intj=3;intm=++j+i; intk=m+i++;
在运行完上述四条指令后,i,j的值均加1成为3,4,而m,k的值变成了6,8。需要注意的是,由于第三条语句中出现了++j,故m的值为6,第四条语句中是i++,所以k的值为8。从上面的例子中,可以知道,自增/自减运算符使用灵活,但容易造成副作用,实际应用时须十分小心。再看一个例子:
inti=2;intj=3;System.out.println(i+++j);System.out.println(+++j);
当运行上述的四条指令时,第三条指令的输出结果为5,而第四条指令出错。这是因为对于第三条指令而言,系统把i+++j解释为i++(+j),结果为5,而第四条指令被解释为++(+j),由于自增/自减运算符不能作用于表达式,所以出错。
Java的二元运算符有+,?,*,/,%五种,其用法与C/C++类似,见表2.7所示。表2.7二元运算符用法表
运算符
用法
功能描述+OP1+OP2
加−OP1−OP2
减*OP1*OP2
乘/OP1/OP2
除%OP1%OP2
求余
前四条运算符都是常用的算术运算,第四条运算符为取模运算,即求两操作数相除的余数:当被除数为正时,结果为正,当被除数为负数结果为负。实际应用中,算术运算的操作数常常具有不同的类型,比如说,一个操作数为int型,另一个操作数为long型,一旦碰到这种情况,就需要进行类型的转换。一般原则是保证结果的数据类型与精度最高的操作数数据类型一致。转换规则如表2.8所示。表2.8类型转换规则
类型1
类型2
结果byte/shortbyteintbyte/shortintintbyte/short/intlonglongbyte/short/int/longfloatfloatbyte/short/int/long/floatdoubledouble2.关系运算符关系运算符用于两个值之间的关系比较,其返回值为布尔类型,表2.9给出了关系运算符的使用方法。
表2.9关系运算符表
运算符
用法
功能描述>OP1>OP2
大于为真>=OP1>=OP2
大于等于为真<OP1<OP2
小于为真<=OP1<=OP2
小于等于为真==OP1==OP2
等于为真!=OP1!=OP2
不等于为真
我们知道,在C/C++中,真或假的值是用“1”或“0”来表示的,而在Java中关系运算符的结果则要么为true,要么为false。另外,在关系运算符的使用中,算术类型只能与算术类型比较,布尔类型、复合类型也只能与同类型相比较。
3.布尔运算符与C/C++不同,Java中,逻辑运算符只能对布尔逻辑型数据进行操作,其返回值同样为逻辑型布尔值。其用法如表2.10所示。表2.10逻辑运算符表
操作数OP1操作数OP2OP1&&OP2OP1||OP2!OP1truetruetruetruefalsetruefalsefalsetruefalsefalsefalsefalsefalsetruefalsetruefalsetruetrue
逻辑运算符中,逻辑与(&&)/逻辑或(||)运算符为二元操作符,而逻辑非(!)为一元操作符。下例是判断某一年是否为闰年的程序,我们只给出部分语句。
...intyear;if(year%4==0&&year%100!=0||year%400==0)System.out.println("所给年份"+year+"是闰年!");...4.位运算符位运算符用来对二进制数进行测试、置位或移位等操作,操作数只能为整型或字符型数据,其用法如表2.11所示。对于上表中前四种运算符,其真值表如表2.12所示。
表2.11位运算符表
运算符
用法
功能描述~~OP
按位取反&OP1&OP2
按位与|OP1|OP2
按位或^OP1^OP2
按位异或>>OP1>>OP2OP1右移OP2位<<OP1<<OP2OP1左移OP2位>>>OP1>>>OP2OP1无符号右移OP2位表2.12位操作真值表OP1位值OP2位值~OP1OP1&OP2OP1|OP2OP1^OP2001000100011011011110110下面我们看一个按位异或的例子:
...intx=17;inty=10;System.out.println("Thevalueis"+x^y);...
该段程序的输出结果为27,其实际运算如下:
x:10001y:01010^:11011=27
至于后面三种运算符,均属于移位运算符。在不产生溢出的情况下,左移一位相当于乘2,故有:
x*12=x*(8+4)=x<<3+x<<2
右移运算符“>>”将操作数移出右端的低位舍弃,把最高位作为补位,所以,右移一位相当于除2取商,与左移相似,有:x/8=x>>3
运算符“>>>”是无符号右移,不考虑最高位的符号位,所以补位均为0。例2.1importjava.lang.Math;publicclassMove{publicstaticvoidmain(Stringargs[]){intx,y;intn=1;longresult=0;x=(int)(Math.random()*300);y=(int)(Math.random()*400);for(inti=0;i<=32;i++){if((y&n)!=0)result+=x<<i;n<<=1;}System.out.println("Theresultis"+result);}}
在本程序中,我们利用类Math中的随机函数random()来产生两个整数,由于该函数返回值为double型,因而我们利用了强制类型转换来进行赋值。运行结果为
SystemOutput: Theresultis21357SystemOutput: Theresultis186555.赋值运算符赋值运算符“=”把一个数据赋给一个变量,其一般形式为
variable_typevariable_name=expression;
例如:
intx=100;inty=200;floatz=100.0;Java中赋值语句与C/C++相似,可以分为简单赋值运算符和复合赋值运算符两类。比如,上面的例子就是简单的赋值语句。当赋值符号“=”前面加上不同的运算符组成一些复杂的赋值语句后,就成了复合赋值运算符。如:
x/=2;//等价于x=x/2;x%=4;//等价于x=x%4;
赋值运算符的基本用法可见表2.13。表2.13复合赋值运算符用法表运算符用法等价于+=OP1+=OP2OP1=OP1+OP2−=OP2−=OP2OP1=OP1−OP2*=OP1*=OP2OP1=OP1*OP2/=OP1/=OP2OP1=OP1/OP2%=OP1%=OP2OP1=OP1%OP2|=OP1|=OP2OP1=OP1|OP2&=OP1&=OP2OP1=OP1&OP2^=OP1^=OP2OP1=OP1^OP2>>=OP1>>=OP2OP1=OP1>>OP2<<=OP1<<=OP2OP1=OP1<<OP2>>>=OP1>>>=OP2OP1=OP1>>>OP26.条件运算符条件运算符是一个三元运算符,其一般形式为
expression?statement1:statement2;
其语义为:首先计算表达式expression的值,如果该值为真(true),则将statement1的值作为整个表达式的值,反之,将statement2作为整个表达式的值。如:
max=x>y?x:y;该语句取x,y的最大值。需要注意的是,该运算符规定statement1和statement2需返回相同类型的数据,且不能为void。7.对象运算符
Java中对对象的操作有专门的对象运算符instanceof。它用来测试一个对象是否是某个类或其子类的实例,若是则返回true,反之返回false。例如:
...if(e.targetinstanceofMenuItem){Stringnam=(String)e.arg;...}
该段代码功能是测试组件上产生的事件是否对应于菜单。8.运算符的优先级运算符是有优先级的,它决定表达式中各运算执行的先后顺序。总的来说,运算符优先级具有如下规则:(1)一元运算符比二元运算符优先级高。(2)算术运算符比关系运算符优先级高。(3)关系运算符比按位运算符优先级高。(4)大于和小于运算符比等于和不等于运算符优先级高。(5)按位运算符比逻辑运算符优先级高。(6)逻辑与(&&)比逻辑或(||)优先级高。(7)赋值运算符优先级最低。表2.14运算符的优先级及结合性运算符优先级结合性[]()最高
最低左向++−−!~instanceof右向New右向*/%左向+−左向>>>>><<左向<><=>=左向==!=左向&左向^左向|左向&&左向||左向?:右向=+=−=*=/=%=^=右向&=/=<<=>>=>>>=右向,左向9.表达式表达式是由运算符和操作数组合而成的,包含常量、变量、方法以及一个或多个运算符。一个表达式包含的多个操作,其顺序是由各运算符的优先级和是否有括号操作符决定。当表达式在完成运算之后,返回一个值,其数据类型由参加运算的数据的类型决定。2.3流程控制语句
流程控制语句提供了控制程序执行步骤的基本手段,可以说是程序的核心部分。我们知道,任何程序决不会只是顺序地执行语句序列,程序运行时需要同用户进行交互,需根据用户的输入决定执行序列,这就需有条件转移及循环执行。Java同其他编程语言一样,提供了许多流程控制语句。本节我们讨论其流程控制语句的基本语法及特点。2.3.1概述
Java所提供的流程控制语句几乎与C/C++完全相同。具体来说,Java的流程控制可通过如下一些语句来实现:①while和do-while语句②for语句③if-else语句④switch语句⑤异常处理语句⑥分支语句Java与C/C++之间的差别很细微,可归纳为两点:
(1)在C语言中,条件表达式可以是数值型,而在Java条件语句中,条件表达式必须是布尔型,不能是数值。
(2)Java取消了对goto语句的支持。goto语句的使用一直是程序设计者争论的话题,这是因为goto语句的使用不仅降低了程序的可读性,而且往往会带来一些不可预测的错误。对于Java中流程控制语句的使用情况,我们可通过表2.15来描述。表2.15控制语句的用法类型用法描述if-elseif(boolean)statement1;elsestatement2;switchswitch(expression0){caseexpression1:statement1;…caseexpressionN:statementN;default:statementN+1;}breakBreak[label];continueContinue[lable];returnReturnexpression;forfor(expression1;expression2;expression3)statement;whilewhile(boolean)statement;do-whiledostatement;while(boolean);labellable:statement;2.3.2条件语句条件语句if-else控制条件的转移。if语句对给定的条件加以判断,根据判定结果执行相应操作;如果表达式为真,执行if语句体,如果为假,则执行else后面的语句体。
if语句可以使程序根据一些条件有选择地执行语句。比如可在程序中设置boolean变量DEBUG的值来打印调试信息。如果DEBUG是true,程序就打印出调试信息;反之就不打印。
具体的程序如下:
if(DEBUG){System.out.println("DEBUGInformation:x="+x);}
上面是一个简单的if语句的例子。总的说来,if语句分为简单条件语句和复合条件语句,其语法格式为①简单条件语句if(condition)或 if(condition){ statement1;
statement; else} statement2;②复合条件语句if(condition1)statement1;
elseif(condition2)statement2;elseif(condition3)statement3; ...elsestatementN;
比如当程序需要根据不同的输入信息执行不同的操作(例如经常碰到的对话框的选项操作)时,可以使用if和else语句来实现这个目的:
…//responseiseitherOKorCanceldepending//onthebuttonthattheuserpressed
…if(response==OK){//在这里添加执行OK动作的代码
}else{//在这里添加执行Cancel动作的代码
}…
使用Java复合条件语句时,一个if语句后可以跟任意个elseif语句,但只能有一个else语句。例2.2将学生的考试成绩转换成不同的等级:90分以上为A,80分以上但小于90分为B,依次类推,F表示不及格。例2.2publicclassMyClass1{publicstaticvoidmain(String[]args){inttestscore=DialogBox.requestInt("Pleaseinputaintnumber:");//类DialogBox见附录chargrade;if(testscore>=90){grade='A';}elseif(testscore>=80){grade='B';}elseif(testscore>=70){grade='C';}elseif(testscore>=60){grade='D';}else{grade='F';}Transcript.println("Grade="+grade);//类Transcript见附录,以下同}}
程序运行时,会弹出一个对话框,如图2.2所示。如果我们在其中输入的值为55,则结果为不及格F,输出如图2.3所示。图2.2 图2.3
我们在前面讨论运算符的时候知道,Java编程语言支持运算符“?:”,它不仅是Java中惟一的三元运算符,也是一个简化的if语句。下面看一段代码:
...if(a>b){System.out.println("TheMaxnumberis:"+a);}else{System.out.println("TheMaxnumberis:"+b);}...2.3.3循环语句编程过程中,我们往往会碰到循环控制。几乎所有的实用程序都包含循环,而循环结构是程序设计的基本结构之一,它和顺序结构、选择结构共同作为各种复杂程序的基本构造单元。与C/C++一样,Java提供了三种格式的循环控制语句:while语句、do-while语句和for语句,下面我们分别加以介绍。1.while语句
while语句的功能是当条件成立时,重复执行子语句。while语句的语法为
while(expression){statement;}
首先,while语句执行并检查条件表达式expression,它返回一个boolean类型数(true或者false)。如果表达式返回true,while语句执行语句statement。之后while语句继续测试条件表达式并执行直到条件返回false。
使用循环语句须注意的是,在循环体中必须有能够对循环条件进行修改的语句,否则会导致死循环。下面我们给出一个例子WhileDemo。此函数的功能是:首先接收用户输入的字符串(该字符串以字符‘*’结束),然后使用while语句来测试字符串的各个字符,并复制字符串到另一串中,直到碰到字符‘*’才结束。字符串的用法读者可参阅第四章。例2.3publicclassWhileDemo{publicstaticvoidmain(String[]args){StringsourceString=DialogBox.request("Pleaseinputastringendedwithcharacter*");StringBufferresultString=newStringBuffer();inti=0;charc=sourceString.charAt(i);while(c!='*'){resultString.append(c);c=sourceString.charAt(++i);}Transcript.println("Thesourcestringis:");Transcript.println(sourceString);Transcript.println("Theresultstringis:");Transcript.println(resultString);}}当我们输入字符串“WelcometoJavaWrold!*”时,结果如图2.4所示。图2.42.do-while语句如果需要循环执行的语句至少执行一次,可使用do-while语句,它实现“直到型until”结构,do-while的基本格式为
do{statement;
}while(boolean_expression);
不像while语句,do-while语句是先执行循环中的语句再判断循环条件,所以do-while语句的循环体至少执行一次。实际上,do-while语句完全可以与while语句互换,比如例2.3也可以改写成例2.4所示的程序,效果是一样的。例2.4publicclassDoWhileDemo{publicstaticvoidmain(String[]args){StringsourceString=DialogBox.request("Pleaseinputastringendedwithcharacter*");StringBufferresultString=newStringBuffer();inti=0;charc=sourceString.charAt(i);do{
resultString.append(c);c=sourceString.charAt(++i);}while(c!='*');Transcript.println("Thesourcestringis:");Transcript.println(sourceString);Transcript.println("Theresultstringis:");Transcript.println(resultString);}}3.for语句
for语句是最标准的循环语句。与C/C++相同,它是Java语言中最灵活的一种控制结构,它有多种变形,可实现不同的循环功能。for语句的一般格式为
for(初始条件;终止条件;增量){statement;}
初始条件是为循环变量置初值,它在循环开始的时候就执行一次。终止条件决定循环是否继续,该条件表达式在每次循环的时候均作判断,如表达式结果为false,则循环结束。
量是循环一次增加多少(即步长)的表达式。括号内的三个表达式均可以为空。实际上,为了实现无限循环,这三个表达式都可以省略。例如:
...for(;;)
//表示无限循环
{...}
例2.5中使用了一个for循环语句
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 共同买房协议书有效
- 《知识 声音的强弱》(教学设计)-人教版(2012)音乐一年级上册
- 工伤补偿协议书模板
- 合伙投资协议书范本
- 报关单合同协议书号
- 本章复习与测试教学设计初中地理中图版七年级下册-中图版2012
- 2024-2025学年新教材高中英语 Unit 6 Space and beyond泛读 技能初养成(教用文档)说课稿 外研版选择性必修第四册
- 合同违约协议书
- 宅基地转让无效协议书
- 2024-2025学年新教材高中物理 第八章 机械能守恒定律 5 实验:验证机械能守恒定律(2)说课稿 新人教版必修2
- 2025 种植护理术中配合技巧课件
- 《组织行为学》课件-第1章 组织行为学概述
- 高炉大修总结课件
- 露天煤矿边坡课件
- 龙门吊吊装施工方案
- 2025年物理天津高考试卷及答案
- (2025秋新版)苏教版科学三年级上册全册教案
- 四川省土地开发项目预算定额标准
- 医院重点专科建设申报汇报
- 农村自用光伏安装合同范本
- 学校校友工作汇报
评论
0/150
提交评论