Java面向对象程序设计教程(txt+pdf+epub+mobi电子书下载)

作者:张志斌

出版社:中国铁道出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

Java面向对象程序设计教程

Java面向对象程序设计教程试读:

前言

FOREWORD

Java是一种跨平台的面向对象的程序设计语言,其前身是Oak。Java自面世后就非常流行,且发展迅速,具有卓越的通用性、高效性、健壮性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。在全球云计算和移动互联网的产业环境下,Java具备显著的优势和广阔的前景。

Java语言的风格接近于C++语言,但舍弃了C++中的指针,改以引用取代(按内存地址传递),同时移除了C++的运算符重载功能,移除了多重继承特性,改用接口取代,增加了垃圾回收器功能。

本书通俗易懂,简单明了,重点突出,既考虑了初次接触Java的初学者,又为有一定编程经验者提供了相应的指导。此外,用各种事例来阐明比较难懂或者易混淆的概念,学生可以边学边练,逐步加深和完善对核心技术的理解。

本书集合了数位多年教学一线教师的教学实例以及工作、研究经验编写而成,内容涵盖了最新的Java应用技术,具有可操作性、实践性和先进性。

本书从面向对象的编程技术着手,涉及图形用户界面、网络通信、网络编程、线程等先进的应用技术,适合作为高等学校相关专业面向对象程序课程的教材,也可作为计算机行业从业人员和编程爱好者的参考用书。

本书由张志斌任主编,张明、任志国、郑明秋、祁建宏任副主编,朱小军、岳建斌参与了编写。具体编写分工如下:第1~6章、第14章由张志斌编写,第7、8章由祁建宏编写;第10~12章由任志国编写;第12、13章由张明编写;第9章及第15章的部分小节由郑明秋编写;第15章其余部分以及附录由岳建斌和朱小军编写。岳建斌和朱小军对书中程序进行了测试并审阅了全书。

由于时间仓促,编者水平有限,书中疏漏和不妥之处在所难免,恳请专家和读者提出宝贵意见。

编者2016年12月第1章初识Java语言

Java语言与C++语言一样,都属于面向对象语言。每种计算机语言都有它的优点和适用的领域,要想更好地了解某种语言,就需要了解它产生的原因、发展的历史,以及推动它发展的动力。本章将讲述Java语言的发展历史、开发环境的搭建,以及它的优势,并动手编写第一个Java程序。1.1Java语言背景1.1.1 语言概述

1991年4月,Sun公司(已于2009年被Oracle公司收购)的James Gosling领导的绿色计划(Green Project)开始着力发展一种分布式系统结构,使用这种技术可以把E-mail发送给电冰箱、电视机等家用电器,并对它们进行控制或与它们进行信息交流。由于Green项目组的成员都具有C++背景,一开始他们使用C++语言来完成这个项目,所以首先把目光锁定了C++编译器,但很快他们就感到C++的很多不足,于是他们使用C++开发了一种新的语言Oak(Java的前身)。Internet的出现,给Java语言的发展提供了契机,当时,Mark Ardreesen开发的Mosaic和NetScape启发了Oak项目组成员,他们用Java编制了HotJava浏览器,得到了Sun公司首席运行官Scott McNealy的支持,并推动Java进军Internet。关于Java的取名有一个趣闻,有一天,几位Java成员组的会员正在讨论这个新的语言取什么名字,当时他们正在咖啡馆喝着名为Java(爪哇)的咖啡,有人就建议叫作Java,这个提议得到了其他人的高度赞赏,于是Java这个名字就这样被传开了。现在人们看到Java的Logo就是一杯冒着热气的咖啡,如图1-1所示。

图1-1 Java Logo

Java总是和C++联系在一起,而C++则是从C语言派生而来的,所以Java语言继承了这两种语言的大部分特性。Java的语法是从C继承的,Java许多面向对象的特性受到C++的影响,但是学习Java语言之前,完全不必先去了解C或者C++。1.1.2 平台概述

