1、雷学生 主编 第第1章章 Java语言概述语言概述第第2章章 Java语言基础语言基础第第3章章 控制语句控制语句第第4章章 类及其方法类及其方法第第5章章 继承与多态继承与多态第第6章章 包和接口包和接口第第7章章 异常处理异常处理第第8章章 多线程编程多线程编程第第9章章 Applet编程编程第第10章章 输入与输出输入与输出第第11章章 常用工具包和类常用工具包和类1.1 Java1.1 Java语言的起源和发展语言的起源和发展1.2 1.2 面向对象的程序设计面向对象的程序设计1.3 Java1.3 Java语言的特点语言的特点1.4 Java1.4 Java程序的运行程序的运行Ret
2、urn1.1.1 1.1.1 几种典型语言的发展历程几种典型语言的发展历程1.1.2 Java1.1.2 Java语言的起源语言的起源1.1.3 Java1.1.3 Java语言的发展语言的发展Return 一般认为,B语言导致了C语言的诞生、C语言演变出C+语言,而Java语言则明显带有C+语言的特征。本节将对Java语言的起源和发展作简要介绍。Return Java总是和C+联系在一起,而C+则是从C语言派生而来的,所以Java语言继承了这两种语言的大部分特性。Java的语法是从C继承的,Java许多面向对象特性都受到C+的影响。事实上,Java中几个自定义的特性都来自于或可以追溯到它的这
3、些前驱语言。略有不同的是,Java语言完全面向对象,从而摒弃了二者的不足之处。Java语言的诞生与过去约30年中计算机语言的不断改进和发展密切相关。基于这些原因,下面我们将简要介绍一下这个发展历程。1 1现代编程语言的诞生:现代编程语言的诞生:C C语言语言 2 2对编程方法的新需要:对编程方法的新需要:C+C+语言语言3 3时机的到来:时机的到来:JavaJava语言的出现语言的出现Return Java是由James Gosling、Patrick Naughton、Chris Warth、Ed Frank以及Mike Sheridan等人于1991年在Sun Microsystems公司
4、设计出来的,开发第一个版本花了18个月时间。该语言最初名叫“Oak”,后来发现“Oak”已经是Sun公司另外一种语言的注册商标,于1995年更名为“Java”,即太平洋上一个盛产咖啡的岛屿的名字。从1992 的秋天Oak问世,到1995春天公开发布Java语言,许多人都对Java的设计和改进做出了贡献。Return 自从于1995年被正式推出之后,Java语言就以其独特的优势迅猛发展,经过短短8、9年时间,成为迄今为止最为优秀的面向对象语言。Java也从当初的一种语言而逐渐形成一种产业,基于Java语言的J2EE架构已成为微软.NET平台的强大竞争对手。当初,Java语言最初的发布不亚于一场革
5、命,但是它并不标志着Java快速革新时代的结束。在Java 1.0发布后不久,Java的设计者就已经制定出了Java 1.1、Java 1.2、Java 1.3、Java 1.4、Java 2、Java 2.1.4版。1.2.1 1.2.1 面向对象技术的提出面向对象技术的提出1.2.2 1.2.2 面向对象的编程思想面向对象的编程思想1.2.3 1.2.3 面向对象编程的基本原则面向对象编程的基本原则Return 面向对象的编程思想由来已久,但真正意义上的纯面向对象编程语言目前只有Java。本节将结合几种高级语言对面向对象程序设计思想进行简要介绍。Return 我们知道,所有的计算机程序均由
6、两类元素组成:代码和数据。如何实现这两类元素的有效结合而形成可运行的程序,是多年来程序设计人员所探索的问题。最初,程序的构筑一般围绕“正在发生什么”而编写代码,这种方法被称为面向过程的编程。使用这种方法编写的程序都具有线性执行的特点。面向过程的编程模型可认为是代码作用于数据,像Pascal、C这样的过程式语言采用此模型是相当成功的。然而,使用面向过程的方法对小程序的编写可能是比较有效的,但当程序变得非常大且更为复杂时,就会出现种种问题,直至失去对代码的有效控制。由此对软件工程中的编程方法问题提出了新的要求。为了管理不断增加的复杂性,另外一种编程方式被提了出来,即面向对象的编程(OOP,Obje
7、ct-Oriented Programming)。这种编程方式围绕“谁将受到影响”进行,即以代码的相关数据为核心点进行程序编写。面向对象的编程着眼于它的数据(即对象)和为此数据严格定义的接口来组织程序,程序实际上是用数据控制对代码的访问。这种方式的最大特点是代码与其相关数据被分离开来进行处理,有利于程序规模的扩大,而程序的可维护性得到增强。Return 前面提到的面向过程程序,它遵循面向过程的问题求解方法,其中心思想是用计算机能够理解的逻辑来描述和表达待解决的问题及其具体的解决流程。数据结构和算法是面向过程问题求解的核心所在。而面向对象技术则代表了一种全新的程序设计思路,其观察、表述、处理问题
8、的方法,与传统的面向过程的编程方法不同。面向对象的程序设计和问题求解力求符合人们日常自然的思维习惯,尽量分解、降低问题的难度和复杂性,从而提高整个求解过程的可监测性、可控制性和可维护性,以此达到以较小代价和较高效率获得较满意效果之目的。面向对象编程一个实质性的要素是抽象。1 1封装性封装性 封装(Encapsulation)是将代码及其处理的数据绑定在一起的一种编程机制,该机制保证了程序和数据都不受外部干扰且不被误用。一个对象的基本要素包括属性和作用在属性上的操作(方法或事件)。对象的使用实现了数据抽象,它将一组数据和对这组数据的操作结合成一个内在的整体,不允许外界对这组数据任意进行访问,这里
9、就用到了封装的原理。封装的目的是为了实现数据隐藏和数据保护,为对象提供一个对外操作的接口,外界只能从对象所提供的操作接口来认识和操作该对象。一般说来,面向对象的系统至少需具备三大特性:封装性、继承性、多态性。将封装、继承、多态(包括重载)等面向对象方法应用于程序的开发工具和开发过程中,不仅可以加快开发的速度,还可极大地增强程序的可维护性和可扩展性,提高代码重用率。因此,在面向对象编程过程中需要遵循这三项原则。下面对它们分别作简要介绍。继承(Inheritance)是一个对象获得另一个对象的属性的过程。继承很重要,因为它支持了层级分类的思想。众所周知,大多数事物均可按层级(即从上到下、从高到低)
10、分类管理。显然,如果不使用层级的概念,在进行描述时,我们就不得不分别定义每个事物的所有属性。使用了继承,一个对象就只需定义使它在所属类中独一无二的属性即可,因为它可以从它的父类那里继承其他所有的通用属性。所以,完全可以这样说,正是继承机制使一个对象成为一个更具通用性的类的一个特定实例成为可能。继承是现实生活中一个非常容易理解的概念。在面向对象的程序设计方法中,引入继承机制的目的在于:其一,避免可公用代码的重复开发,减少数据冗余;其二,增强数据的一致性,尽量降低模块间的耦合程度。多态(Polymorphism)来自于希腊语,表示“多种形态”,即允许一个接口被多个同类动作所使用的特征,具体使用哪个
11、动作与应用场合有关。所谓多态性就是当不同的对象收到相同的消息时,产生不同动作的特性。这里所说的消息可以理解为方法或事件。通俗地讲,多态性就是使用一个名称来定义不同的方法,这些方法执行类似的但又不同的操作,即以相同的接口来访问功能不同的函数,从而实现“一个接口,多种方法”。Return4多态性、封装性与继承性的相互作用多态性、封装性与继承性的相互作用 如果使用得当,在由多态性、封装性和继承性共同组成的编程环境中可以写出比面向过程模型环境更健壮、扩展性更好的程序。精心设计的类层级结构是实现代码可重用性的基础;封装可以使你在不破坏依赖于类公共接口的代码基础上对程序进行升级迁移;而多态性则有助于编写清
12、晰、易懂、易读、易修改的程序。1.3.1 1.3.1 语言特点概述语言特点概述1.3.2 Java1.3.2 Java语言的具体特点语言的具体特点1.3.3 Java1.3.3 Java和和C/C+C/C+的比较的比较Return 作为当前一种被广泛使用的面向对象编程语言,Java具有多方面的特点。如果与其他众多的编程语言作一下比较,会发现这些特点正是Java语言之所以如此风靡的原因所在。虽然Java在某些方面(例如资源耗费)也存在一些不足,但这丝毫不影响Java作为目前最优秀面向对象编程语言的地位。1 1JavaJava的灵魂:字节码的灵魂:字节码 2Java的内涵:丰富的类库的内涵:丰富的
13、类库 Return Java是一种被广泛使用的网络编程语言,这是一种新的计算概念。网络环境下的编程语言最需要解决的是可移植性和安全性问题。以字节方式进行编码,使得程序不受运行平台和环境的限制成为可能。Java语言还提供了丰富的类库,使程序设计人员可以很方便地调用相关类建立起自己的系统。主要表现在:1.1.简单性简单性2.2.面向对象面向对象3.3.分布性分布性4.4.鲁棒性鲁棒性5 5.可移植性可移植性Return Java作为一种高级程序设计语言,它除具有面向对象、编写简单、脱离机器结构、具有分布性、鲁棒性、可移植性、安全性特点外,并且提供了并发机制,解释执行具有很高的性能。同时,还具有动态
14、性特点。主要表现在:6.6.安全性安全性7 7.结构中立结构中立8 8.高性能高性能9.9.多线程多线程10.10.动态性动态性Return 对于变量声明、参数传递、操作符、流控制等,Java使用了和C/C+相同的风格,这使得熟悉C/C+的程序员能很方便地进行编程语言切换。同时,Java实现并加强了其简单、鲁棒、安全等特性,也摒弃了C和C+中许多不合理的地方。主要表现在:1.1.头文件头文件2.2.全局变量全局变量3.3.指针指针4.4.内存管理内存管理5 5.数据类型支持数据类型支持6 6.类型转换类型转换7 7.结构和联合结构和联合8.8.预处理预处理1.4.1 Java1.4.1 Jav
15、a运行环境的安装与配置运行环境的安装与配置1.4.2 1.4.2 第一个第一个JavaJava程序程序1.4.3 1.4.3 两种类型的两种类型的JavaJava程序程序1.4.4 Java1.4.4 Java环境的有关工具环境的有关工具1.4.5 Java1.4.5 Java程序的编写开发工具程序的编写开发工具Return 由于Java是采用Java虚拟机进行解释执行的编程语言,它需要一定的软件支撑环境才能够运行起来。本节将先介绍Java的运行环境,然后介绍Java程序的编写。Return 编写并运行Java程序,需要Java开发工具包(JDK,Java Development Kit)的支
16、持。因此在编写自己的第一个Java程序前,读者需要先在自己的机器上安装JDK。到目前为止,JDK的发展经历了JDK 1.0、JDK 1.1、JDK 1.2、JDK 1.3、JDK 1.4等几个版本。说明:保留字class来声明一个新的类,其类名为HelloWorldApp,它是一个公共类(public)。整个类定义由大括号对括起来。在该类中,定义了一个main()方法,其中public表示访问权限,指明所有的类都可以使用这一方法;static指明该方法是一个类方法,它可以通过类名直接调用;void则指明main()方法不返回任何值。对于一个应用程序来说,main()方法是必需的,而且必须按照如
17、上的格式来定义。Java解释器在没有生成任何实例的情况下,以main()作为入口来执行程序。Java程序中可以定义多个类,每个类中可以定义多个方法,但是最多只有一个公共类,main()方法也只能有一个,作为程序的入口。在main()方法定义中的,括号中的String args是传递给main()方法的参数,参数名为args,它是类String的一个实例,参数可以为0个或多个,每个参数用“类名参数名”来指定,多个参数间用逗号分隔。在main()方法的实现中,只有一条语句:System.out.println(Hello World!);它用来实现字符串的输出。“/”后的内容为注释。下面是一个经典
18、的Java入门程序,虽然只有短短几行代码,但其中的内容却很丰富,后面将作具体说明:public class HelloWorldApppublic static void main(String args)/Output the first sentence:System.out.println(Hello World!);此程序的作用是输出下面一行信息:Hello World!Return 首先,将其保存到一个名为HelloWorldApp.java的文件中。注注意:意:文件名应该与类名相同,因为Java解释器要求公共类必须放在与其同名的文件中。然后,对它进行编译。C:JavaBookjav
19、ac HelloWorldApp.java 编译的结果是生成字节码文件HelloWorldApp.class。最后,使用java命令来运行该字节码文件。C:JavaBookjava HelloWorldApp 其结果就是在显示器上显示出“Hello World!”这行文字。在Java中可以编写两类程序:应用程序(applications)和Java Applet(小应用程序)。应用程序是可以在控制台上直接运行的程序,在创建应用程序时,Java与其他高级编程语言没有太大区别,而Java的特色就在于它具有编制小应用程序的功能。小应用程序是可以在Internet中传输并在兼容Java的Web浏览器中
20、运行的应用程序。小应用程序实际上就是小型的Java程序,能像图像文件、声音文件和视频片段那样通过网络动态下载,它与其他文件的重要差别是,小应用程序是一个智能的程序,能对用户的输入作出反应,并且能动态变化,而不是一遍又一遍地播放同一动画或声音。前面对applications作了介绍,下面我们来介绍一下Java Applet的结构和应用。Returnimport java.awt.*;import java.applet.*;public class HelloWorldApplet extends Applet /This is an applet.public void paint(Graph
21、ics g)g.drawString(Hello World!,30,30);该程序的功能是:在坐标(30,30)处输出字符串“Hello World!”。在这个程序中,没有实现main()方法,这是Applet与Application(应用程序)的区别之一。为了运行该程序,首先也应将其保存到一个名为HelloWorldApplet.java的文件中,然后对其进行编译:C:JavaBookjavac HelloWorldApplet.java这样将得到字节码文件HelloWorldApplet.class。由于Applet中没有main()方法作为Java解释器的入口,我们必须编写HTML文件
22、,然后将Applet嵌入其中,接着使用appletviewer来运行,或在支持Java的浏览器上运行。该HTML文件如下。An Applet 其中,使用标记来启动HelloWorldApplet,code属性指明字节码所在的文件,width和height属性指明applet所占区域范围。最后,我们将此HTML文件存入AppletExp.htm,然后运行:C:JavaBookappletviewer AppExp.htm此时,将弹出一个Applet浏览窗口,在其中指定区域显示“Hello World!”。下面再看一个例子下面再看一个例子Return Java提供了一些常用的语言工具,主要包括:1
23、、java:解释器 2、javac:编译器 3、appletviewer:小应用程序浏览器 4、javah:头文件生成器 5、javadoc:API文档生成器 6、javap:类文件反汇编器 7、jdb:Java语言调试器 这些文件包括在/java/bin/目录中,并可以在任何目录中运行,前提是设置了运行程序的相应系统路径。Return 最后将要说明一下Java程序的编写开发工具。对于一般简单程序的编写,几乎使用任何文本编辑器都可以进行。例如操作系统所带的记事本、写字板等程序。本书中所涉及的Java程序一般使用UltraEdit编写。UltraEdit是一个非常理想的Java程序编写器,它目前
24、的最新版本是Version 10。如果要进行比较复杂的Java应用系统开发,可使用专门的Java集成开发工具,如JBuilder、Visual J+、Visual Age、JCreator等。其中优秀的开发工具支持与应用服务如BEA WebLogic、IBM WebSphere的集成。具体选用哪种开发工具要视项目的具体情况而定。2.1 2.1 预备知识预备知识2.2 2.2 基本语言要素基本语言要素2.3 2.3 基本数据类型基本数据类型2.4 2.4 变量变量2.5 2.5 数组数组2.6 2.6 运算符运算符ReturnReturn 在第在第1 1章中,我们已经学会了编写章中,我们已经学会
25、了编写“Hello World”Hello World”这种这种极为简单的极为简单的JavaJava程序。为了便于本章后面内容的叙述,本节程序。为了便于本章后面内容的叙述,本节将再介绍一个稍复杂的将再介绍一个稍复杂的JavaJava程序,使读者在学习程序,使读者在学习JavaJava语言的语言的基础知识前也能够编写简单的基础知识前也能够编写简单的JavaJava程序。程序。class MyExample public static void main(String args)int num;num=200;System.out.println(This is num:+num);num=num
26、*2;System.out.print(The value of num*2 is:);System.out.println(num);下面是一个简单的Java程序。读者将会看到,这个程序虽然不是很复杂,但其中所包含的内容和功能却很丰富。运行结果:This is num:200The value of num*2 is:400 对大多数的编程语言来说,程序源代码文件的命名是任意的,只要符合所运行的操作系统平台的要求即可。但这对于Java来说就行不通。在开始进行Java编程前,读者需要知道的第一件事情就是:源文件的名称必须与主类名一致。这一点非常重要。对于上面的例子,源程序文件名就应该是MyEx
27、ample.java。下面我们将解释其中的原因。在Java中,一个源程序文件被称为一个编译单元(Compilation Unit),它是包含一个或多个类定义的文本文件。Java编译器要求源程序文件使用.java作为扩展名。请注意,文件扩展名的长度是4个字符,因此所用操作系统一定要有支持长文件名的能力。这就意味着DOS和Windows 3.x是不支持Java文件命名规则的。从上述示例程序中可以看出,程序中定义的类名也是MyExample,这不是巧合。在Java中,所有的代码都必须驻留在类中。按照约定,类名必须与源程序的文件名相同,同时还要确保文件名的大小写字母与类名一样,因为Java是区分大小写
28、的。虽然文件名与类名必须一致的约定显得似乎有些死板,但是这个约定有助于编程人员轻松地维护和组织程序。1关于该程序的命名关于该程序的命名 在第1章中曾经涉及到这方面的内容。要编译并运行示例程序MyExample,首先要运行编译器程序javac,并在命令行上指定源程序文件名,具体格式如下。C:javac MyExample.java 这样,编译器javac产生一个名为MyExample.class的文件,该文件包含程序的字节码。前面已讨论过,Java字节码中包含的是Java解释程序将要执行的指令码,因此javac的输出结果并不是可以直接运行的代码。要真正运行该程序,必须使用名为java的Java解
29、释器。具体方法是将类名MyExample作为一个命令行参数输入,格式如下:C:java MyExample 如果程序运行正常,将输出如下内容:This is num:200 The value of num*2 is:400 2编译和运行程序编译和运行程序提示:当Java源代码被编译后,每个单独的类都被放入自己的输出文件中,并以类的名字加.class扩展名为其文件名。这就是为什么Java源程序文件必须与其中包含的类同名的原因源程序文件将与.class文件同名。运行Java解释器,实际上是指定想要解释器运行的类的名字,它会自动搜索包含该名字且带有.class扩展名的文件。如果找到,它将运行包含在
30、该指定类中的代码。Return 1.if控制语句控制语句 Java中的if控制语句与其他编程语言中的IF语句非常相似,并且与C/C+语言中的if语句的语法完全相同。它最简单的形式如下:if(condition)statement;其中:condition是一个布尔表达式。如果其值为真,那么执行语句statement;如果其值为假,则语句statement将被绕过而不被执行。例如下列语句:if(num 2008)println(You are welcome!);该语句的功能是:如果变量num的值小于2008,那么条件表达式的值为真,方法println()将被调用执行,否则方法println()
31、被绕过而不被执行。尽管在后面的第3章中将详细讨论Java控制语句,这里我们还是先简要介绍两种控制语句,以便能在本章后面的例程中使用它们。class IfSample public static void main(String args)int a,b;a=100;b=200;if(a b)System.out.println(a now greater than b);下面的程序说明了if控制语句的用法。运行结果:a is less than ba now equal to ba now greater than b 在几乎所有的编程语言中,循环语句都是很重要的组成部分,这对于Java也不例
32、外。事实上,在后面的有关章节中读者将会看到,Java提供了一套功能强大的循环结构,而for循环也许是最通用的。如果读者对C/C+熟悉,会发现Java的for循环和C/C+语言中的for循环操作完全一样。最简单的for循环结构的形式如下:for(initialization;condition;iteration)statement;其中,循环体的初始化部分(initialization)设置循环变量并为变量赋初始值。条件判断部分(condition)是测试循环控制变量的布尔表达式。若测试结果为真,循环体(statement)继续反复执行;若测试结果为假,循环结束。迭代部分(iteration)
33、的表达式决定循环控制变量在每次循环后是如何改变的。2.for循环语句循环语句class ForTest public static void main(String args)int a;for(a=0;a10;a=a+1)System.out.println(This is a:+a);下面的这个短程序说明了for循环的使用方法。运行结果如下:This is a:0This is a:1This is a:2This is a:3This is a:4This is a:5This is a:6This is a:7This is a:8This is a:9 在该例子中,a是循环控制变量,
34、它在for的初始化部分被初始化为零。在每次重复迭代(包括第一次)的开始,执行条件测试a 10。如果测试的结果为真,则println()语句被执行,然后执行循环体的迭代部分。此过程将持续进行下去,直到条件测试的结果为假。注意:通常在Java专业程序员编写的程序中,循环体的迭代部分很少会看到象“a=a+1;”的语句。原因是:Java语言中有一个特殊的增量运算符,即“+”和“-”,它们的作用分别是为对象加1和为对象减1。这样,前述的for循环语句通常写成下列这样:for(a=0;a10;a+)Return 在Java语言中,可以将2个或2个以上的语句组成一个语句组,这样的一组语句被称为程序块(Cod
35、eblocks)。程序块通过将所属语句放在大括号中来实现。一旦创建了程序块,它就成为一个逻辑单元,可以作为一个单独的语句来使用。例如,程序块可以作为Java中if控制语句和for控制语句的目标。下面我们来看一下如下的if控制语句:if(a b)/begin a block a=b;b=0;/end of block 本例中,如果a小于b,那么在程序块内的两条语句都将被执行。因此,程序块中的这2条语句组成一个逻辑单元,不能出现一条语句运行,而另一条语句不运行的情况。其中的关键点是如果你需要将两个或多个语句在逻辑上连接起来,就可以将其放入一个程序块中。又例如,下面的程序将for循环作为一个程序块使
36、用:class BlockTest public static void main(String args)int a,b;b=20;/the target of this loop is a blockfor(a=0;a10;a+)System.out.println(This is a:+a);System.out.println(This is b:+b);b=b-2;在本例中,for循环作为一个程序块使用,而不是一个单独的语句。这样每循环一次,块内的3条语句都要运行一次,此事实当然为程序的执行结果所证实。在本书的后面,读者将会看到程序块的其他性质和用法。勿庸置疑,程序块存在的主要原因是
37、为了创建逻辑上独立的代码单元。ReturnReturn 前面我们通过几个短的程序使读者对Java编程有一个初步的轮廓。在本节里,我们将开始对Java语言元素进行介绍,Java的基本语言要素包括标识符、关键字、字面量、分隔符、注释、数据类型、变量以及运算符等。ReturnReturnReturn 在Java中,字面量(literal)是指由文字所表示的取值,也可以称为常量。例如,下面所列的就是一些字面量:100 99.99 AThis is a frog 上面的这些字面量中,第一个表示一个整数,第二个是一个浮点值,第三个是一个字符型的常量,最后一个则是一个字符串值。字面量(常量)能在程序中的任何
38、地方被它所允许的类型直接使用,代表的是所属类型的一个实在值。关于字面量,我们将在介绍完Java语言的数据类型后作进一步的说明。Return 在Java中,有一些字符被系统当作分隔符使用,最常用的分隔符是分号(;),用来分隔不同的Java语句。下表中给出了Java中常见的分隔符。分隔符名称功能说明 大括号(花括号)用来定义程序块、类、方法以及局部范围,也用来包括自动初始化的数组的值。中括号(中括号)用来进行数组的声明,也用来表示撤消对数组值的引用。()小括号(圆括号)在定义和调用方法时用来容纳参数表。在控制语句或强制类型转换组成的表达式中用来表示执行或计算的优先权。;分号用来表示一条语句的结束。
39、,逗号在变量声明中,用于分隔变量表中的各个变量。在for控制语句中,用来将圆括号内的语句连接起来。.点号用来将软件包的名字与它的子包或类分隔。也用来将引用变量与变量或方法分隔。Return Java中有3种类型的注释(comments)方式,其中前两种注释方式即单行注释和多行注释已作介绍。第三种方式被称为文档注释(Documentation comment),它以“/*”开始,以“*/”标志结束。文档注释提供将程序信息嵌入到程序中的功能。开发人员可以使用javadoc工具将信息取出,然后转换为HTML文件。这种注释方式提供了编写程序文档的便捷方式。javadoc工具生成的文档十分常见,因为Su
40、n的Java API文档库就是这么生成的。javadoc所识别的标记见教材P28表2-2。标记的使用方法见教材P2931。从表2-2中不难发现,在进行文档注释时,所有的文档标记都以“”标志开始。在一个文档注释中,也可以使用其他的标准HTML标记。然而,有些标记(如标题)是不能使用的,因为它们会破坏由javadoc生成的HTML文档外观属性。同时可以使用文档注释为类、接口、域、构造函数和方法提供文档。在所有这些情况中,文档注释必须紧接在被注释的项目之前。为变量作注释,可使用see、since、serial、serialField和deprecated文档标记;为类作注释,可使用see、autho
41、r、since、deprecated和version文档标记;为方法作注释,可使用see、return、param、since、deprecated、throws、serialData和exception作标记。而link和docRoot标记则可以用在任何地方。Return 本节将介绍本节将介绍Java语言中最基本的数据类型。同其他所有的高语言中最基本的数据类型。同其他所有的高级编程语言一样,级编程语言一样,Java支持多种数据类型,它们可以用来声明变量、支持多种数据类型,它们可以用来声明变量、创建数组以及其他更复杂的数据结构。创建数组以及其他更复杂的数据结构。Return注意:简单数据类型代
42、表单值,而不是复杂的对象。Java是完全面向对象的,但简单数据类型却不是,它们类似于其他大多数非面向对象语言中的简单数据类型。这样做的原因是出于效率方面的考虑。在面向对象中引入简单数据类型不会对执行效率产生太多的影响。ReturnReturnReturnReturn 下面对以上程序代码作几点说明。首先,读者已经看到了,当用方法println()输出布尔类型的值时,显示的是“true”或“false”;其次,布尔变量的值本身就足以用来对if语句进行控制,没有必要将if语句写成如下的形式。if(b=true).另外,关系运算符(例如1的值就是“true”。在表达式111的两边额外地加上括号,是由于
43、加号“+”运算符的优先级比运算符“”的优先级要高。ReturnReturn 变量是Java程序中的一个基本存储单元。变量由一个数据类型、标识符以及一个可选初始值的组合来进行定义。此外,所有的变量都有一个作用域,指定变量的可见性和生存期。本节将对Java变量及其相关问题作详细说明。在Java中,所有的变量必须先声明再使用。基本的变量声明方法如下。type identifier =value,identifier=value.;其中,type应是Java的基本类型之一,或者类及接口类型的名字(关于类和接口将在本书后面有关章节中讨论)。identifier(标识符)是变量的名字,其后用一个等号和一个
44、值来初始化变量。需要注意的是,初始化表达式的取值必须与指定变量类型一样或兼容。在声明指定类型的多个变量时,使用逗号将各变量分开。以下是变量声明的几个例子,其中有一些已经进行了初始化:int a,b,c;/declares three ints,a,b,and c.int d=3,e,f=5;/declares three more ints,initializing d and f.byte g=123;/initializes g.double pi=3.1416;/declares an approximation of pi.char x=x;/the variable x has th
45、e value x.不难知道,你所选择的标识符名称没有任何表明它们相应类型的成分。许多读者可能还记得FORTRAN语言中预先规定从I到N的所有标识符都为整型变量,而其他标识符为实型变量。Java则允许任何合法的标识符具有任何它所声明的数据类型。1声明一个变量声明一个变量Return 尽管前面的例子中仅将字面量作为其初始值,Java语言也允许在变量声明时使用任何有效的表达式来动态地初始化变量。例如,下面的程序代码用于在给定直角三角形两个直角边长度的情况下,求其斜边长度。/Demonstrate dynamic initialization.class DynInit public static
46、void main(String args)double a=3.0,b=4.0;/c is dynamically initialized:double c=Math.sqrt(a*a+b*b);System.out.println(Hypotenuse is:+c);在这里,我们定义了3个局部变量a、b、c。前两个变量a和b被初始化为常量,而直角三角形的斜边c则被动态地初始化(使用勾股定理)。该程序用了Java中另外一个内置的方法sqrt(),它是Math类的一个成员,计算它的参数的平方根。这里关键的一点是初始化表达式可以使用任何有效的元素,包括方法调用、其他变量或字面量。2动态初始化动态
47、初始化 到目前为止,我们所使用的所有变量都是在方法main()后面被声明。事实上,Java允许变量在任何程序块内被声明。前面已经说明过了,程序块被包括在一对大括号中。一个程序块定义了一个作用域。这样,每当开始一个新块,你就创建了一个新的作用域。不难发现,一个作用域决定了哪些对象对程序的其他部分是可见的,也决定了这些对象的生存期。下面对作用域问题作几点说明:(1)方法定义的作用域以它的左大括号开始。但是,如果该方法有参数,那么它们也被包括在该方法的作用域中。参数问题在后面章节中将作进一步的讨论,因此现在可认为它们与方法中其他变量的作用域是一样的。(2)作为一个通用规则,在一个作用域中定义的变量对
48、于该作用域外的程序是不可见(即访问)的。因此,当你在一个作用域中定义一个变量时,你就将该变量局部化并且保护它不被非授权访问和/或修改。实际上,作用域规则为封装提供了基础。(3)作用域可以进行嵌套。例如,每当你创建一个程序块,就创建了一个新的嵌套的作用域。这样,外面的作用域包含内部的作用域。这意味着外部作用域定义的对象对于内部作用域中的程序是可见的。但反过来就不是,内部作用域定义的对象对于外部是不可见的。考察下面的程序。/Demonstrate block scope.class ScopeExample public static void main(String args)int x;/kn
49、own to all code within mainx=10;if(x=10)/start new scopeint y=20;/known only to this block/x and y both known here.System.out.println(x and y:+x+y);x=y*2;/y=100;/Error!y is not known here./x is still known here.System.out.println(x is +x);正如注释中说明的,在方法main()的开始定义了变量x,因此它对于main()中的所有的随后代码都是可见的。在if程序块中
50、定义了变量y,因为一个块定义一个作用域,y仅仅对在它的块以内的其他代码可见。这就是在它的块之外的程序行y=100;被注释掉的原因。如果你将该行前面的注释符号去掉,编译程序时就会出现错误,因为变量y在它的程序块之外是不可见的。在if程序块中可以使用变量x,因为块(即一个嵌套作用域)中的程序代码可以访问被其包围作用域中所定义的任意变量。显然,变量可以在程序块内的任何地方被声明,但是只有在他们被声明以后才是合法有效的。因此,如果你在一个方法的开始定义了一个变量,那么它对于在该方法以内的所有程序都是可用的。反之,如果你在一个程序块的末尾声明了一个变量,它就没有任何用处,因为没有程序会访问它。另一个需要