1、“Java 程序设计教程”拟编写内容主编:陈波 钱能前言本书是“C+程序设计教程”的姊妹篇。在 Internet 发展和 Web 普及的信息时代,Java成为互联网应用程序开发的主流语言,社会对 Java 程序员的需求越来越强烈。本书是作者多年程序设计教学和实际科研项目开发经验的总结。全书以实用新颖为主要目标,全面、系统地介绍了如何使用 Sun 公司的标准版开发工具 JDK6 来开发 Java 应用程序。作者使用设计精巧的实例,形象生动地说明基本的程序设计思想、概念和技术方法,使初学者能够很快地掌握相关的概念。即使是有经验的程序员也可以从新的角度来认识这些概念。本书对于学过或没有学过程序设计语
2、言的读者都是适用的。对初次接触程序设计的读者,可以先在本书配套的网站上,查找有关程序设计的准备知识的内容介绍,练习网站提供的自测题,从而快速地入门。本书适合用作各类大学计算机专业和非计算机专业的程序设计基础课程教材,也适合用做 Java 就业培训班的基础教材。在配套网站上有参考的教学时数安排。通过本书的学习,可以达到以下三个培养目标: 程序设计入门,领略什么是面向对象的程序设计; 掌握程序设计方法,领会面向对象程序设计; 了解 Java 语言的特性,掌握利用 Java 语言开发应用程序的方法.本教程的内容分成三大部分:第 1 章至第 10 章是基础部分,着重介绍程序设计语言的基础知识与面向对象
3、技术的基本思想,包括1.程序设计语言的基本知识,包括程序和程序设计的基本概念、程序的基本数据类型、基本控制结构、方法、复合数据类型.2 .面向对象程序设计的基本思想,包括类与对象、继承与多态、接口与程序包,这些章节贯穿面向对象编程的基本思想,包括封装与信息隐藏、继承聚合与软件重用、多态与表示独立性等.第 11 章至第 15 章是提高部分,针对 Java 语言的特点,介绍能体现 Java 语言优势的一些高级编程内容,这些内容可为程序员开发大型应用程序打下良好的基础。1 基本数据结构,通过这一章的学习,可增强程序中组织和管理大批量数据的能力2 文件和流 通过这一章的学习,了解电脑与外界交换数据的抽
4、象概念,为以后实现通用输入/输出打下基础。3 多线程与并发 了解线程、同步、调度的概念4 软件项目与团队合作 了解软件项目的管理,了解 ant、Log、Junit 等主要的项目开发管理工具。本书的特点1 基础部分以面向对象程序设计的基本概念为导向,从程序设计的最基本概念开始,介绍基本数据类型与控制结构,并逐步过渡到讨论方法、类、继承、多态、异常处理等复杂机制,循序渐进、深入浅出地引导读者步入面向对象程序设计的大门。在这部分的编写过程中,我们强调理清基本概念,把握程序设计思想的精髓,从而为后续的学习打下扎实的基础。2 把类和对象的概念,提前到控制结构前介绍。这是因为现在 Java 课程的教学学期
5、越来越提前,许多学校在大一就开设本课程。因此,先介绍类和对象,再介绍控制结构,可以避免结构化程序设计思想的先入为主,充分理解面向对象方法论的灵魂。3 强调应用性。力求帮助读者使用面向对象编程方法,编写一定规模的程序。书中所选用的实例和章节后安排的习题,力求覆盖 Java 认证和实践项目最常接触到的领域。4 每章的正文中还使用特别的字体穿插了一些注意、启示、思考等,促进读者的思维。5 将 Java 的图形用户接口提到比较重要的位置,并穿插在各章节中介绍。许多教材都认为 GUI 开发只是 Java 的某个扩展功能,一般用较少的篇幅。但我们在实践中发现,如今基于 Java 的 GUI 应用越来越广泛
6、。另外,编写 GUI 程序,对增强读者的编程兴趣,深入了解面向对象、事件驱动等设计原理,有非常好的作用,因此本书用了一定的篇幅介绍 GUI,并基本上分布在各章中,使得读者能从实例中潜移默化地掌握这一重要的编程内容。目录第 1 章 程序设计入门现今的社会科技发达,计算机的使用已经非常普遍,其应用也不仅仅局限于刚发明时的科研和高精密度的工作,而是融入了我们日常生活的方方面面。通过本书,您将学会如何命令计算机去做这些工作。计算机(通常被称为硬件)是由软件(也就是您或者您的同行所编写的指令,用来命令计算机去执行动作和做出判断)来控制的。学习编程是一条充满挑战且回报丰厚的旅途,我们期望您能够在学习过程中
7、获得享受。1.1 硬件和软件计算机是能够执行运算和做出逻辑判断的设备,其速度比人类的速度要快数百万(甚至数十亿)倍。而且有趣的是,计算机虽然算得飞快,但它却只能做一种运算,也就是加法。如果您是计算机专业的学生,在后面的课程里会学到,减法是靠转换成特殊的加法来实现的,乘法呢就是不断地加,除法自然就是不断地减了。计算机和计算器的主要区别就是,计算机在一系列指令的控制下处理数据,这些指令就是计算机程序。计算机程序通过一系列认为指定的有序动作来控制计算机,设计这些程序的人就被称为程序员。由于程序本身更像是一部电影的剧本或者情节,所以人们把它和可见的计算机的实物(硬件)相对应,称为软件。近年来,计算机(
8、硬件)的价格一直在惊人地下降,然而,软件开发费用却一直在上升。这是因为用于软件开发的技术并没有显著的提高,而程序员却被要求开发出功能更加强大而且更加复杂的应用程序。从某些方面来说,Java 语言的产生,正是为了适应这一潮流,努力减轻程序员的负担。1.2 计算机程序开发1.2.1 程序设计语言语言是人类创造的工具,它用来表达意思,交流思想。程序设计语言(programming language)是人类与计算机交流的工具。人们用程序设计语言描述需要解决的问题,用“编译器” (您可以先把它理解成人类和计算机之间的一个翻译)加工以使计算机理解人类的描述,然后使计算机代替人们工作。重要的是,人类的语言带
9、有激越的情感,词汇丰富、语法优雅,适合在具有灵性知觉的人们之间相互交流。程序设计语言则要刻板的多,软件刚开始发展的时候,几乎就是数学公式的翻版(有个语言叫 FORTRAN,它的名字来自 FORmula TRANslate,意思就是“公式翻译” ) ,不过 Java 在这方面要比它的前辈们好很多,至少不是数学公式的翻版了。但由于编程语言的最终目的是教计算机怎样工作,因此它和我们平时使用的“自然语言”还是有很大的区别。计算机刚发明的时候,用计算机的人,也就是造计算机的那些专家,因此专家们对机器非常非常熟悉,他们直接用 0 和 1 的序列作为机器指令来编程,难写难读(你可以想象一下面对成百上千个 0
10、 和 1 的组合) 。即使是专家,时间一长也受不了。为了方便编程,专家们用名字来代替 0 和 1 的序列所规定的操作与数据,这个被称为汇编语言。用汇编语言编程,虽然相对地提高了编程的效率,但仍然不够直观方便,还是只适合于很少一部分专业人士使用。随着计算机的不断普及,能够带来编程方便的各种用途的高级语言相继诞生。在高级语言中,单个语句就能够实现基本任务。采用高级语言编写的程序,看上去和日常英语有很多相似的地方,而且高级语言通过编译器转换成机器语言,这使得更多的人士(而不是计算机的制造者)也加入到程序开发的队伍,使软件成为一个发展突飞猛进的产业。计算机上的机器指令也称为机器代码,它是机器语言的程序
11、。机器语言是低级语言,汇编语言是机器语言的直接符号表示,所以基本上也是低级语言。而 Java 则是高级语言,例如,我们用 Java 写一个表达式:a = 3*a-2*b+1; / 含义是计算 3a-2b+1,然后赋值给 a写成某个特定机器的汇编语言和机器语言则为:MOV EAX, DWORD PTR a_$EBP 8b 45 fcLEA EAX, DWORD PTR EAX+EAX*2 8d 04 40MOV ECX, DWORD PTR b_$EBP 8b 4d f8ADD ECX,ECX 03 c9SUB EAX, ECX 2b c1INC EAX 40MOV DWORD PTR a_$E
12、BP,EAX 89 45 fc上列语句中的右边为某个机器的机器代码,我们用 16 进制来表示了,如果用 0 和 1来表示的话,第一行的“8b 45 fc”要写成“10001011 01000101 11111100”。显然,对于刚涉足编程学习的人来说,几乎是在看天书(更麻烦的是,如果我们换一种型号的机器,则各个指令又要重新学习!) ,而看上面的 Java 语句,则大致能知道计算的内容。在 Java 语句中,我们可以只需关注数值和运算,无须关心具体的实现。程序语言越低级,则必须对计算过程描述的越具体,指令也就越接近机器的硬件电路。相反,程序语言越高级,就越接近对问题的描述和表达,因而更直观,更容
13、易被人类所理解。这就是所以“低级”和“高级”语言这两个名字的由来,并不是说有种语言比另外的语言更优越,所谓的“高级”语言,最后还是自动转化成机器的具体实现,并在机器上执行的。用编程语言编写完了程序,之后就要翻译成机器代码,以便让计算机运行获得结果。翻译的方式一般由两种,一种是解释型,也就是边读程序边翻译,翻译成机器代码后就执行。另一种是编译型,它是先整篇翻译成机器代码,保存在可执行文件中,然后启动该程序文件,运行获得结果。程序设计语言发展到现在,无论是编译型还是解释型,一般都附带提供一个集成开发环境(Integrated Development Environment, IDE)。在解释型环境
14、中,编辑代码后,可以保存程序文件,可以直接运行获得结果。没有编译和链接的中间环节,方便编程开发。但由于程序运行不能离开解释器,需要不断与之交互,所以,效率上会受到影响。相应的,我们也可以想到,作为“高级语言”到“低级语言”的转换器,编译器的作用至关重要,而 Java 的编译器则更加复杂,编译器在将 Java 语言转换成机器语言的过程中,先会把 Java 语言转换成一种称为“字节码(byte code)”的中间语言。这主要是因为Java 需要实现 “一次编写、处处运行”的编程思想,关于这一点,我们在后续的章节里再描述。1.2.2 程序的执行过程计算机解题的过程,通常是这样。通过输入设备把程序和原
15、始数据按指定地址送入存储器保存,然后启动计算机,计算机按照存入的顺序依次取出存储器中的指令送入控制器分析,控制器根据分析结果发出相应的控制命令,从而按照人的意图自动完成全部运算,最后在通过输出设备输出计算结果。在运算过程中,数据从存储器取入运算其进行运算,运算的中间结果和最后结果可存入存储器保存,也可由运算器通过输出设备输出。虽然大大小小的计算机的处理能力差别很大,但程序的执行过程都是一样的。从上面的步骤我们可以看到,要让计算机准确地执行特定的任务,必须详细准确地描述解题的过程。也就是说,当人们用程序语言表达自己意图指挥计算机工作时,必须向计算机详细说明怎样完成预定的功能:第一步做什么、第二步
16、做什么、第三步做什么哪些操作按程序书写的顺序只做一遍,哪些操作重复做多少遍,为了让计算机体现出“智能” ,还需要告诉计算机哪些操作在某个条件成立时做,等等。早期的计算机,主要的作用就是“计算” ,比如发明第一台计算机的目的,就是为了能根据复杂的物理公式,计算弹道导弹的运行轨迹。程序设计工作主要围绕设计解题过程来进行,因此这种程序设计方法称为面向过程的程序设计,程序设计语言也被称为过程性语言。使用过程性语言编写的程序,其功能隐含在程序代码中。为了搞清楚程序的功能,必须反复阅读程序,仔细分析程序的每个语句,根据该程序设计语言的语法确定语句的执行车程序,并要综合每个语句的语义及执行顺序才能推断出程序
17、的功能。因此,理解面向过程的程序比较困难。1.2.3 面向对象的程序设计随着计算机的普及,用计算机进行“计算”的工作所占的比重越来越少,相反,计算机更多地被用来进行文字处理、图形设计等。用术语来讲,就是“非数值计算”类的应用越来越多,以至于人们更习惯称计算机为“电脑” 。在这些应用里面,程序的规模十分庞大(你可以算算装一个 Microsoft Office 占了你多大的硬盘) ,包含的语句也很多,程序模块之间的相互关系也十分复杂。对这类程序,如果仍然采用面向过程的程序设计方法开发,需要耗费大量的人力物力,即使开发完成,维护起来也十分困难。 (所谓维护,就是软件交付后,由于种种原因,还需要对软件
18、进行修改) 。基于这类应用的需求,出现了面向对象的编程方法,并逐渐在程序设计界占了上风。面向对象(Object-Oriented,缩写成 OO)方法学的出发点和基本原则,是尽可能模拟人类习惯的思维方式,使开发软件的方法与过程尽可能接近人类认识世界解决问题的方法与过程。那么,什么是人类习惯的解决问题的方法呢?让我们观察一个日常生活中常见的事例:一位厨师的头发长了需要理发,他会走进理发店,告诉理发师要理什么发型。也就是说,为了解决头发太长的问题,厨师只需要向理发师提出要求,告诉他“做什么” (即理什么发型) ,并不需要告诉理发师“怎么做” ,理发师自己知道第一步做什么,第二步做什么类似地,理发师如
19、果肚子饿了,只需走进餐馆点好自己要吃的饭菜,厨师自己知道该怎样做,并不需要顾客告诉他做菜的具体步骤。人类社会中不同职业的人有不同技能,需要完成一项复杂任务时,就把具有完成这项任务所需技能的各类人员找来,向每个人提出具体要求。至于每个人如何完成自己承担的任务,并不需要在布置任务的时候详细设计好。面向对象的程序设计方法就是模拟人类习惯的解题方法,也就是先把程序分解成许多对象,不同对象之间发送消息向对方提出服务要求,接受消息的对象主动完成指定功能,程序中的所有对象分工协作,共同完成整个程序的功能。关于学习程序设计,应该是先学结构化方法,再学面向对象呢,还是直接学习面向对象,在教育界一直都有争议。本书
20、则是将两者结合起来介绍的,从宏观的角度看,程序由对象组成,但对象内部的动作,还是以结构化为主的。1.3 初识 Java 程序1.3.1 Java 语言的发展和特点Java 是 Sun 公司推出的面向对象程序设计语言,特别适合于 Internet/Intranet 应用程序开发。Java 最早来自 Sun 公司为家用消费电子产品开发的一个分布式代码系统。Java 出现的背景是用在家用消费电子产品,通俗地说,是用来编写能在冰箱、洗衣机、MP、机顶盒等家电上运行的程序。比起计算机来,这些家电产品的特点是类别和型号更加丰富,因此 Java 设计的宗旨就是“一次编写,处处运行” 。否则的话,在众多的型号
21、上写程序,那可真是头痛的事情。本来设计 Java 语言的人是想把这个语言命名成 “Oak”的,因为他们实验室的外面有棵大橡树,后来发现 Oak 的名字已经被人用掉了,就用他们喝的爪哇咖啡来命名了。要实现这个“一次编写,处处运行”的目标,Java 采用了虚拟机的思想,所编写的程序是在 Java 虚拟机(Java Virtual Machine, JVM)上运行的,只要您编写的程序能在JVM 上运行,那么不需要任何变动,程序都可以在任何装有 JVM 环境的计算机上直接运行。但是这样做是要付出代价的,由于多了一层虚拟机,所以 Java 程序执行的效率,要比直接在物理机器上运行的 C 程序等慢一些。由
22、于每条语句都通过 JVM 执行,所以 JVM 的效率至关重要,Android 手机上也有大量的 Java 语言编写的程序,为了提高效率(因为手机的 CPU 和台式机的 CPU 相比,效率要低很多) ,Android 的设计者就改写了我们常用的PC 上的 JVM,使之更加的高效。Sun 公司所提供的 Java Software Development Kit(简称 Java 2,或 SDK,或 JDK)是一个完善的技术平台,所推出的 JDK 版本 1.1,1.2,1.3, 1.4,1.5 都统称为 Java 2。并且Sun 公司按照 Java 技术架构,分为 3 个版本:(1)J2ME(Java
23、 2 Platform Micro Edition)适用于小型设备和智能卡的版本。(2)J2SE(Java 2 Platform Standard Edition)适用于桌面系统的版本。(3)J2EE(Java 2 Platform Enterprise Edition)适用于企业环境的版本。可能是 Sun 觉得名字中有个“2” ,后面还有 1.2,1.3 这样的版本号比较别扭,或者是觉得 1.1,1.2 这样的版本升级容易让别人觉得更新不大,因此从 J2SE 的 1.5 开始,Sun 把名字中的 2 去掉了,并且版本号改为 5.0。也就是说,标准版的名字叫“Java Platform, St
24、andard Edition”,简称“JavaSE” 。本书主要介绍 JavSE 的 6.0 版。1.3.2 第一个 Java 程序为了对 Java 程序有个初步认识,我们先来看一个简单但是完整的 Java 程序,它的作用是在屏幕上显示一行字“Hello World!”。想当年 C 语言的发明者编的教材里,第一个程序就是打印“Hello World!” ,结果现在这句话几乎成了所有语言教材的第一个例子了。/*/ HelloWorld.java / Print “Hello World!” on screen/*public class HelloWorldpublic static void
25、main (String args)System.out.println(“Hello World!n”);程序开头的 4 行,每句的开头都是两个斜杠“/” ,这表示这句话是程序中的注释(Comment)。注释不影响程序的执行,但可以增强程序的可读性。也就是说,这些内容都是写给人类看的,对编译器来讲,它只是简单地将注释去掉,不予理会。在写程序代码的同时,写上简明扼要的注释,是一个很好的编程习惯,应该从编程的一开始就养成。Java 有三种表示注释的方法。最常见的就是这种使用,它用来注释从/ 开始到此行行尾的内容。注释很长时,你可以在每一行前都加上/,如果行数比较多,你嫌每行都加比较麻烦,那也可以
26、使用/*和 */符号来包括长的注释块。如/* This is the first small program.I want learn java programming from this.Java is funny. I like it.*/是不是简单很多。我们在阅读很多开源代码的时候,文件的开头有一大段关于版权的说明,要占上 10 几行,甚至更多,这时用/* 和*/ 就很方便了。第三种注释方法用于自动产生文档。它使用/* 作为开始,*/ 作为结束。别小看它只是在/*后面再加一个*号,它是程序设计界约定的标准,有专门的工具利用这个记号生成文档,包括网页形式的文档,这样我们就可以用网页超链接的
27、方式来查看程序中的说明了。Java API doc 就是用类似的方法产生的。程序中剩下的部分,包括”public class HelloWorld”和用 括起来的内容。这称为类定义(class definition),它定义了一个类。类是 Java 语言(包括其他面向对象的语言,如C+)中最重要的概念哦,所有的 Java 程序都是用类定义的方法来编写的。在这个例子里,我们给这个类起名叫 HelloWorld,你也可以取其他的名字。按命名惯例,类名的首字母大写,如果由多个单词组成,则每个单词的首字母大写,其他小写,这种方式被称为“驼峰命名法” ,因为大写字母看起来高一点,就象骆驼的驼峰一样。Ja
28、va 建议只是用字母来命名类,而不加下划线(_)之类的特殊字符。和括起来的,就是类定义的主体。在这个例子中,类定义只包括一个 main 方法(method)的定义。所谓方法,就是一组语句的集合,它用来完成一个特定的任务,并且具有一个名字。在这里例子里,方法的名字叫 main,并且它只包含一句语句。和类定义类似,方法的定义也是包含在和 之间的。所有 Java 应用程序都有一个 main 方法。所有应用程序也是从 main 方法里的第一句语句开始执行,一句接着一句,直到 main 方法的结束,也就是”。在 Java 语言中,main方法的前面总是有 public,static 和 void 这三个
29、单词,这些我们以后都会学到。括号里面的String 和 args 的,虽然在这个程序里没有什么作用,我们后面也会学到。在 main 方法里的语句,调用(invoke,或者叫 call)了另外一个方法,println(念作 print line)。println 的作用是在屏幕上打印指定的字符串。调用方法使用的是句点(.) 符号。Java使用了通用语法(也就是说和 C+等主流的编程语言一样):object.method(parameters)来作为函数调用的等价物。例子中,我们调用 println 方法时,传送给它一个字符串参数。字符串以“(双引号开头),并且以双引号结束。当我们这个程序执行时,
30、它调用 System.out 这个对象的 println方法,从而在屏幕上输出 Hello World!。我们在后面还会详细解释对象、方法、调用等概念的。下面介绍用命令行来编译和执行 Java 程序。打开一个 shell 或终端窗口。进入你编辑的目录,然后输入如下命令:javac HelloWorld.javajava HelloWorld如果出现 Hello World!,那么祝贺你已经编译和运行了你的第一个 Java 程序!这两行命令具体做了什么呢?javac 程序是 Java 的编译器。它把 HelloWorld.java 文件编译成 HelloWorld.class 文件。java 程
31、序是 Java 解释器,它负责解释执行编译器生成到class 文件中的字节码。1.3.3 第一个 applet 程序上节介绍的程序是 Java 应用程序,它们是和任何本地程序一样的独立程序。另一方面,让 Java 在网络中红极一时的原因,是它还能够在 Web 浏览器中运行 applet。Java Applet 程序是寄生在 HTML 文件中运行的,所以不需要 main()方法。同时 Applet 程序是在图形方式下运行,所以嵌入文本对象要说明位置信息,位置信息根据 XY 的坐标值确定,左上角为(0,0)。HelloWorldApplet.java 具体程序如下:package javaprog
32、;import java.applet.*;import java.awt.*;public class HelloWorldApplet extends Applet public void paint(Graphics g)g.drawString(“Hello World”, 10, 50);使用下列的 javac 编译程序:D:javadev build HelloWorldApplet嵌入 HelloWorldApplet.class 的 HTML 文件 HelloWorldApplet.html 如下:HelloWorld Applet其中使用标记来说明 3 件事情:(1)导入要执
33、行的类 javaprog.HelloWorldApplet.class,这是根据 CLASSPATH 环境变量来确定查找类文件的起始位置。(2)使用 WIDTH 说明画布在浏览器中所占用的宽度,以像素为单位。(3)使用 HEIGHT 说明画布在浏览器中所占用的高度,以像素为单位。现在,你还不需要过多地研读这个例子,只需要了解一下 applet 的作用就可以。在这一章中,你学会了编译和运行 Java 程序的机制,现在可以进入第 2 章,真正开始学习Java 语言了。第 2 章 数据和表达式 编程是要完成计算或者其他类似的任务的,要计算就会有数据的进出,我们日常使用的包括整数、小数、字符串,以及更
34、为复杂的数据类型。若要将计算结果保存在某个存储空间中(确切地讲,是内存) ,就要对存储空间进行说明。Java 用名字来代表存储空间。涉及存放数据的名称有两类,一类是变量,它是由 Java 内部数据类型定义而产生的。另一类称为对象,它先由程序员定义类,然后再根据此创建实体而产生。变量和对象,两者并没有本质的区别,它们都是占据空间的数据描述体。在程序语言中,它们由具体的数据类型引导、创建,只不过变量用的是内部数据类型,对象用的是程序员定义的数据类型。2.1 标识符与保留字任何一种计算机高级程序设计语言都有自己的标识符,这正如我们学习语言一样,需要单词。在 Java 语言中,标识符用于标识变量、方法
35、、类和对象的名称;从语法上讲,标识符是以字符或_开头的有效字母和数字的组合。这里要注意标识符是分大小写的,并且没有长度限制。任何一种计算机高级程序设计语言都有自己的保留字。所谓保留字,首先它是合法的标识符,然后它是程序设计语言专用的,不允许编程人员使用。例如,在 Java 语言中,new、extends、class 、 Integer 等都是 Java 语言的保留字。前面提到,尽管 Java 支持用下划线等几个特殊字符作为标识符,甚至还可以用Unicode 字符(比如中文)作为标识符,但从代码的可理解性考虑,还是希望只使用字母和数字来作为标识符。2.2 基本数据类型在使用变量之前,必须要声明变
36、量。在声明变量时,一定要说明变量的数据类型。所谓数据类型是描述变量的存储空间大小和取值范围。Java 是一门强类型语言,也就是说,每个变量都必须声明类型。这样做的好处是可以尽早地发现程序的问题。在 Java 语言中,数据类型分为 3 种类型:基本数据类型:这是 Java 语言支持的最基本数据类型,包括四种整型:字节 (byte)、短整型(short)、整型(int)、长整型(long),两种浮点数字型:浮点型 (float)、双精度浮点型(double),一种字符型(char)和一种布尔型(boolean)。对象数据类型:Java 语言是面向对象的程序设计语言,所以把基本数据类型的所有属性和方
37、法封装起来形成一个对象,就形成了对象数据类型,常用的对象数据类型包括字节(Byte) 、短整数(Short) 、整数(Integer) 、长整数(Long) 、浮点数(Float) 、双精度浮点数(Double) 、字符( Character)和布尔(Boolean) 。复杂数据类型:因为一切事物都是对象,那么如何描述一个对象的特征和行为呢?在Java 语言中,使用类(class)来承担这个任务。换句话说,类是一种可定义的新数据类型。这里的可定义包括 Java 平台已有的定义和编程人员自定义两种形式。注意:基本数据类型和对象数据类型是不同的,不仅仅是体现在大小写上,更主要的体现在是否拥有自己的
38、成员属性和成员方法,即是否按照对象形式来处理,所以它们的生命周期、使用方式等都是不一样的。221 整型整型表示无小数部分的数字,允许是负数。Java 提供了四种整数类型,如表 2-1 所示。表 2-1 Java 整型类型 描述 取值范围byte 8 位带符号整数 -128 到 127 之间的任意整数short 16 位带符号整数 -3276832767 之间的任意整数int 32 位带符号整数 -231 到 231-1 之间的任意整数long 64 位带符号整数 -263 到 263-1 之间的任意整数通常情况下,int 类型用得最多,它的表示范围大概在 -20 亿20 亿之间。对特别大的数字
39、,则需要使用 long 类型。Byte 和 short 类型主要用于特定的应用,比如低层的文件处理或者存储空间十分宝贵的大数组。Java 里,整数类型的范围与 Java 代码运行所在的机器无关。这就解决了软件移植过程中让程序员们头疼的主要问题。Java 语言各种类型的范围是固定的,因此在所有的机器上都有相同的运行结果。长整型数字有一个后缀 L(如 4000000000L) 。十六进制数据用前缀 0x(如 0xCAFE) 。222 浮点类型浮点类型表示有小数部分的数字。Java 提供了两种浮点类型,如表 2-2 所示。表 2-2 浮点类型类型 描述 取值范围Float 4 字节单精度浮点数 根据
40、 IEEE754-1985 标准Double 8 字节双精度浮点数 根据 IEEE754-1985 标准实际使用中,float 类型只用在很少的场合,大部分应用程序中使用的都是 double 类型。表示 float 类型数据时需在后面添加后缀 F,比如 3.14F。没有后缀 F 的浮点数(比如3.14)总被认为是 double 类型的。当然,你也可以用后缀 D,例如 3.14D 表示要使用双精度类型。223 字符类型字符常量是用单引号括起来的一个字符,如a,A。另外,与 C、C+相同,Java 也提供转义字符,以反斜杠()开头,将其后的字符转变为另外的含义。与 C、C+不同,Java 中的字符
41、型数据是 16 位无符号型数据,它表示 Unicode 集,而不仅仅是 ASCII 集,例如u0061 表示 ISO 拉丁码的a。这主要是因为 Java 语言在设计的时候,网络应用已经非常普遍了,计算机要处理大量的国际字符,因此,在设计 Java 的时候,就直接决定用 16 位的“大”字符集,而不是以前 C、C+使用的 ASCII 码。 前缀u 表示是 Unicode 值,而十六进制的 4 位数字则表明具体是哪个 Unicode 字符。关于 Unicode的详细信息,可以参看网站 http:/www.unicode.org。转义字符如表 2-3 所示。表 2-3 转义字符转义序列 名称 Uni
42、code 值uxxxx x 是 16 进制数 Unicode 编码 单引号字符 u0027” 双引号字符 u0022 反斜杠字符 u005cr 回车 u000dn 换行 u000at Tab 制表符 u0009b 退格 u0008与 C、C+不同,Java 中的字符型数据不能用作整数,因为 Java 不提供无符号整数类型。但是同样可以把它当作整数数据来操作。2.2.4 布尔类型布尔(boolean)类型用于逻辑条件判断,它只有两个值,true 和 false。和 C 语言不同,布尔值和整数不能互换。最后提一下,几乎每个程序中都有的 String,它并不是一种基本类型,而是对象。与C、C+相同,
43、Java 的字符串常量是用双引号(“)括起来的一串字符,如“Thisisastring.n“。但不同的是,Java 中的字符串常量是作为 String 类的一个对象来处理的,而不是一个数据。2.3 变量前面提及,Java 是强类型语言,每个变量都有类型。声明一个变量时,先给出此变量的类型,随后再写上变量名。例如:double salary;int counter;long earthPopulation;char yesChar;boolean done;变量的名字,就是标识符,按 Java 惯例,变量名由小写的单词组成。如果有多于一个的单词,则第一个单词仍然用小写开头,后面的单词首字母大写。
44、声明一个变量后,必须通过赋值语句对它进行明确的初始化。永远不要使用一个未初始化的变量的值。要对一个已声明过的变量赋值,只要把变量名写在左边,随后是等号(= ) ,然后右边是个合法的表达式就可以。int vacationDays; /这条语句是声明vacationDays=12;/这条语句是赋值下面是对字符变量赋值的例子:char yesChar;yesChar = Y;和其他语言一样,声明和初始化也可以放在同一行中,例如:int vacationDays = 12;2.4 常量在程序中存在大量的数据来代表程序的状态,其中有些数据在程序的运行过程中值会发生改变,有些数据在程序运行过程中值不能发生
45、改变,这些数据在程序中分别被叫做变量和常量。在实际的程序中,可以根据数据在程序运行中是否发生改变,来选择应该是使用变量代表还是常量代表。常量代表程序运行过程中不能改变的值。常量在程序运行过程中主要有 2 个作用:代表常数,便于程序的修改; 增强程序的可读性。常量的语法格式和变量类似,只需要在变量的语法格式前面添加关键字 final 即可。在Java 编码规范中,要求常量名必须大写。如果常量名字由两个以上单词组成,都是大写字母不好阅读,这时可以在单词之间使用下划线。因此常量的语法格式如下:final 数据类型 常量名称 = 值; final 数据类型常量名称 1 = 值 1, 常量名称 2 =
46、值 2,常量名称 n = 值 n; 例如:final double PI = 3.14; final char MALE=M,FEMALE=F; 在 Java 语法中,常量也可以首先声明,然后再进行赋值,但是只能赋值一次,示例代码如下:final int UP; UP = 1; 常量的两种用途对应的示例代码分别如下:代表常数final double PI = 3.14; int r =5; double l = 2 * PI * r; double s = PI * r * r; 在该示例代码中,常量 PI 代表数学上的值,也就是圆周率,这个是数学上的常数,后续的变量 r 代表半径,l 代表圆
47、的周长,s 代表圆的面积。则如果需要增加程序计算时的精度,则只需要修改 PI 的值 3.14 为 3.1415926,重新编译程序,则后续的数值自动发生改变,这样使代码容易修改,便于维护。增强程序的可读性int direction; final int UP = 1; final int DOWN = 2; final int LEFT = 3; final int RIGHT = 4; 在该示例代码中,变量 direction 代表方向的值,后续的四个常量 UP、DOWN、LEFT和 RIGHT 分辨代表上下左右,其数值分别是 1、2、3 和 4,这样在程序阅读时,可以提高程序的可读性。2.
48、5 作用范围每个变量都有特定的作用范围,也叫做有效范围或作用域,只能在该范围内使用该变量,否则将提示语法错误。通常情况下,在一个作用范围内部,不能声明名称相同的变量。变量的作用范围指从变量声明的位置开始,一直到变量声明所在的语句块结束的大括号为止。例如以下代码:int a = 10; a = 2; char c; 在该代码中,变量 a 的作用范围即从第三行到第五行,变量 c 的作用范围即从第六行到第七行。常量的作用范围和变量的作用范围规则完全一致。对于变量和常量的内容就介绍这么,下面是一个完整的代码,可以在 JDK 或 Eclipse中进行编译和运行。代码文件名为 VariableAndCon
49、st.java,示例代码如下:public class VariableAndConstpublic static void main(String args)int n = 0; char c = A; System.out.println(n); n = 10; System.out.println(n); System.out.println(c); 说明:在该代码中,System.out.println 的功能是输出变量中存储的值第 3 章 类和对象 人们太想用计算机来解决生活中的实际问题了。要解决生活中的具体问题,最好是让程序能够直接对应生活中的概念,比如学生、人、手机等事物。光靠编程语言中的内部数据类型,描述起来实在麻烦。以前只能靠函数将一个大问题一点一点分解,化整为零逐个解决。由于概念上不对应,因而需要更多的数据类型,更多的技巧。回忆一下我们读小学的时候,刚开始学方程式的时候,用 x,y,z 代表一个个事物的属性,比如速度、长度、时间等。如果程序员仍然沿用解数学应用题的方式,程序员都需要面对一长串独立的