Sun公司将Java语言设计为可以针对移动平台、桌面系统、企业级应用进行开发的综合平台,极大地提高了Java语言的生产力。当掌握了Java语言的基本语言特性后,再通过学习特定的开发包,就可以开发移动应用程序(如手机游戏)、桌面应用程序(如人们熟知的QQ、MP3播放器都属于桌面应用程序)和企业级的高级应用程序。现在,Java语言在这3种平台的应用开发中,都占据了举足轻重的地位,Sun公司将3种平台下的开发分别命名为Java ME、Java SE和Java EE,它们是Java语言开发的3个应用领域。(1)Java SE(Java Standard Edition):Java准,于面开,可以开基于或图形界面的应用程序。Java SE中包括了Java的基础类库,也是进一步学习其他两个分支的基础。本书主要学习的内容就是Java SE中基于控制台的应用程序开发。(2)Java ME(Java Mobile Edition):Java移动版本,对应于移动平台(如手机、PDA等设备)的开发,因为这类设备的硬件差异很大,而Java恰恰具有平台无关的特性,同样的Java代码可以在不同的设备上运行,所以在移动平台开发中,Java ME非常流行。从技术角度上可以认为Java ME是经过改变的Java SE的精简版。(3)Java EE(Java Enterprise Edition):Java企业版本,对应于企业级开发,包括B/S架构开发、分布式开发、Web服务等非常丰富的应用内容,在软件开发企业中被大量应用。1.1.3 JDK的概念和下载

Sun公司提供了自己的一套Java开发环境,称为JDK(Java Development Kit)。Sun提供了多种操作系统下的JDK,版本不断升级,如:JDK1.2、JDK1.3、JDK1.4、JDK1.5、JDK1.6等。

JDK是整个Java的核心,包括了Java运行环境(Java Runtime Environment)、各种Java工具和Java基础的类库(rt.jar)。

提示: 在2004年10月,Sun发布了JDK1.5版本,它加入了泛型、枚举、annotation等特性,使得Java编程更加方便,也许是为了纪念这次重大的革新,Sun公司使用了Java5这个名字。

用户可以到Sun的网站上下载JDK,地址为http://java.sun.com(因为2009年4月Oracle宣布收购了Sun公司,当输入了这个地址之后,会发现跳转到了Oracle公司的网站上)。在下载之前需要确定在哪个操作系统中使用,比如在32位Windows操作系统中使用,就应该下载与操作系统对应的JDK版本,这里下载的是1.6版本。选择平台界面如图1-2所示,JDK下载界面如图1-3所示。

图1-2 选择使用平台

双击下载后的exe文件就可以进行安装。JDK安装完毕之后,得到如图1-4所示的目录结构。

关于JDK如何配置,如何使用JDK进行开发,请参考本章后续内容。JDK中主要的目录内容如下:(1)bin目录:存放各种命令文件,在编译Java程序、运行Java程序时需要用到该目录中的文件。比如,编译Java程序就需要用到javac命令,运行Java程序就需要用到java命令。(2)demo目录:使用Java语言编写的一些示例程序。(3)jre:Java运行环境。Java程序运行必需的运行环境,参见1.4节的内容。(4)lib:Java程序中用到的一些类库。初学阶段不必知道什么是类库,后续课程中会讲到。(5)src.zip:类库的源代码。

图1-3 下载Windows使用的JDK

图1-4 JDK目录结构1.2Java的优势和特点

经过十余年的发展,如今的Java语言比当初语言特性更完善、应用面更全、运行效率更高。从技术角度讲,Java语言的重要特点如下:(1)面向对象:继面向过程编程之后,近年来最主流的编程方式就是面向对象编程。面向对象的设计和编程方式特别适用于更复杂、更庞大的应用软件开发。(2)健壮性与安全性:Java提供了完善的内存管理机制,开发者可以通过简单的方式使用内存空间并有效地避免内存溢出。Java同时内置了安全机制,能够有效地控制应用程序的访问权限,在网络开发环境中,此特性为开发可靠的企业级应用程序提供了保障。(3)高性能:通过优化的运行机制Java可以提供不逊于其他语言的运行速度,并可以通过调用原生代码的方式提高关键程序的性能。(4)平台无关:平台无关特性可以让Java程序运行在不同的软硬件或网络环境中,代码不经修改可以发布到不同的平台,极大地增强了软件的生命力和投资价值。(5)多线程开发:Java支持多线程开发并提供了完善的并发访问控制,多线程的应用可以提高程序的性能,充分利用硬件资源(如在多核CPU的硬件环境下)。(6)分布式应用:有些复杂的应用程序系统,单台计算机难以满足需求,这时需要将程序发布到多台计算机上共同计算,这种应用称为分布式应用。Java程序可以进行此类分布式的软件开发。1.3JDK的配置

