为了方便您阅读最新章节,请记住“闪文书库”网址 www.shanwen.com,注册会员收藏您喜爱的书籍
====>>>公告:晚上6点-11点高峰期,可能出现图片打开缓慢,如果太长时间没有打开,请刷新
第一卷第一章
??????
第一章Java概述
§1.1Java语言出现的背景、影响及应用前景
一、背景
最近一年多来,在Internet上出现的特别吸引人的事件就是Java语言和用Java编写的浏览器HotJava。
1991年,SUNMicroSystem公司的JameGosling、BillJoe等人,为在电视、控制烤面包箱等家用消费类电子产品上进行交互式操作而开发了一个名为Oak的软件(即一种橡树的名字),但当时并没有引起人们的注意,直到1994年下半年,Internet的迅猛发展,环球信息网WWW的快速增长,促进了Java语言研制的进展,使得它逐渐成为Internet上受欢迎的开发与编程语言,一些著名的计算机公司纷纷购买了Java语言的使用权,
如Mi-croSoft、IBM、Netscape、Novell、Apple、DEC、SGI等,因此,Java语言被美国的著名杂志PCMagazine评为1995年十大优秀科技产品,(计算机类就此一项入选),随之大量出现了用Java编写的软件产品,受到工业界的重视与好评,认为"Java是八十年代以来计算机界的一件大事",
微软总裁比尔·盖茨在悄悄地观察了一段时间后,不无感慨地说:"Java是长时间以来最卓越的程序设计语言",并确定微软整个软件开发的战略从PC单机时代向着以网络为中心的计算时代转移,而购买Java则是他的重大战略决策的实施部署。因此,Java的诞生必将对整个计算机产业发生深远的影响,对传统的计算模型提出了新的挑战。
SUNMicroSystem公司的总裁ScottMcNealy认为Java为Internet和WWW开辟了一个崭新的时代.
环球信息网WWW的创始人Berners-Lee说:"计算机事业发展的下一个浪潮就是Java,并且将很快会发生的"。看来,使用Java已成大势所趋!
MicroSoft和IBM两大公司都计划在Internet上销售用Java编写的软件。
Apple、HP、IBM、MicroSoft、Novell、SGI、SCO、Tandem等公司均计划将Java并入各自开发的操作系统,而负责开发并推广Java技术的SunSoft公司(这是SUN下属的一个子公司),将通过颁发许可证的办法来允许各家公司把Java虚拟机和Java的Applets类库嵌入他们开发的操作系统,这样各类开发人员就能更容易地选择多种平台来使用Java语言编程,不同的用户也就可以脱离Web浏览器来运行Java应用程序,这无疑是很受广大用户欢迎的,也为Java语言的应用开拓了极为广阔的前景。(当然,各类JavaOS之间的兼容性必须得到重视,好在JavaSoft已保证将监督这种兼容性)。
另外,由JavaSoft推出的完全用Java编写的Internet上新型浏览器HotJava,比去年alpha版更为实用,不仅能编制动态的应用软件,而且能编制完整的成套桌面应用软件,将来还会提供更多的能帮助编制动态应用软件的模块,显然,这也是为Java的应用提供了有力的例证。
今年6月7日,由SUN公司和台湾经济事务部信息发展局,台湾信息技术研究所等单位牵头,成立了一个"Java联盟",参加的有22个在台湾相当著名的计算机公司,并在台北建立一个"Java开发中心",在新竹建立一个"Java语言实验室",以掀起台湾开发与应用Java语言的热潮。
香港则在今年4月就举行了全岛的Java杯比赛,在计算机界掀起了学习Java的热潮(尤其是在大学生们中,出现了一批Java迷)。
有人预言:Java将是网络上的"世界语",今后所有的用其他语言编写的软件统统都要用Java语言来改写。
二、Java语言对软件开发技术的影响
工业界不少人预言:"Java语言的出现,将会引起一场软件革命",这是因为传统的软件往往都是与具体的实现环境有关,换了一个环境就需要作一番改动,耗时费力,而Java语言能在执行码(二进制码)上兼容,这样以前所开发的软件就能运行在不同的机器上,只要所用的机器能提供Java语言解释器即可。
Java语言将对未来软件的开发产生影响,可从如下几个方面考虑:
1软件的需求分析:可将用户的需求进行动态的、可视化描述,以提供设计者更加直观的要求。而用户的需求是各色各样的,不受地区、行业、部门、爱好的影响,都可以用Java语言描述清楚。
2软件的开发方法:由于Java语言的面向目标的特性,所以完全可以用O-O的技术与方法来开发,这是符合最新的软件开发规范要求的。
3Java语言的动画效果远比GUI技术更加逼真,尤其是利用WWW提供的巨大动画资源空间,可以共享全世界的动态画面的资源。
4软件最终产品:用Java语言开发的软件可以具有可视化、可听化、可操作化的效果,这要比电视、电影的效果更为理想,因为它可以做到"即时、交互、动画与动作",要它停就停,要它继续就继续,而这是在电影与电视播放过程中难以做到的。
5其它:使用Java语言对开发效益、开发价值都有比较明显的影响。
三、工业界对Java语言的评价
1996年5月29~31日,在美国旧金山召开了一个全世界Java语言开发者大会,(JavaOneDeveloperConfer-ence),出席会议的多达6500多人,来自工业界的超过一半,有人评价说:"这是近年来计算机界最光辉的一次盛会",一些工业界的老总们相当看好Java语言,认为它的使用将会引起一场软件革命。从软件的设计风格、设计方法、设计目标到设计过程,都会产生彻底的变革,"甚至会改变此星球的生活方式"。
在这次会上,Java的创始人之一JamesGosling说:"Java不仅仅只是applets,它能做任何事情",Dta咨询公司的高级软件工程师RichKadel说:"Java不仅仅是一种程序设计语言,更是现代化软件再实现的基础;Java还是未来新型OS的核心;将会出现Java芯片;将构成各种应用软件的开发平台与实现环境,是人们必不可少的开发工具"。
由于各界都看好它,因此,各大公司都纷纷表示支持Java,Intel、Xerox公司声言将把Java嵌入到他们的产品中去。就连华尔街金融界也在投入资金人力用Java开发电子贸易、金融软件。
所以有人说:"现在第三方的开发商都团结在Java大旗周围了!",纷纷推出用Java开发的各种软件产品,以期尽快地占领市场。
四、Java语言的应用前景
Java语言有着广泛的应用前景,大体上可以从以下几个方面来考虑其应用:
1所有面向对象的应用开发,包括面向对象的事件描述、处理、综合等;
2计算过程的可视化、可操作化的软件的开发;
3动态画面的设计,包括图形图像的调用;
4交互操作的设计(选择交互、定向交互、控制流程等);
5Internet的系统管理功能模块的设计,包括Web页面的动态设计、管理和交互操作设计等;
6Intranet(企业内部网)上的软件开发(直接面向企业内部用户的软件);
7与各类数据库连接查询的SQL语句实现;
8其它应用类型的程序。
§1.2Java的特点
Java是一个广泛使用的网络编程语言,它是一种新的计算概念。
首先,作为一种程序设计语言,它简单、面向对象、不依赖于机器的结构、具有可移植性、鲁棒性、安全性、并且提供了并发的机制、具有很高的性能。
其次,它最大限度地利用了网络,Java的小应用程序(applet)可在网络上传输而不受CPU和环境的限制。另外,Java还提供了丰富的类库,使程序设计者可以很方便地建立自己的系统。
下面我们分别从这三个方面来讨论Java的特点,然后通过把Java与C,C++相比进一步指出它所具有的优点。
一、Java语言
Java语言有下面一些特点:简单、面向对象、分布式、解释执行、鲁棒、安全、体系结构中立、可移植、高性能、多线程以及动态性。
1.简单性
Java语言是一种面向对象的语言,它通过提供最基本的方法来完成指定的任务,只需理解一些基本的概念,就可以用它编写出适合于各种情况的应用程序。Java略去了运算符重载、多重继承等模糊的概念,并且通过实现自动垃圾收集大大简化了程序设计者的内存管理工作。另外,Java也适合于在小型机上运行,它的基本解释器及类的支持只有40KB左右,加上标准类库和线程的支持也只有215KB左右。库和线程的支持也只有215KB左右。
2.面向对象
Java语言的设计集中于对象及其接口,它提供了简单的类机制以及动态的接口模型。对象中封装了它的状态变量以及相应的方法,实现了模块化和信息隐藏;而类则提供了一类对象的原型,并且通过继承机制,子类可以使用父类所提供的方法,实现了代码的复用。
3.分布性
Java是面向网络的语言。通过它提供的类库可以处理TCP/IP协议,用户可以通过URL地址在网络上很方便地访问其它对象。
4.鲁棒性
Java在编译和运行程序时,都要对可能出现的问题进行检查,以消除错误的产生。它提供自动垃圾收集来进行内存管理,防止程序员在管理内存时容易产生的错误。通过集成的面向对象的例外处理机制,在编译时,Java提示出可能出现但未被处理的例外,帮助程序员正确地进行选择以防止系统的崩溃。另外,Java在编译时还可捕获类型声明中的许多常见错误,防止动态运行时不匹配问题的出现。
5.安全性
用于网络、分布环境下的Java必须要防止病毒的入侵。Java不支持指针,一切对内存的访问都必须通过对象的实例变量来实现,这样就防止程序员使用"特洛伊"木马等欺骗手段访问对象的私有成员,同时也避免了指针操作中容易产生的错误。
6.体系结构中立
Java解释器生成与体系结构无关的字节码指令,只要安装了Java运行时系统,Java程序就可在任意的处理器上运行。这些字节码指令对应于Java虚拟机中的表示,Java解释器得到字节码后,对它进行转换,使之能够在不同的平台运行。
7.可移植性
与平台无关的特性使Java程序可以方便地被移植到网络上的不同机器。同时,Java的类库中也实现了与不同平台的接口,使这些类库可以移植。另外,Java编译器是由Java语言实现的,Java运行时系统由标准C实现,这使得Java系统本身也具有可移植性。
8.解释执行
Java解释器直接对Java字节码进行解释执行。字节码本身携带了许多编译时信息,使得连接过程更加简单。
9.高性能
和其它解释执行的语言如BASIC、TCL不同,Java字节码的设计使之能很容易地直接转换成对应于特定CPU的机器码,从而得到较高的性能。
10.多线程
多线程机制使应用程序能够并行执行,而且同步机制保证了对共享数据的正确操作。通过使用多线程,程序设计者可以分别用不同的线程完成特定的行为,而不需要采用全局的事件循环机制,这样就很容易地实现网络上的实时交互行为。
11.动态性
Java的设计使它适合于一个不断发展的环境。在类库中可以自由地加入新的方法和实例变量而不会影响用户程序的执行。并且Java通过接口来支持多重继承,使之比严格的类继承具有更灵活的方式和扩展性。
二、JavaApplet
Java语言的特性使它可以最大限度地利用网络。Applet是Java的小应用程序,它是动态、安全、跨平台的网络应用程序。JavaApplet嵌入HTML语言,通过主页发布到Internet。网络用户访问服务器的Applet时,这些Applet从网络上进行传输,然后在支持Java的浏览器中运行。由于Java语言的安全机制,用户一旦载入Applet,就可以放心地来生成多媒体的用户界面或完成复杂的计算而不必担心病毒的入侵。虽然Applet可以和图像、声音、动画等一样从网络上下载,但它并不同于这些多媒体的文件格式,它可以接收用户的输入,动态地进行改变,而不仅仅是动画的显示和声音的播放。
三、丰富的类库
Java提供了大量的类以满足网络化、多线程、面向对象系统的需要。
1.语言包提供的支持包括字符串处理、多线程处理、例外处理、数学函数处理等,可以用它简单地实现Java程序的运行平台。
2.实用程序包提供的支持包括哈希表、堆栈、可变数组、时间和日期等。
3.输入输出包用统一的"流"模型来实现所有格式的I/O,包括文件系统、网络、输入/出设备等。
4.低级网络包用于实现Socket编程。
5.抽象图形用户接口包实现了不同平台的计算机的图形用户接口部件,包括窗口、菜单、滚动条、对话框等,使得Java可以移植到不同平台的机器。
6.网络包支持Internet的TCP/IP协议,提供了与Internet的接口。它支持URL连接,WWW的即时访问,并且简化了用户/服务器模型的程序设计。
四、Java和C、C++
对于变量声明、参数传递、操作符、流控制等,Java使用了和C、C++相同的传统,使得熟悉C、C++的程序员能很方便地进行编程。同时,Java为了实现其简单、鲁棒、安全等特性,也摒弃了C和C++中许多不合理的内容。
1.全局变量
Java程序中,不能在所有类之外定义全局变量,只能通过在一个类中定义公用、静态的变量来实现一个全局变量。例如:
ClassGlobalVar{
publicstaticglobal_var;
}
在类GlobalVar中定义变量global_var为publicstat-ic,使得其它类可以访问和修改该变量。
Java对全局变量进行了更好的封装。而在C和C++中,依赖于不加封装的全局变量常常造成系统的崩溃。
2.Goto
Java不支持C、C++中的goto语句,而是通过例外处理语句try,Catch,final等来代替C、C++中用goto来处理遇到错误时跳转的情况,使程序更可读且更结构化。
3.指针
指针是C、C++中最灵活,也是最容易产生错误的数据类型。由指针所进行的内存地址操作常会造成不可预知的错误,同时通过指针对某个内存地址进行显式类型转换后,可以访问一个C++中的私有成员,从而破坏安全性,造成系统的崩溃。而Java对指针进行完全的控制,程序员不能直接进行任何指针操作,例如把整数转化为指针,或者通过指针释放某一内存地址等。同时,数组作为类在Java中实现,良好地解决了数组访问越界这一C、C++中不作检查的错误。
4.内存管理
在C中,程序员通过库函数malloc()和free()来分配和释放内存,C++中则通过运算符new和delete来分配和释放内存。再次释放已释放的内存块或未被分配的内存块,会造成系统的崩溃;同样,忘记释放不再使用的内存块也会逐渐耗尽系统资源。而在Java中,所有的数据结构都是对象,通过运算符new为它们分配内存堆。通过new得到对象的处理权,而实际分配给对象的内存可能随程序运行而改变,Java对此自动地进行管理并且进行垃圾收集,有效防止了由于程序员的误操作而导致的错误,并且更好地利用了系统资源。
5.数据类型的支持
在C、C++中,对于不同的平台,编译器对于简单数据类型如int,float等分别分配不同长度的字节数,例如:int在IBMPC中为16位,在VAX-11中为32位,这导致了代码的不可移植性,但在Java中,对于这些数据类型总是分配固定长度的位数,如对int型,它总占32位,这就保证了Java的平台无关性。
6.类型转换
在C、C++中,可以通过指针进行任意的类型转换,常常带来不安全性,而Java中,运行时系统对对象的处理要进行类型相容性检查,以防止不安全的转换。
7.头文件
C、C++中用头文件来声明类的原型以及全局变量、库函数等,在大的系统中,维护这些头文件是很困难的。而Java不支持头文件,类成员的类型和访问权限都封装在一个类中,运行时系统对访问进行控制,防止对私有成员的操作。同时,Java中用import语句来与其它类进行通讯,以便使用它们的方法。
8.结构和联合
C、C++中的结构和联合中所有成员均为公有,这就带来了安全性问题。Java中不包含结构和联合,所有的内容都封装在类中。
9.预处理
C、C++中用宏定义来实现的代码给程序的可读性带来了困难。在Java中,不支持宏,它通过关键字final来声明一个常量,以实现宏定义中广泛使用的常量定义。
§1.3简单的Java程序
下面我们先介绍两个简单的Java程序,并对其进行分析。
例1.1.
publicclassHelloWorldApp{//anapplication
publicstaticvoidmain(Stringargs[]){
System.out.println("HelloWorld!");
}
}
本程序的作用是输出下面一行信息:
HelloWorld!
程序中,首先用保留字class来声明一个新的类,其类名为HelloWorldApp,它是一个公共类(public)。整个类定义由大括号{}括起来。在该类中定义了一个main()方法,其中public表示访问权限,指明所有的类都可以使用这一方法;static指明该方法是一个类方法,它可以通过类名直接调用;void则指明main()方法不返回任何值。对于一个应用程序来说,main()方法是必需的,而且必须按照如上的格式来定义。Jave解释器在没有生成任何实例的情况下,以main()作为入口来执行程序。Jave程序中可以定义多个类,每个类中可以定义多个方法,但是最多只能有一个公共类,main()方法也只能有一个,作为程序的入口。main()方法定义中,括号()中的Stringargs[]是传递给main()方法的参数,参数名为args,它是类String的一个实例,参数可以为0个或多个,每个参数用"类名参数名"来指定,多个参数间用逗号分隔。在main()方法的实现(大括号中),只有一条语句:
System.out.println("HelloWorld!");它用来实现字符串的输出,这条语句实现与C语言中的printf语句和C++中cout<<语句相同的功能。另外,//后的内容为注释。
现在我们可以运行该程序。首先把它放到一个名为HelloWorldApp.java的文件中,这里,文件名应和类名相同,因为Java解释器要求公共类必须放在与其同名的文件中。然后对它进行编译:
C:\>javacHelloWorldApp.java
编译的结果是生成字节码文件HelloWorldApp.class。最后用java解释器来运行该字节码文件:
C:\>javaHelloWorldApp
结果在屏幕上显示HelloWorld!
我们再来看下面的一个例子:例1.2
importjava.awr.*;
importjava.applet.*;
publicclassHelloWorldAppletextendsApplet{//anapplet
publicvoidpaint(Graphicsg){
g.drawString("HelloWorld!",20,20);
}
}
这是一个简单的Applet(小应用程序)。程序中,首先用import语句输入java.awr和java.applet下所有的包,使得该程序可能使用这些包中所定义的类,它类似于C中的#include语句。然后声明一个公共类HelloWorldApplet,用extends指明它是Applet的子类。在类中,我们重写父类Ap-plet的paint()方法,其中参数g为Graphics类,它表明当前作画的上下文。在paint()方法中,调用g的方法drawString(),在坐标(20,20)处输出字符串""HelloWorld!",其中坐标是用象素点来表示的。
这个程序中没有实现main()方法,这是Applet与应用程序Application(如例1)的区别之一。为了运行该程序,首先我们也要把它放在文件HelloWorldApplet.java中,然后对它进行编译:
C:\>javacHelloWorldApplet.java
得到字节码文件HelloWorldApplet.class。由于Applet中没有main()方法作为Java解释器的入口,我们必须编写HTML文件,把该Applet嵌入其中,然后用appletviewer来运行,或在支持Java的浏览器上运行。它的<HTML>文件如下:
<HTML>
<HEAD>
<TITLE>AnApplet</TITLE>
</HEAD>
<BODY>
<appletcode="HelloWorldApplet.class"width=200height=40>
</applet>
</BODY>
</HTML>
其中用<applet>标记来启动HelloWorldApplet,code指明字节码所在的文件,width和height指明applet所占的大小,我们把这个HTML文件存入Example.html,然后运行:
C:\>appleviewerExample.html
这时屏幕上弹出一个窗口,其中显示HelloWorld!,显示结果如图:
从上述例子中可以看出,Java程序是由类构成的,对于一个应用程序来说,必须有一个类中定义main()方法,而对applet来说,它必须作为Applet的一个子类。在类的定义中,应包含类变量的声明和类中方法的实现。Java在基本数据类型、运算符、表达式、控制语句等方面与C、C++基本上是相同的,但它同时也增加了一些新的内容,在以后的各章中,我们会详细介绍。本节中,只是使大家对Java程序有一个初步的了解。
第二章数据类型
§2.1数据类型
数据类型指明了变量或表达式的状态和行为。Java的数据类型如下所示:
Java不支持C、C++中的指针类型、结构体类型和共用体类型。
本章我们主要介绍简单类型。
§2.2常量与变量
一、常量
Java中的常量值是用文字串表示的,它区分为不同的类型,如整型常量123,实型常量1.23,字符常量-a-,布尔常量true、false以及字符串常量"Thisisaconstantstring."。
与C、C++不同,Java中不能通过#define命令把一个标识符定义为常量,而是用关键字final来实现,如
finaldoublePI=3.14159(有关final的用法见[6.2.3])。
二、变量
变量是Java程序中的基本存储单元,它的定义包括变量名、变量类型和作用域几个部分。
①变量名是一个合法的标识符,它是字母、数字、下划线或美元符"$"的序列,Java对变量名区分大小写,变量名不能以数字开头,而且不能为保留字。合法的变量名如:myName、value-1、dollar$等。非法的变量名如:2mail、room#、class(保留字)等,变量名应具有一定的含义,以增加程序的可读性。
②变量类型可以为上面所说的任意一种数据类型。
③变量的作用域指明可访问该变量的一段代码。声明一个变量的同时也就指明了变量的作用域。按作用域来分,变量可以有下面几种:局部变量、类变量、方法参数、例外处理参数。
局部变量在方法或方法的一块码中声明,它的作用域为它所在的代码块(整个方法或方法中的某块代码)。
类变量在类中声明,而不是在类的某个方法中声明,它的作用域是整个类。
方法参数传递给方法,它的作用域就是这个方法。
例外处理参数传递给例外处理代码,它的作用域就是例外处理部分。
在一个确定的域中,变量名应该是唯一的。通常,一个域用大括号{}来划定。
④变量的声明格式为:
typeidentifier[=value][,identifier[=value]…];
例如:inta,b,c;
doubled1,d2=0.0;
其中,多个变量间用逗号隔开,d2=0.0对实型变量d2赋初值0.0,只有局部变量和类变量是可以这样赋初值的,而方法参数和例外处理参数的变量值是由调用者给出的。
§2.3整型数据
一、整型常量:
与C,C++相同,Java的整常数有三种形式:
①十进制整数,如123,-456,0
②八进制整数,以0开头,如0123表示十进制数83,-011表示十进制数-9。
③十六进制整数,以0x或0X开头,如0x123表示十进制数291,-0X12表示十进制数-18。
整型常量在机器中占32位,具有int型的值,对于long型值,则要在数字后加L或l,如123L表示一个长整数,它在机器中占64位。
二、整型变量:
整型变量的类型有byte、short、int、long四种。下表列出各类型所在内存的位数和其表示范围。
int类型是最常使用的一种整数类型。它所表示的数据范围足够大,而且适合于32位、64位处理器。但对于大型计算,常会遇到很大的整数,超出int类型所表示的范围,这时要使用long类型。
由于不同的机器对于多字节数据的存储方式不同,可能是从低字节向高字节存储,也可能是从高字节向低字节存储,这样,在分析网络协议或文件格式时,为了解决不同机器上的字节存储顺序问题,用byte类型来表示数据是合适的。而通常情况下,由于其表示的数据范围很小,容易造成溢出,应避免使用。
short类型则很少使用,它限制数据的存储为先高字节,后低字节,这样在某些机器中会出错。
三、整型变量的定义,如:
byteb;//指定变量b为byte型
shorts;//指定变量s为short型
inti;//指定变量i为int型
longl;//指定变量l为long型
§2.4浮点型(实型)数据
一、实型常量
与C,C++相同,Java的实常数有两种表示形式:
①十进制数形式,由数字和小数点组成,且必须有小数点,如0.123,.123,123.,123.0
②科学计数法形式。如:123e3或123E3,其中e或E之前必须有数字,且e或E后面的指数必须为整数。
实常数在机器中占64位,具有double型的值。对于float型的值,则要在数字后加f或F,如12.3F,它在机器中占32位,且表示精度较低。
二、实型变量
实型变量的类型有float和double两种,下表列出这两种类型所占内存的位数和其表示范围。
数据类型所占位数数的范围
float323.4e-038~3.4e+038
double641.7e-308~1.7e+308
双精度类型double比单精度类型float具有更高的精度和更大的表示范围,常常使用。
三、实型变量定义,如
floatf;//指定变量f为float型
doubled;//指定变量d为double型
[注]与C、C++不同,Java中没有无符号型整数,而且明确规定了整型和浮点型数据所占的内存字节数,这样就保证了安全性、鲁棒性和平台无关性。
§2.5字符型数据
一、字符常量
字符常量是用单引号括起来的一个字符,如-a-,-A。另外,与C、C++相同,Java也提供转义字符,以反斜杠(\)开头,将其后的字符转变为另外的含义,下表列出了Java中的转义字符。
与C、C++不同,Java中的字符型数据是16位无符号型数据,它表示Unicode集,而不仅仅是ASCII集,例如\u0061表示ISO拉丁码的-a。
转义字符描述
\ddd1到3位8进制数据所表示的字符(ddd)
\uxxxx1到4位16进制数所表示的字符(xxxx)
\-单引号字符
\\反斜杠字符
\r回车
\n换行
\f走纸换页
\t横向跳格
\b退格
二、字符型变量
字符型变量的类型为char,它在机器中占16位,其范围为0~65535。字符型变量的定义如:
charc=-a-;//指定变量c为char型,且赋初值为-a-
与C、C++不同,Java中的字符型数据不能用作整数,因为Java不提供无符号整数类型。但是同样可以把它当作整数数据来操作。
例如:
intthree=3;
charone=-1-;
charfour=(char)(three+one);//four=-4-
上例中,在计算加法时,字符型变量one被转化为整数,进行相加,最后把结果又转化为字符型。
三、字符串常量
与C、C++相同,Java的字符串常量是用双引号("")括起来的一串字符,如"Thisisastring.\n"。但不同的是,Java中的字符串常量是作为String类的一个对象来处理的,而不是一个数据。有关类String,我们将在第七章讲述。
§2.6布尔型数据
布尔型数据只有两个值,true和false,且它们不对应于任何整数值。在流控制中常用到它。
布尔型变量的定义如:
booleanb=true;//定义b为布尔型变量,且初值为true
§2.7举例
例2.1.下例中用到了前面提到的数据类型,并通过屏幕显示它们的值。
publicclassSimpleTypes{
publicstaticvoidmain(Stringargs[]){
byteb=0x55;
shorts=0x55ff;
inti=1000000;
longl=0xfffL;
charc=-c-;
floatf=0.23F;
doubled=0.7E-3;
booleanbool=true;
System.out.println("b="+b);
System.out.println("s="+s);
System.out.println("i="+i);
System.out.println("c="+c);
System.out.println("f="+f);
System.out.println("d="+d);
System.out.println("bool="+bool);
}
}
编译并运行该程序,输出结果为:
C:\>javaSimpleTypes
b=85
s=22015
i=1000000
l=4095
c=c
f=0.23
d=0.0007
bool=true
§2.8各类数值型数据间的混合运算
一、自动类型转换
整型、实型、字符型数据可以混合运算。运算中,不同类型的数据先转化为同一类型,然后进行运算。转换从低级到高级,如下图:
转换规则为:
①(byte或short)opint→int
②(byte或short或int)oplong→long
③(byte或short或int或long)opfloat→float
④(byte或short或int或long或float)opdouble→double
⑤charopint→int
其中,箭头左边表示参与运算的数据类型,op为运算符(如加、减、乘、除等),右边表示转换成的进行运算的数据类型。
例2.2
publicclassPromotion{
publicstaticvoidmain(Stringargs[]){
byteb=10;
charc=-a-;
inti=90;
longl=555L;
floatf=3.5f;
doubled=1.234;
floatf1=f*b;
//float*byte->float
inti1=c+i;
//char+int->int
longl1=l+i1;
//long+int->ling
doubled1=f1/i1-d;
//float/int->float,float-double->double}
}
二、强制类型转换
高级数据要转换成低级数据,需用到强制类型转换,如:
inti;
byteb=(byte)i;//把int型变量i强制转换为byte型
这种使用可能会导致溢出或精度的下降,最好不要使用。
第三章运算符和表达式
运算符指明对操作数所进行的运算。按操作数的数目来分,可以有一元运算符(如++、——),二元运算符(如+、>)和三元运算符(如?:),它们分别对应于一个、两个和三个操作数。对于一元运算符来说,可以有前缀表达式(如++i)和后缀表达式(如i++),对于二元运算符来说则采用中缀表达式(如a+b)。按照运算符功能来分,基本的运算符有下面几类:
1.算术运算符(+,-,*,/,%,++,——)
2.关系运算符(>,<,>=,<=,==,!=)
3.布尔逻辑运算符(!,&&,||)
4.位运算符(>>,<<,>>>,&,|,^,~)
5.赋值运算符(=,及其扩展赋值运算符如+=)
6.条件运算符(?:)
7.其它(包括分量运算符·,下标运算符[],实例运算符instanceof,内存分配运算符new,强制类型转换运算符(类型),方法调用运算符()等)
本章中我们主要讲述前6类运算符。
§3.1算术运算符
算术运算符作用于整型或浮点型数据,完成算术运算。
一、二元算术运算符,如下表所示
运算符用法描述
+op1+op2加-
op1-op2减
*op1*op2乘
/op1/op2除
%op1%op2取模(求余)
Java对加运算符进行了扩展,使它能够进行字符串的连接,如"abc"+"de",得到串"abcde"。我们将在第七章中讲解。
与C、C++不同,对取模运算符%来说,其操作数可以为浮点数,如37.2%10=7.2。
二、一元算术运算符,如下表所示:
运算符用法描述
++op正值——
op负值
++++op,op++加1——
op,op——减1
i++与++i的区别
i++在使用i之后,使i的值加1,因此执行完i++后,整个表达式的值为i,而i的值变为i+1。
++i在使用i之前,使i的值加1,因此执行完++i后,整个表达式和i的值均为i+1。
对i——与——i同样。
例3.1.下面的例子说明了算术运算符的使用
publicclassArithmaticOp{
publicstaticvoidmain(Stringargs[]){
inta=5+4;//a=9
intb=a*2;//b=18
intc=b/4;//c=4
intd=b-c;//d=14
inte=-d;//e=-14
intf=e%4;//f=-2
doubleg=18.4;
doubleh=g%4;//h=2.4
inti=3;
intj=i++;//i=4,j=3
intk=++i;//i=5,k=5
System.out.println("a="+a);
System.out.println("b="+b);
System.out.println("c="+c);
System.out.println("d="+d);
System.out.println("e="+e);
System.out.println("f="+f);
System.out.println("g="+g);
System.out.println("h="+h);
System.out.println("i="+i);
System.out.println("j="+j);
System.out.println("k="+k);
}
}
其结果为:
C:\>javaArithmaticOp
a=9
b=18
c=4
d=14
e=-14
f=-2
g=18.4
h=2.4
i=5
j=3
k=5
§3.2关系运算符
关系运算符用来比较两个值,返回布尔类型的值true或false。关系运算符都是二元运算符,如下表所示:
运算符用法返回true的情况
>op1>op2op1大于op2
>=op1>=op2op1大于或等于op2
<op1<op2op1小于op2
<=op1<=op2op1小于或等于op2
==op1==op2op1与op2相等
!=op1!=op2op1与op2不等
Java中,任何数据类型的数据(包括基本类型和组合类型)都可以通过==或!=来比较是否相等(这与C、C++不同)。
关系运算的结果返回true或false,而不是C、C++中的1或0。
关系运算符常与布尔逻辑运算符一起使用,作为流控制语句的判断条件。如
if(a>b&&b==c)
§3.3布尔逻辑运算符
布尔逻辑运算符进行布尔逻辑运算,如下表所示:
op1op2op1&&op2op1||op2!op1
falsefalsefalsefalsetrue
falsetruefalsetruetrue
truefalsefalsetruefalse
truetruetruetruefalse}
·&&、‖为二元运算符,实现逻辑与、逻辑或。
·!为一元运算符,实现逻辑非。
·对于布尔逻辑运算,先求出运算符左边的表达式的值,对或运算如果为true,则整个表达式的结果为true,不必对运算符右边的表达式再进行运算;同样,对与运算,如果左边表达式的值为false,则不必对右边的表达式求值,整个表达式的结果为false。
下面的例子说明了关系运算符和布尔逻辑运算符的使用。
publicclassRelationAndConditionOp{
publicstaticvoidmain(Stringargs[]){
inta=25,b=3;
booleand=a<b;//d=false
System.out.println("a<b="+d);
inte=3;
if(e!=0&&a/e>5)
System.out.println("a/e="+a/e);
intf=0;
if(f!=0&&a/f>5)
System.out.println("a/f="+a/f);
else
System.out.println("f="+f);
}
}
其运行结果为:
C:\>javaRelationAndConditionOp
a<b=false
a/e=8
f=0
注意:上例中,第二个if语句在运行时不会发生除0溢出的错误,因为e!=0为false,所以就不需要对a/e进行运算。
§3.4位运算符
位运算符用来对二进制位进行操作,Java中提供了如下表所示的位运算符:
位运算符中,除~以外,其余均为二元运算符。
操作数只能为整型和字符型数据。
3.4.1补码
Java使用补码来表示二进制数,在补码表示中,最高位为符号位,正数的符号位为0,负数为1。补码的规定如下:
对正数来说,最高位为0,其余各位代表数值本身(以二进制表示),如+42的补码为00101010。
对负数而言,把该数绝对值的补码按位取反,然后对整个数加1,即得该数的补码。如-42的补码为11010110(00101010按位取反11010101+1=11010110)
用补码来表示数,0的补码是唯一的,都为00000000。(而在原码,反码表示中,+0和-0的表示是不唯一的,可参见相应的书籍)。而且可以用111111表示-1的补码(这也是补码与原码和反码的区别)。
3.4.2按位取反运算符~
~是一元运算法,对数据的每个二进制位取反,即把1变为0,把0变为1。
例如:
0010101
~
1101010
注意,~运算符与-运算符不同,~21≠-21。
3.4.3按位与运算符&
参与运算的两个值,如果两个相应位都为1,则该位的结果为1,否则为0。即:
0&0=0,0&1=0,1&0=0,1&1=1
为了方便下次访问,请牢记闪文书库网址www.shanwen.com,您的支持是我们最大的动力。注册会员