应用软件都是运行在操作系统中的,操作系统就是一个大管家,它管理所有运行的软件、硬件。软件需要在操作系统中“注册”,操作系统才能识别这个软件。比如,在机器上安装了QQ,双击桌面上的图标,QQ就能够运行,这是因为安装了QQ后,相当于QQ程序在操作系统中注册了。

同样的道理,安装JDK之后,还需要经过一系列的配置才能正确地运行Java程序。JDK的配置涉及3个环境变量:(1)JAVA_HOME:JDK的安装目录。(2)PATH:该环境变量是操作系统固有的环境变量,作用是设置供操作系统去寻找和运行应用程序的路径。也就是说,如果操作系统要运行某个命令,会按照PATH环境变量指定的目录去依次查找,以最先找到的为准,由于该环境变量中可能配置多个路径,在Windows中,同一个环境变量的多个不同的路径之间使用分号(;)隔开,比如要编译一个Java程序,需要用到javac命令,这个命令在JDK安装目录的/bin目录中,所以要在PATH环境变量中添加一个JAVA_HOME下的bin目录。(3)CLASSPATH:作用和PATH类似,Java程序是在虚拟机(本章后面的课程有对虚拟机的介绍)中运行的,Java虚拟机按照CLASSPATH环境变量指定的目录顺序去查找可以运行的Java程序。

假设JDK的安装目录为D:\Program Files\Java\jdk1.6.0_23,环境变量配置如下:

提示: CLASSPATH变量设置等号后面第一个字符是“.”表示当前目录,也就是首先到当前目录中搜索。%JAVA_HOME%是前面定义的JAVA_HOME变量的引用,其中的值为D:\Program Files\Java\jdk1.6.0_23,它与后面的\lib\tools.jar组成一个完整的路径,即D:\Program Files\Java\jdk1.6.0_23\dt.jar。

具体的配置过程如下:(1)右击“我的电脑”,选择“属性”命令,选择“高级”选项卡,如图1-5所示。(2)单击“环境变量”,在弹出窗口中的系统环境变量中单击“新建环境变量”,配置JAVA_HOME环境变量,如图1-6所示。

图1-5 “高级”选择卡

图1-6 配置JAVA_HOME环境变量(3)找到“系统变量”中的Path(见图1-7),选中后单击“编辑”按钮,在弹出的对话框中输入变量名和变量值,如图1-8所示。

图1-7 系统中的path环境变量

图1-8 设置Path环境变量

提示: 不要删除原有的内容,因为原来的内容在其他软件运行时需要用到。(4)按照新建JAVA_HOME的方式就可以新建CLASSPATH环境变量。1.4JRE的概念

JRE(Java RunTime Environment,Java运行时环境)是用来运行、测试和传输应用程序的Java平台。它包括Java虚拟机、Java平台核心类和支持文件。它不包含开发工具,如编译器、调试器和其他工具。

当编写Java程序时需要JDK,JDK中就包含了一个JRE。如果只是要运行Java程序,直接下载并安装JRE即可。1.5程序语言的编译和解释

计算机并不能直接地接受和运行用高级语言编写的源程序,源程序必须通过“翻译程序”翻译成计算机所能够理解的可运行的目标程序(由0、1组成的二进制程序),计算机才能识别和运行。这种“翻译”通常有两种方式:编译方式和解释方式。

编译方式是指利用事先编好的称为编译程序的机器语言程序进行“翻译”。当用户将用高级语言编写的源程序输入计算机后,编译程序便把源程序整个翻译成用机器语言表示的目标程序,然后计算机再运行该目标程序,以完成源程序要处理的运算并取得结果,如图1-9所示。

图1-9 编译程序

解释方式是指源程序进入计算机后,解释程序边扫描边解释,逐句输入逐句翻译,计算机逐句运行,并不产生目标程序,如图1-10所示。

图1-10 解释程序1.6第一个Java程序

首先在磁盘上新建一个目录(如java,该目录的路径中建议不要出现中文,空格等特殊字符),然后在这个文件夹中新建一个文本文件,以.java为扩展名(如Hello.java)。这里以E:\为例进行说明,如图1-11所示。

注意: 文件的扩展名是.java,而有时候用户看到的扩展名虽然是java,但实际上不是,这是因为操作系统的默认设置中隐藏了常见的文件扩展名。此时,需要去掉这个设置才能看到真实的扩展名,操作步骤如下:(1)选择E盘中的java文件夹,选择“工具”→“文件夹选项”命令,如图1-11所示。(2)选择“查看”选项卡,取消选择“隐藏已知文件类型的扩展名”复选框,如图1-12所示。

图1-11 选择“文件夹选项”命令

图1-12 取消选择“隐藏已知文件类型的扩展名”复选框

使用文本编辑器打开Hello.java文件,在其中输入如下代码:

代码说明:(1)第1~3行代码为Java中的多行注释。注释是Java中的特殊语句,是为了对程序员进行提示,利于程序维护,编译器在编译时会自动忽略注释内容。这里的注释以“/*”开头,以“*/”结尾,称为多行注释。该注释标记成对出现,不能嵌套。(2)关键字class声明一个名称为Hello的类,并且使用关键字public将其修饰为公有。Java中要求一个源文件中如果存在public的类,那么这个public类的名称和Java源文件名必须相同。(3)此行定义main()方法,main()方法是Java程序运行的入口,也就是说程序从这里开始运行。(4)“//”在Java中代表单行注释。(5)第7行语句的作用是向控制台输出字符串“这是我的第一个Java程序”。(6)第8、9行分别代表main()方法和Hello类的结束,类或方法必须使用成对的大括号将其内容括起来。

提示: 在编辑Java程序时,需要注意关键字的大小写,Java程序严格区分大小写。1.7编译和运行第一个Java程序

前面已经写好了一个Java程序源代码,但此时Java程序还不能运行。要想使计算机能够运行Java程序,需要将Java源代码转换成计算机所能够理解的二进制码,这个过程就是“编译”,Java的源代码经过编译之后,会生成一个以class结尾的文件。

那么如何进行编译呢?这时就需要用到JDK的bin目录中的javac.exe命令,前面在环境变量中已经设置了它存放的位置,这时可以在DOS窗口中直接使用这个命令。

选择“开始”→“运行”命令,输入cmd后打开DOS窗口,定位到E:\java目录中,分别输入javac Hello.java对源文件进行编译,输入java Hello运行Java程序,如图1-13所示。

在Windows中查看这个目录,发现此时多了一个文件,Hello.class文件,这就是编译以后的字节文件,如图1-14所示。

图1-13 编译和运行Java程序

图1-14 编译后形成字节码文件

源代码经过编译以后,就可以运行Java程序。与在Windows中运行程序不同,运行Java程序时,需要通过JDK安装目录下bin目录中的Java.exe命令来完成。跟javac命令一样,通过前面的环境配置后,操作系统已经知道它所在的位置,所以可以直接在DOS窗口中使用java命令来运行刚才编译过的程序。1.8Java虚拟机与跨平台性

前面Java源代码经过编译,产生了字节码文件(Java编译后的.class文件称为字节码文件),但是该字节码文件并不是计算机能直接运行的二进制文件,需要使用JDK中的java命令来运行。实质上,Java是解释执行的高级语言,为了提升运行性能,Java解释器运行的是字节码文件中的代码。

目前市面上主流的计算机平台及很多移动设备平台,都有自己的Java解释器,Java解释器加上各自的Java类加载器以及校验器等各种组件,统一封装成了Java虚拟机(Java Virtual Machine,JVM)。

Java的字节码文件是重新编码、经过语法校验的,是一个能够被JVM识别并运行的二进制文件,同时该class文件与Java源文件的语句代码一一对应。一般来说,字节码文件可以通过反编译工具反编译成源代码文件,因此这些字节码文件又称中间字节码文件。

相同的Java字节码文件,可以在不同平台下的JVM中不加修改地运行,这就是Java语言的平台无关性,也就是Java的跨平台特性,如图1-15所示。

编译后的class文件在JVM中运行,不同的计算机平台拥有不同的JVM,比如Windows操作系统中拥有Windows平台下的JVM,UNIX平台拥有UNIX平台下的JVM,这些不同平台下的JVM可以运行相同class文件,因此经过编译的Java源程序可以运行在任何平台的JVM中,并且无须重新编译。这就是Java的平台无关性,即Java的跨平台性。在程序运行时需要java命令,该命令就是启动一个JVM实例来运行命令中的Java程序。

下面使用一幅图来进一步理解Java的跨平台性,如图1-16所示。

图1-15 JVM运行Java程序

图1-16 进一步理解Java程序1.9Java程序打包

Java的Logo是一杯冒着热气的咖啡,而咖啡是用咖啡豆磨出来的,如果咖啡豆太多了,就需要将咖啡豆装到坛子中,或者容器中。通过前面的学习可知,Java程序实际上是由一些.class(字节码)文件组成的,这些字节码文件就是那些“咖啡豆”,如果字节码太多了,同样要装到“坛子”中。英文单词jar就有“广口瓶”“坛子”的意思。将多个.class文件组合打包到一个.jar文件中,这样可以方便字节码文件的管理。

回到JDK的安装目录下,进入lib文件夹,会看到一些jar文件,如图1-17所示。这些jar文件使用的是ZIP格式压缩的,所以使用WinZIP或者WinRAR软件就可以打开这些jar文件,查看其中包含的内容。

JDK的bin目录中提供了一个jar.exe程序,使用这个程序可以对.class文件进行打包。前面在E:\java目录中编译了一个Hello.class,下面使用jar命令将Hello.class文件打包进hello.jar文件中。

在命令行中输入jar -cvf hello.jar *.class,如图1-18所示。

图1-17 系统jar文件

图1-18 文件打包

在这个命令中,jar是程序名称,cvf是参数,其中c表示创建一个新的jar文件,v表示显示生成并详细输出,f表示指定生成的jar文件名。如果想更进一步了解jar程序的其他参数,可直接在控制台输入jar并按【Enter】键,即可看到jar程序提供的说明。第2章Java语言基础

学习Java语言和学习英语,汉语等语言一样,需要从基础语法学起,为后面学习面向对象打下基础。2.1标识符

生活中,每个人都有姓名,这个姓名就是一个人的标识符(identifier)。在人类语言中使用姓名对人进行标识,沟通起来就很方便。在Java语言中,当人们想表达某些事物时,也需要使用标识符对这些事物进行标识。标识符由一个或者多个字符组成,Java语言对这些字符有严格的规定。

首先是标识符的组成。Java语言规定,标识符只能由字母,数字,下画线“_”和“$”符号组成,并且数字不能用于开头,其中字母是区分大小写的。以下标识符都是合法的标识符:

userName、$My_Java、Age、java、_privateValue

以下标识符都是不合法的:(1)2010year:原因是标识符中不能以数字开头。(2)user#name:原因是标识符只能由数字、字母、下画线、$符号组成,#不合法。

其次,Java语言中预定义了一些标识符,这些标识符都有特殊的用途,称为关键字或保留字。因为关键字是语言本身预定义表示特殊用途的字符序列,所以程序员在定义标识符时,不能使用这些关键字或保留字。

以下是Java关键字和保留字不能用来做标识符。2.2数据类型和变量2.2.1 数据类型

计算机程序可以处理各种数据,包括字符、数字、声音、图片、影像等。程序运行时,这些数据要放到内存中进行处理,那么为这些数据分配多大的内存呢?Java语言中将这些数据进行了一个分类,并给每个类别起了一个名字,称为基本数据类型,同时规定了每种基本数据类型占用的内存大小。当然,程序员也可以自己来定义数据类型,这就是后面要学习的“类”。

Java中的数据类型分为基本数据类型和引用数据类型。基本数据类型使用很广泛,共分为8种,如表2-1所示。

表2-1 Java基本数据类型

问题: 为什么byte类型的范围是-128~127呢?

因为byte占用1字节空间,1字节是8个二进制位。计算机中使用补码来表示一个数字(关于补码可参阅相关计算机书籍)。8个二进制位中最高位表示数字是正数还是负数,即符号位。如果是0则表示是正数,如果是1则表示数字是负数,所以使用8个二进制位表示的最大正数就是0111 1111,即127,那么最小的负数就是1100 0000,这个数就是-128。

Java中的引用数据类型比较复杂,会在后续的章节重点介绍,常见的引用数据类型如表2-2所示。

表2-2 Java常见引用数据类型2.2.2 变量

变量是编程语言中最基本的概念。计算机在计算过程中所需的数据首先需要临时或者永久保存。使用内存来保存临时数据,并使用标识符将内存中的数据进行标识,以便程序中方便对内存中存储的数据进行存取,这个标识符称为变量。比如,编写计算矩形面积的程序,需要使用两个变量分别记录矩形的长和宽,然后计算机从变量所对应的内存中取出数据,进行乘法计算,再将计算的结果存储到另一个变量中。使用伪代码描述这个过程如下:

变量就是计算机内存中存放数据的单元,当把数值赋给变量时,实际上就是将数值存储到变量占用的内存空间。为了区分不同的变量,变量需要具有唯一的名称(Java语言中的变量命名区分大小写,有些语言并不区分)。

Java语言还要求变量在使用前必须先进行定义,变量定义就是为变量分配所需要的内存空间,内存空间一旦分配给了某一变量,该变量一直使用此内存空间存储数据,直到变量不需要使用时,这片内存空间会被收回。图2-1所示为变量分配内存空间示意图。

图2-1 为变量分配内存空间示意图

在为变量分配内存空间时会遇到一个问题,因为不同变量中保存的数据不一样,不同变量对内存空间的需求也不一样,比如用来保存年龄的变量用2字节的内存空间就足够了,保存地球到月球距离的变量就需要更多字节的内存空间,所以必须在定义变量时确定变量需要的内存空间大小。但是,每次在定义变量时计算内存空间十分麻烦,为简化变量定义、方便使用,高级编程语言中均提供了变量的“数据类型”这一概念来简化内存分配,表2-1中已经定义出每一种数据类型占用的内存空间大小。

定义变量的语法格式:

在定义变量时,可以为变量赋予初始值。例如:

在Java语言中,可以在定义变量时给变量赋予初始值,称为默认值或初始值,也可以定义时不赋值,在使用前赋值。

至此,可以总结出定义变量的3个要素:数据类型、变量名、初始值,其中数据类型和变量名是必须指定的。2.2.3 各种类型的变量

在定义变量时一旦确定了数据类型,后续无法更改,因此在定义变量前应该根据变量保存的内容仔细选择数据类型。需要注意的是,字面值常量(诸如10000、7.6这样的常量)也是具有数据类型的,如10000为int型,7.6为double型。

例如,正确的数据类型使用和赋值:

字符的特殊说明:char类型可以保存一个字符(包括字母和汉字),有些特殊字符难以表示(如换行符、制表符),可以采用下列两种方式处理:(1)使用字符反斜行“\”进行转义。(2)使用'\u0000'的方式直接输入字符十六进制的Unicode编码。

例如,使用转义字符为char类型变量赋值:

八进制与十六进制表示使用0作为前缀表示八进制数字,如017为十进制的15。使用0x作为前缀表示十六进制数字,如0x1F为是十进制的31。

类型后缀:前面说过Java会将整型的字面值常量认作int类型,浮点型的字面值常量认作double类型,所以下面两行代码会出现错误:

试读结束[说明:试读内容隐藏了图片]

下载完整电子书

若在网站上没有找合适的书籍,可联系网站客服获取,各类电子版图书资料皆有。

客服微信:xzh432

登入/注册
卧槽~你还有脸回来
没有账号? 忘记密码?