21天学通Java(第6版)(txt+pdf+epub+mobi电子书下载)


发布时间:2020-05-18 09:54:31

点击下载

作者:[美]Rogers Cadenhead 著

出版社:人民邮电出版社

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

21天学通Java(第6版)

21天学通Java(第6版)试读:

前言

有些革命出其不意地吸引了全世界的眼球。Twitter、Linux操作系统和电视剧《Cupcake Wars》的异军突起颠覆了传统思维模式。

而Java语言的巨大成功却在人们的意料之中。自从Java语言于17年前面世以来,人们就对它充满殷切的期望。当Java融入到Web浏览器时,公众以无比的热情欢迎这种新语言的到来。

Sun公司创始人Bill Joy在介绍这种新语言时,毫不掩饰其孤注一掷的心态:“15年来,我们一直力图开发出一种更佳的编程语言和环境,用于创建更简单、更可靠的软件,Java就是这种努力的最终结晶。”

Sun于1991年开发出了Java,并于4年后向公众发布;2010年,Sun被Oracle收购。从Java面世起,Oracle就一直大力支持,它将继续支持这种语言,并提供新版本。

在过去的多年中,Java始终没有辜负媒体的大肆宣传。Java之于软件开发犹如咖啡之于饮料。咖啡伴随程序员们度过了无数个不眠之夜,而Java语言让程序员们完成软件开发后便可高枕无忧。

最初,Java是使用在Web浏览器中运行的程序来提升网站吸引力的技术;今天,一些大型网站仍使用它来驱动关系型数据库支持的动态Web应用程序。Java还被用于编写深受欢迎的Android手机应用,如《愤怒的小鸟》和《Words with Friends》。

每个新Java版本都增强了其作为通用编程语言的功能,拓展了其应用领域。当前,Java的应用领域涉及桌面应用程序、Internet服务器、个人数字助理、移动设备以及众多其他的环境。它还在浏览器领域再造辉煌,用于创建通过Google Web Toolkit部署的复杂应用程序。

现在,Java语言的第8个主要版本—Java 7—完全能够同诸如C++、Python、Ruby和Visual Basic等通用开发语言媲美。

您可能熟悉诸如Eclipse、Borland JBuilder和NetBeans等Java编程工具。它们可用于开发Java程序,同时您也可以使用Oracle提供的Java开发包。Java开发包是一组用于编写、编译和测试Java程序的命令行工具,可从网站http://oracle.com/technetwork/java免费下载。Oracle提供的另一个免费工具是NetBeans,这是一个用于创建Java程序的集成开发环境,可从http://netbeans.org下载。

本书全面介绍了如何使用最新Java版和最佳的JSE技术来开发Java软件,它们是使用最广泛的Java版本和Java类库。书中的程序都是使用NetBeans创建的,并经过了详细测试,让您能够快速展示每天学到的技能。

阅读本书后,您将知道Java语言为何能成为使用最广泛的编程语言。组织结构

本书介绍Java语言以及如何使用它创建可运行在任何计算环境中的应用程序以及运行在手机和其他移动设备中的Android应用。阅读本书后,读者将对Java语言和Java类库有深入的了解,并能够开发用于完成诸如Web服务、数据库连接、处理XML和移动编程等任务的程序。

您将通过实践来学习,在每章中,您都将创建多个程序,这些程序演示了所介绍的主题。本书所有的程序源代码都可在配套网站www.java21days.com下载,该网站还提供了补充材料,如对读者问题的回答。

本书包括3周课程,分21章对Java语言及其类库进行了介绍,每周都阐述了开发Java程序的一个重要方面。第1周将介绍Java语言本身。● 第1章介绍基本知识:Java是什么、为何要学习它以及如何使用

面向对象编程技术来创建Java程序。您还将创建自己的第一个

Java应用程序。● 第2章详细介绍基本的Java元素:数据类型、变量和表达式。● 第3章详细阐述如何在Java中处理对象:如何创建对象、如何访

问其变量和调用其方法以及如何比较对象。● 第4章将更深入地介绍Java,包括数组、条件语句和循环等。● 第5章详细地探讨如何创建类——所有Java程序的基石。● 第6章深入介绍接口和包,它们对于将类分组以及组织类层次结

构很有帮助。● 第7章介绍两项最强大Java功能:异常和线程。异常可用于处理

错误,线程用于同时运行程序的各个组成部分。第2周将介绍Oracle提供的最有用的类,您可以在Java程序中使用它们。● 第8章介绍可替代字符串和数组的数据结构:链表、栈、散列映

射和位组。还介绍了一种特殊的for循环,它使得使用这些数据

结构更容易。● 第9章介绍如何使用Swing来创建图形用户界面。Swing包含大量

的类,用于表示界面、图形和用户交互。您将编写采用Nimbus

外观的程序,这种外观是Java 7新增的。● 第10章介绍十几个可用于Java程序中的界面组件,其中包括按

钮、文本框、滑块、可滚动的文本区域和图标。● 第11章阐述了如何使用布局管理器来美化用户界面。布局管理

器是一组决定组件在界面上如何排列的类。● 第12章阐述了事件处理类,以结束对Swing的介绍。事件处理类

让程序能够响应鼠标单击和其他用户操作。● 第13章介绍如何在用户界面组件上绘制几何图形和字符。● 第14章演示如何使用Java Web Start和SwingWorker,前者使得

只需单击网页中的链接就可安装Java程序,而后者是一个通过使

用线程改善应用程序性能的类。第3周介绍高级主题。● 第15章阐述如何使用流来进行输入和输出。流是让您能够访问

文件和网络以及进行其他复杂数据处理的类。● 第16章介绍了对象的序列化——一种让对象在程序没有运行时

也能存活的方式。您将学习如何将对象保存到存储介质(如硬

盘)中,将其读入到程序并将其作为对象使用。● 第17章将更深入地介绍流以编写能够与Internet通信的程序,这

包括套接字编程、缓冲区、通道和URL处理。● 第18章介绍如何使用JDBC 4.1连接到数据库。读者将学习如何

使用Java自带的开源数据库Derby的功能。● 第19章介绍如何使用XML对象模型(XOM)和开源Java类库读

写RSS文档。RSS feed是当前使用最广泛的XML方言之一,让数

百万用户能够跟踪网站更新和其他新Web内容。● 第20章探索如何使用Java和Apache XML-PRC类库编写Web服务

客户端。● 第21章介绍发展神速的Java编程领域:开发用于Android手机和

移动设备的应用。您将使用开发环境Eclipse及免费的Android开

发包,以创建可在Android手机上部署和测试的应用。针对的读者

本书针对下列3类读者介绍Java语言:● 对编程不太熟悉的新手;● 早期Java版本的用户;● 经验丰富的其他语言(如Visual C++、Visual Basic或Python)开

发人员。

阅读本书后,读者将熟悉Java语言的各个方面,并得心应手地使用Java来完成宏大的编程项目—无论是Web领域还是其他领域。

如果读者没有编程方面的经验——以前没有编写过程序,可能怀疑本书是否适合您。本书通过程序来阐述所有的概念,因此不管读者的经验是否丰富,都能够理解其中介绍的主题。如果读者熟悉变量、循环和运算符,也将从本书受益。本书的读者分以下几类:● 在学校上过编程课,对编程有所了解,并听说Java易学、功能强

大、很酷;● 有多年使用其他语言的编程经验,常听人赞美Java,因此想看看

它是否浪得虚名;● 听说Java在Web应用程序和Android编程方面非常棒。

如果读者不了解面向对象编程——Java采用的编程模式,也不用担心。本书假设读者没有面向对象设计方面的背景,在您学习Java的同时,将了解这种开发方法。

如果读者对编程一无所知,阅读本书时可能会有些吃力。Java很容易上手,读者只要耐心地阅读,并完成所有的示例,就能够掌握Java并开始使用它来编写自己的程序。约定提供与当前讨论相关的信息,有时涉及技巧方面。提供建议,如更简单的任务完成方式。指出潜在的问题,帮助读者远离灾难。

每章最后是与该章主题相关的最常见的问题和作者的回答;还有小测验和练习,帮助读者测试对该章内容的掌握程度;另外,还有认证练习,可帮助读者备考Java认证。小测验的答案可在本书末尾找到,而练习和认证练习的解决方案可在配套网站www.java21days.com找到。第1周课程Java语言第1章 Java基础第2章 Java编程基础第3章 对象第4章 数组、逻辑和循环第5章 创建类和方法第6章 包、接口和其他类特性第7章 异常和线程第 1 章 Java基础

Java试图解决众多领域的问题,实际上也确实在这方面取得了极大的成功。它让程序员能够开发应用程序服务器和手机程序、进行科学编程、编写软件以及星际导航等。——Java语言之父James Gosling如是说

1995年首次发布时,Java编程语言是一个用于万维网的颇具创意的玩具,但有很大的发展潜力。“潜力”是一个有时限的恭维之词。潜力迟早需要变成现实,否则将被“衰弱”、“浪费”、“失望”等取代。

通过阅读本书,读者在提高自身技能的同时,将能够对Java语言是否像它多年来被宣传的那样做出客观判断。

读者还将成为极具潜力的Java程序员。1.1 Java语言

现在的Java是第8个主要版本,它没有辜负当时人们对它的期望。在诸如NASA、IBM、Kaiser Permanente和Google等企业和组织中,有超过400万程序员学习了该语言并正在使用它。遍布世界各地的众多大学的计算机科学系将其列为标准教学课程。Java最初用于在网页中创建简单程序,而现在已被用于众多领域,其中包括:● Web服务器;● 关系型数据库;● 轨道望远镜;● 电子图书阅读器;● 手机。

对Web开发人员来说,Java仍很有帮助,但其应用领域已远远超出Web,成熟为最流行的通用编程语言之一。1.1.1 Java的历史

现在,有关Java语言的故事已是家喻户晓。20世纪90年代中期,Sun Microsystems的James Gosling和一个开发人员团队致力于开发一个交互式TV项目,Gosling对正在使用的C++感到失望。C++是一种面向对象编程语言,于10年前在C语言的基础上开发。

Gosling把自己关在办公室,创建了一种适合其项目的语言,该语言解决了C++中一些令其失望的问题。这个交互式TV项目以失败告终,但出乎人们意料的是,在此期间开发出来的新语言却适用于此时逐渐流行的一种新媒体——万维网。

Java于1995年秋天首次与公众见面。虽然与C++(以及当今的Java)相比,该语言的大多数特性太初级,但被称作小程序(applets)的Java程序可作为网页的一部分运行在当时最流行的浏览器Netscape Navigator中。

这种功能——第一种用于Web的交互式编程技术——给这种新语言提供了极大的舆论攻势,在短短的6个月内便吸引了数十万开发人员。

在人们对Java Web编程技术的好奇过后,该语言的整体优势逐渐明朗,程序员们仍在继续使用它。有些调查表明,当前职业Java程序员人数超过了C++程序员。

自面世以来,Java语言的发展始终受Sun Microsystems控制,但到2010年,情况发生了变化。2010年,Sun Microsystems被数据库和企业软件巨头Oracle以74亿美元的价格收购。长期以来,Oracle一直在其产品中使用Java,存在支持Java的强烈愿望,并立志在新版本中改善其功能。1.1.2 Java概述

Java是一种面向对象的、独立于平台的安全语言,它比C++更容易学习,且比C和C++更能避免被误用。

面向对象编程(OOP)是一种软件开发方法,将程序视为一组协同工作的对象。对象是使用被称作类的模板创建的,它们由数据和使用数据所需的语句组成。Java是完全面向对象的,在本章后面,当您创建第一个类并使用它来创建对象时将明白这一点。

独立于平台指的是程序无需修改便能运行在不同的计算环境中。Java程序被编译成一种名为字节码的格式,而字节码可被任何带Java虚拟机的计算机或设备运行。您可以在Windows Vista机器上创建Java程序,然后在Linux Web服务器、使用OS X的Apple Mac和三星Android手机上运行。只要平台安装了Java虚拟机,就能运行字节码。

虽然比其他语言更容易学习是程序员们争论的焦点之一,但Java主要在以下方面比C++更容易。● Java自动负责内存的分配和释放,将程序员从这种容易出错而复

杂的工作中解放出来。● Java没有指针。对经验丰富的程序员来说,指针是一种功能强大

的特性,但也容易误用以及带来严重的安全隐患。● Java只具备面向对象编程中的单继承。

Java之所以安全的两个关键因素是没有指针且能自动管理内存。1.1.3 选择开发工具

介绍Java后,接下来应用其中的一些概念,创建您的第一个Java程序。

如果读者从头到尾阅读本书后,将对Java的功能有深入了解,包括图形、文件输入和输出、XML处理和Android应用程序开发。您将能编写运行在网页、个人计算机和Web服务器以及其他计算环境中的Java程序。

开始编写程序之前,您必须在计算机上安装用于编辑、编译和运行Java程序(这些程序使用的是最新的Java版本Java 7)的软件。

有多种流行的集成开发环境(IDE)支持Java 7,如IntelliJ IDEA和开源软件Eclipse。

如果您在学习Java语言的同时学习使用这些工具,将是一项非常艰巨的任务。大多数IDE主要针对的是需要提高效率的、经验丰富的程序员,而不是刚开始学习一门新语言的新手。

最简单的Java开发工具是Java开发包,可从www.oracle.com/technetwork/java/javase/ downloads免费下载。

每当Oracle发布新的Java版本时,都会在网上提供一个支持该版本的免费开发包。最新的版本为Java SE Development Kit 7。

出于简化的目的,本书通常将该语言及其开发包简称为Java和JDK。

使用JDK开发Java程序的缺点在于,这是一组命令行工具,因此没有用于编辑程序、将其转换为Java类并进行测试的图形用户界面。命令行是用于输入文本命令的提示符。要在Windows中进入命令行,可单击“开始”按钮,再选择“附件”>“命令提示符”或“附件”>“系统工具”>“命令提示符”。

Oracle向Java程序员提供了一个免费的IDE——NetBeans,可从网站www.netbeans.com下载。对大多数人来说,NetBeans都比JDK更易于使用,因此本书将使用NetBeans。

如果您的计算机没有安装任何Java开发工具,而您又想尝试一下NetBeans,可参阅附录A,它简要地介绍了如何使用该软件,包括如何下载并安装NetBeans,以及如何使用它来创建一个Java程序,以确保NetBeans能正确运行。

在计算机上安装支持Java 7的Java开发工具后,便可以开始学习使用该语言了。有关其他Java IDE的更详细信息,请参阅IDEA和Eclipse网站,网址分别是www.jetbrains.com/ idea和www.eclipse.org。在本书的第21章,使用了Eclipse来进行Android编程。1.2 面向对象编程

对新的Java程序员来说,最大的挑战在于学习该语言的同时学习面向对象编程。

如果您不熟悉这种编程方式,这听起来可能有些令人沮丧,虽然如此,但您可以把它当作是一种买一赠一的回馈。您将通过学习Java来掌握面向对象编程技术;否则,您将无法使用这种语言。

面向对象编程是一种创建计算机程序的方法,它模仿了现实世界中物体被组合在一起的方式。

使用这种开发风格,可以创建出更可靠、更容易理解、可重用性更高的程序。

为此,必须首先研究Java是如何实现面向对象编程原理的。

如果您熟悉面向对象编程,本章的很多内容将起到温故知新的作用。即使跳过那些介绍性内容,也应创建示例程序,以积累一些开发、编译和运行Java程序的经验。

概念化计算机程序的方式很多,其中之一是将程序视为一系列依次执行的指令,这通常被称为过程化编程。很多程序员开始学习的都是过程化语言,如BASIC。

过程化语言模仿了计算机执行指令的方式,因此程序与计算机执行任务的方式一致。过程化程序员首先必须学习如何将问题分解为一系列简单的步骤。

面向对象语言从另一个角度来看待计算机程序,它将重点放在您要求计算机完成的任务,而不是计算机完成任务的方式上。

在面向对象编程中,计算机程序被视为一组相互协同、共同完成任务的对象。每个对象都是程序的独立部分,它以特定的、高度可控制的方式与其他部分进行交互。

在现实生活中,一个面向对象设计的例子是立体声音响系统。大多数系统都是通过将一组不同的对象组合在一起而构建起来的,这些对象通常被称为组件,如:● 音箱用于播放中频和高频声音;● 低音喇叭用于播放低频声音;● 调谐器用于接收无线广播信号;● CD播放器用于读取光盘中的音频数据;● 唱机用于读取唱片中的音频数据。

这些组件能够通过标准的输入/输出端子进行彼此交互。即使您买的音箱、低音喇叭、调谐器、唱机和CD播放器不是同一个厂家的,只要它们有标准端子,就可以将它们组合成一个立体声音响系统。

面向对象编程的工作原理与此相同:您创建新对象,并将其与Oracle或其他开发人员提供的对象连接起来,以组合成程序。其中每个对象都是程序中的一个组件,它们以标准方式组合在一起;每个对象都在程序中扮演着特定角色。

对象是计算机程序中的独立元素,包含一组相关的特性,能完成特定的任务。1.3 对象和类

面向对象编程是基于现实世界的情况进行建模的,对象由多种更小的对象构成。

然而,组合对象只是面向对象编程的一个方面,另一个重要特征是使用类。

类是用于创建对象的模板。使用同一个类创建的每个对象都具有相似的特性。

类包含一组特定对象的所有特性。使用面向对象语言编写程序时,并不定义各个对象,而是定义用于创建这些对象的类。

使用Java编写网络程序时,您可能创建Modem类,它描述了所有计算机调制解调器的特征,其中一些常见的特征有:● 连接到计算机的串行端口;● 发送和接收信息;● 拨叫电话号码。

Modem类是调制解调器的抽象概念模型。要在程序中有能够实际操纵的具体东西,必须有对象:必须使用Modem类创建Modem对象。使用类创建对象的过程叫做实例化(instantiation),这就是对象也被称作实例的原因所在。

在程序中,可使用Modem类创建很多不同的Modem对象,其中每个对象都可以有不同的特征,如:● 有些调整解调器是内置的,而有些是外置的;● 有些使用COM1端口,有些使用COM2端口;● 有些有差错控制功能,有些没有。

虽然有这么多的不同,两个Modem对象仍有足够多的共性,使其被视为相关的对象。图1.1显示了Modem类及使用该模板创建的几个对象。图1.1 Modem类和几个Modem对象

这里还有一个例子:使用Java可以创建一个类来表示所有的命令按钮——可单击的矩形框,出现在窗口、对话框和程序图形用户界面的其他部分。

开发CommandButton类时,可以定义如下特征:● 显示在按钮上的文本;● 按钮的大小;● 按钮的外观,如是否有三维阴影效果。

CommandButton类还可以定义按钮的行为,如:● 按钮需要单击还是双击;● 是否完全忽略鼠标单击;● 被单击后执行什么操作。

定义CommandButton类后,就可以创建按钮实例了,即CommandButton对象。这些对象都具有类定义的按钮的基本特征,但根据需要,每个对象都可以有不同的外观和行为。

通过创建CommandButton类,可避免为程序中要使用的每个命令按钮重写这些代码。此外,如果需要的话,还可以重用该CommandButton类来创建不同类型的按钮,无论是在当前程序中还是在其他程序中。

编写Java程序时,您实际上设计和构建了一组类。程序运行时,将根据需要使用这些类来创建对象,并使用它们。作为Java程序员,您的任务是创建一组合适的类,以完成程序要完成的任务。

幸运的是,不必每次从头开始。Java语言包含Java类库,其中的类超过3900个,实现了您所需的大部分基本功能。这些类随诸如JDK等开发工具一起被安装。

当您谈论如何使用Java语言时,实际谈论的是如何使用该类库以及Java定义的标准关键字和运算符。

类库处理很多任务,如数学函数、文本处理、图形、用户交互以及网络功能等。使用这些类与使用您自己创建的Java类没有什么不同。

对于复杂的Java程序,可能需要创建一整套新类,这些类可组成独立的类库,以便在其他程序中使用。

重用是面向对象编程的基本优点之一。在Java类库中,一个标准Java类是javax.swing包中的JButton,它提供了上述虚构CommandButton类的所有功能,还有众多其他的功能。在第9章,您将使用这个类来创建对象。1.4 属性和行为

Java类包含两种不同的信息:属性和行为。

这两者在VolcanoRobot中都有,这是今天将作为类实现的项目。该项目使用计算机模拟火山探测工具,它模仿的是NASA的“遥控机器人研究”计划中用来在火山裂缝中进行研究探测的Dante II机器人。

创建该程序之前,您需要学习一些如何使用Java编写面向对象程序的知识。刚接触时,面向对象概念可能难以理解,但本书将给您提供大量将这些概念付诸实践的机会。1.4.1 属性

属性(attributes)是对象区别于其他对象的数据,可用于确定属于该类的对象的外观、状态和其他性质。

火山探测工具可能有如下属性。● 状态:探测、移动、返回。● 速度:以每小时的英里数计量。● 温度:以华氏温度计量。

在类中,属性是通过变量定义的,变量是计算机程序中用来存放信息的位置。实例变量是这样的属性,即它们的值随对象而异。

实例变量(instance variable)定义了特定对象的属性。对象的类定义了属性的类型,每个实例都存储了自己的属性值。实例变量也叫做对象变量(object variable)。

每个类属性都有一个相应的变量,可以通过修改该变量的值来修改对象的属性。

例如,VolcanoRobot类定义了一个名为speed的实例变量。这必须定义成一个实例变量,因为每个机器人都以不同的速度运动。可以通过修改机器人的speed实例变量,使该机器人更快或更慢地移动。

创建对象时,可以给实例变量赋值,并在对象的整个生命期中保持不变;也可以在程序运行过程中使用该对象时,给它指定不同的值。

对于其他变量,让类的全部对象共享同一个值更合理,这些属性叫做类变量。

类变量(class variable)定义了类的属性。该变量用于类本身及其所有实例,因此不管使用该类创建了多少个对象,都只存储该变量的一个值。

在VolcanoRobot类中,存储当前时间的变量就是一个类变量。如果使用实例变量来存储当前时间,则在每个对象中,该变量的值都可能不同。这样,如果这些机器人要协同完成某项任务,就可能出现问题。

使用类变量可以避免这种问题,因为类的所有对象共享相同的值。每个VolcanoRobot对象都有权访问该变量。1.4.2 行为

行为(behavior)指的是对象能够对自身和其他对象执行的操作。行为可以用来修改对象的属性、接收来自其他对象的信息以及向其他对象发送消息让它们执行任务。

火山机器人可能有如下行为:● 检查当前温度;● 开始勘测;● 加速或减速;● 报告当前位置。

行为是使用方法实现的。

方法(method)是类中一组用来完成特定任务的相关语句。它们用来针对对象本身或其他对象执行特定任务,相当于其他编程语言中的函数和子程序。设计良好的方法只执行一项任务。

对象间能够通过方法彼此通信。类或对象可能调用其他类和对象的方法,其原因很多,例如:● 将变化告知另一个对象;● 让其他对象对自身进行修改;● 让其他对象执行某项操作。

例如,两个火山机器人可以使用方法来报告彼此的位置,以免碰撞;一个机器人可以要求另一个停下来,以便它能够顺利通过。

正如变量分为实例变量和类变量一样,方法也分为实例方法和类方法。实例方法(instance method)很常见,因此它们通常被简称为方法,用于处理类的一个对象。如果一个方法对各个对象进行修改,它必须是实例方法。类方法(class method)适用于类本身。1.4.3 创建类

为说明类、对象、属性和行为,您将开发一个VolcanoRobot类、使用这个类创建对象并在程序中使用它们。该程序的主旨是探索面向对象编程。有关Java编程语法的更详细的信息,请参阅第2章。

NetBeans将Java类组织成项目。使用项目来存储您在本书创建的类很有帮助。如果您还没有创建项目,现在就这样做。

1.选择菜单“文件”>“新建项目”,这将打开“新建项目”对话框。

2.在“类别”窗格中选择Java。

3.在“项目”窗格中选择“Java应用程序”,再单击“下一步”按钮,这将打开“新建Java应用程序”对话框。

4.在文本框“项目名称”中输入项目名(我使用的是Java21)。在您输入项目名称的同时,文本框“项目文件夹”的内容将相应地更新。请将这个文件夹记录下来——您编写的Java程序将存储在这个文件夹中。

5.单击“完成”按钮。

这将创建一个项目,您可在本书中始终使用它。

新建的项目将在NetBeans中打开。下面在这个项目中添加一个新类。

1.选择菜单“文件”>“新建文件”,打开“新建文件”对话框。

2.在“类别”窗格中选择Java。

3.在“文件类型”窗格中选择“空Java文件”,再单击“下一步”按钮,这将打开“空Java文件”对话框。

4.在文本框“类名”中输入VolcanoRobot,文本框“创建的文件”中显示了您将创建的文件的名称——VolcanoRobot.java,且不能编辑。

5.单击“完成”按钮。

这将打开NetBeans源代码编辑器,其中包含一个空文件。输入程序清单1.1所示的代码,再选择菜单“文件”>“保存”,这将保存文件VolcanoRobot.java。不要输入该程序清单中每行开头的行号,它们不是程序的组成部分。本书使用行号旨在方便描述各个代码行。程序清单1.1 VolcanoRobot.java的完整源代码  

当您保存该文件时,如果没有错误,NetBeans将自动创建一个VolcanoRobot类。这个过程成为编译类,使用的是名为编译器的工具。编译器将源代码行转换为Java虚拟机能够运行的字节码。

在程序清单1.1中,第1行的class语句定义了一个名为VolcanoRobot的类。从第1行的大括号({}到第18行的大括号())之间的所有内容都属于这个类。

VolcanoRobot类包含3个实例变量和2个实例方法。

实例变量是在第2~4行定义的:  

变量名为status、speed、temperature,其中每个变量都将用来存储一种不同类型的信息。● status:存储一个String对象——一组字母、数字、标点和其他

字符。● speed:存储一个int对象,即整数值。● temperature:存储一个float对象,即浮点数值。

String对象是使用Java类库中的String类创建的。从该程序可知,类也可以将对象作为实例变量。

VolcanoRobot类的第一个实例方法是在第6~11行定义的:  

方法的定义方式与类相似,首先是指定方法名称、返回值和其他内容的语句。

CheckTemperature( )方法位于第6行和第11行的大括号之间。可对VolcanoRobot对象调用该方法,以确定其温度。

该方法检查对象的temperature实例变量的值是否大于660。如果是,则修改另外两个实例变量:● 将变量status改为returning home,这表明温度太高,机器人应返

回基地;● 将speed改为5(假设这是机器人的最快速度)。

第二个实例方法——showAttributes( )是在第13~17行定义的:  

这个方法使用System.out.println( )来显示3个实例变量的值,同时显示一些文本用于解释每个值的含义。

如果还没有保存该文件,请选择菜单“文件”>“保存”。如果保存文件后没有修改过它,该菜单项将不可用。1.4.4 运行程序

即便您正确地输入了程序清单1.1所示的代码,并将其编译成了类,也无法使用它来做任何事情。您所创建的类定义了VolcanoRobot对象,但没有创建这种对象。

使用VolcanoRobot类的方式有两种:● 创建一个独立的Java程序,并在其中创建这个类的对象;● 在VolcanoRobot类中添加一个特殊的类方法——main( ),使之能

作为一个应用程序运行;然后在方法main( )中创建VolcanoRobot

对象。

这里使用第一种方法。

程序清单1.2是Java类VolacanoApplication的源代码,它创建一个VolcanoRobot对象、设置其实例变量并调用其方法。请按前面介绍的步骤在NetBeans中新建一个文件,并将其命名为VolacanoApplication。

在NetBeans源代码编辑器中,输入程序清单1.2所示的代码。程序清单1.2 VolcanoApplication.java的完整源代码  

选择菜单“文件”>“保存”,NetBeans将把这个文件编译成VolacanoApplication类,其中包含可供Java虚拟机运行的字节码。

编译该应用程序后,可运行它。为此,可选择菜单“运行”>“运行文件”。在NetBeans的“输出”窗口中,将显示VolacanoApplication类的输出,如图1.2所示。图1.2 VolacanoApplication类的输出

根据程序清单1.2可知,类方法main( )执行了以下操作。● 第2行:创建并命名main( )方法。所有main( )方法的格式都与此

相同,这将在第5章介绍。现在,您需要注意的是关键字static,

它表明该方法是一个类方法,供所有VolcanoRobot对象共享。● 第3行:使用VolcanoRobot类为模板创建了一个新的

VolcanoRobot对象。该对象被命名为dante。● 第4~6行:给对象dante的实例变量赋值——status被设置为

exploring,speed为2,temperature为510。● 第8行:在该行及随后的几行中,调用了dante对象的

showAttributes( )方法。这个方法显示实例变量status、speed和

temperature的当前值。● 第9行:在该行和随后的几行中,使用System.out.println( )语句来

显示圆括号内的文本。● 第10行:将speed实例变量的值设置为3。● 第13行:将temperature实例变量的值设置为670。● 第16行:调用dante对象的checkTemperature( )方法。该方法检

查实例变量temperature的值是否大于660。如果是,则将新的值

赋予status和speed。如果由于某种原因,您不能使用NetBeans来编写Java程序,而必须使用JDK,请参阅附录D和E。附录D介绍了如何安装JDK,而附录E介绍了如何使用JDK来编译和运行Java程序。1.5 组织类和类行为

Java面向对象编程还涉及另外三个概念:继承、接口和包,这些都是用于组织类和类行为的机制。1.5.1 继承

继承是面向对象编程中最重要的概念之一,直接影响您如何设计和编写Java类。

继承是一种机制,让一个类能够继承另一个类的所有行为和属性。

通过继承,一个类可自动拥有现有类的所有功能,因此只需定义与现有类不同的地方。

通过继承,所有的类(无论是您创建的类,还是Java类库中的类)都以严格的层次结构来组织。

继承其他类的类叫子类,被继承的类叫超类。

一个类只能有一个超类,但可以有任意数目的子类。子类继承了其超类的所有属性和行为。

实际上,这意味着如果超类具备您的类所需的行为和属性,则无需重新定义或复制代码,便可获得同样的行为和属性。子类将自动从其超类那儿获得这些东西,而超类又从其超类获得相应的东西,依此类推。这样便形成了层次结构。子类将拥有层次结构中位于它上面所有类的特性,同时也有自己的特性。

这与您从父母那里继承各种东西(如身高、头发颜色、喜欢花生黄油和香蕉三明治)相同。它们也从其父母那里继承了一些特征,它们的父母又是从它们父母的父母那里继承,这样一直追溯到伊甸园、宇宙大爆炸或大爆炸之前。

图1.3显示了类的层次排列方式。图1.3 类层次结构

Java类层次结构的顶端是类Object。

所有的类都是从这个超类继承而来的。Object是层次结构中最通用的类,定义了Java类库中的所有类的行为。

在层次结构中越往下,类的用途越具体。在层次结构的顶部定义的是抽象概念,越往下,这些概念越具体。

使用Java创建新类时,常常希望它具备某个现有类的所有功能,并做一些修改。例如,您可能希望有一个新版本的CommandButton,能够在单击时发出声音。

要不经过任何重建工作而得到CommandButton的所有功能,可以将您的类定义为CommandButton的子类。

这样,您的类将自动继承CommandButton定义的行为和属性以及CommandButton的超类定义的行为和属性。您所需要关心的只是新类不同于CommandButton的内容。子类化(subclassing)机制用于定义新类及其与超类之间的差别。

子类化指的是通过继承已有的类来创建一个新类。子类只需指出其属性和行为不同于超类的地方。

如果您的类定义了全新的行为,且不是其他类的子类,则可以直接继承Object类。

如果您创建类时没有指定超类,Java将认为它直接继承Object。前面创建的VolcanoRobot类没有指定超类,因此是Object的子类。1.5.2 创建类层次结构

如果您创建了大量的类,则应该让您的类从现有类层次结构继承,并构建自身的层次结构。这有如下优点:● 可将多个类共有的功能放在一个超类中,这样就可以在更底层的

类中重复使用这些功能;● 对超类的修改将自动反映到其所有的子类、子类的子类等中,而

无需修改或重新编译更底层的类,它们将通过继承获得新的信

息。

例如,假设创建了一个Java类来实现火山勘测机器人的所有特征(这并不需要太多的想象力)。

该VolcanoRobot类已经完成,它工作正常,一切都很好。现在您在NASA的老板要求您创建一个名为MarsRobot的Java类。

这两种机器人有相似的特征:都是在恶劣环境下执行研究工作的机器人,且都跟踪其当前的温度和速度。

您首先想到的可能是,打开源代码文件VolcanoRobot.java,将其大部分代码复制到新的源代码文件MarsRobot.java,再根据新机器人的用途做必要的修改。

更好的办法是找出MarsRobot和VolcanoRobot的共同功能,并将它们放到一个更通用的类层次结构中。对于只有类VolcanoRobot和MarsRobot的情况,这也许是项繁重的工作,但如果您还想加入MoonRobot、UnderseaRobot和DesertRobot,情况将如何呢?将共同的行为放在一个或多个可重用的超类中将极大地减少所需完成的工作量。

要设计一个满足该目标的类层次,应从Object开始,它是所有Java类的祖宗。

这些机器人的老祖宗可能名为Robot。一般而言,机器人可被视为一种自控的探测设备。在Robot类中,您只定义使其成为自控的、用于探测的设备的行为。

在Robot下面有两个类:WalkingRobot和DrivingRobot。这两个类之间明显的区别在于,一个靠腿移动,另一个靠轮子移动。步行机器人的行为可能包括弯腰检东西、蹲下、跑动等。驱动式机器人的行为与此不同。图1.4显示了您目前已有的类层次结构。图1.4 基本的Robot层次结构图

现在,这个层次可以更具体。从WalkingRobot类可以派生出多个类:ScienceRobot、 GuardRobot、SearchRobot等。另外,您可以抽取出更多的功能,创建两个中间类TwoLegged和FourLegged,其中每个类都有不同的行为(见图1.5)。图1.5 两条腿和4条腿的步行机器人

最后,整个层次结构便完成了,并为VolcanoRobot找到了合适的位置。它可以是ScienceRobot的子类,ScienceRobot是WalkingRobot的子类,WalkingRobot是Robot的子类,而Robot又是Object的子类。

诸如status、temperature和speed等属性应放在什么位置呢?应放在最合适的地方。因为所有机器人都需要跟踪其所处环境的温度,因此在Robot中将temperature定义为一个实例变量是合理的。这样所有的子类都将有这个实例变量。请记住,只需在层次结构定义行为或属性一次,它将自动被每个子类继承。要设计出高效的类层次结构,需要做大量的规划和修订。当您试图将新的属性和行为加入到层次结构中时,很可能发现需要将一些类移到另一个位置,以便减少重复的特征和冗余的代码。1.5.3 使用继承

在Java中,继承比现实生活中的继承要简单得多。Java中继承时,不需要遗嘱,也不需要法庭。

当您创建新对象时,Java将记录该对象及其超类的每个变量。这样,所有的类组合成当前对象的模板,每个对象都将包含合适的信息。

方法的工作原理与此相似,新对象可以访问其所属类及其超类的所有方法,这是在运行期间当方法被使用时动态确定的。如果您调用了特定对象的某个方法,Java虚拟机将首先检查该对象所属的类是否有该方法。如果没有,则在其超类中查找,依此类推,直到找到该方法的定义为止,如图1.6所示。图1.6 如何在类层次结构中查找方法

如果子类中定义了名称和其他方面都与超类相同的方法,情况将复杂起来。在这种情况下,首先被找到的方法是被使用的方法(从层次结构的底部开始向上查找)。

因此,可以在子类中创建一个方法来防止调用超类中定义的方法。为此,该方法的名称、返回值和参数必须与超类方法相同。这被称为覆盖,如图1.7所示。图1.7 覆盖方法Java的继承形式称为单继承(single inheritance),因为每个Java类都只能有一个超类(虽然任何超类都可以有多个子类)。在其他面向对象编程语言(如C++)中,类可以有多个超类,并继承所有超类的变量和方法,这叫多重继承(multiple inheritance)。Java只允许单继承,简化了继承机制。1.5.4 接口

单继承简化了类之间的关系,并使这些类实现的功能更容易理解和设计。然而,它也有局限性,尤其是当您有一些相似的行为,它们需要在类层次结构的不同分支间进行复制时。Java通过使用接口来解决这些共享行为的问题。

接口是一组方法,它指出类除了从超类继承的行为外,还有其他行为。接口中的方法并没有定义行为,这项任务将由实现该接口的类去完成。

例如,Comparable接口包含一个这样的方法,即对属于同一个类的两个对象进行比较,以判断在排序链表中,哪个应在前面。任何实现了该接口的类都告诉其他对象,它能够确定其对象的排列顺序。如果没有该接口,类将不会有这种行为。

有关接口的内容将在第6章介绍。1.5.6 包

在Java中,包用于将相关的类和接口编组,使得更容易在其他类中引用它们;包还避免了类之间潜在的命名冲突。

引用Java类时,可使用简短的名称,如Object,也可使用完整的名称,如java.lang.Object。

默认情况下,您的Java类只需通过简短的名称就可引用java.lang包中的类。java.lang包提供了基本的语言功能,如字符串处理和数学运算。要使用其他包中的类,必须使用完整的包名或使用import语句将包导入到源代码文件中。

例如,由于类Color位于包java.awt中,所以在程序中通常要使用java.awt.Color来引用它。

如果使用import语句导入了java.awt包,便可使用Color来引用这个类。1.6 总结

如果您是首次接触面向对象编程,则本章的内容太理论化,您可能一时无法理解。

当您的头脑中满是OOP概念和术语时,可能担心无法消化余下的关于Java的20章内容。

不要烦恼。保持冷静,继续向前。

至此,您应对类、对象、属性和行为有基本了解,同时还应熟悉实例变量和方法。在下一章,您将使用它们。

有关面向对象编程的其他方面(如继承和包),将在后面的课程中做更详细的介绍。

在本书后面的每个课程中,您都将使用面向对象编程。要使用Java编写程序,别无他途。

阅读完第一周的课程后,您将拥有使用对象、类、继承以及面向对象编程的其他所有方面的经验。1.7 问与答

问:实际上,方法是在类中定义的函数。既然它们无论从外观和行为方面都类似于函数,为什么不将它们叫做函数呢?

答:有些面向对象编程语言确实将它们叫做函数(C++将它们叫做成员函数)。其他一些面向对象语言将位于类(对象)内、外的函数区分开来,因为在这些语言中,使用不同的术语对理解每个函数的工作原理至关重要。因为其他语言有这种区别,同时术语“方法”在面向对象技术中很常用,所以Java也使用这个术语。

问:实例变量和实例方法同类变量和类方法之间有何区别?

答:在Java程序中,您所做的几乎每项工作涉及的都是实例(也叫对象)而不是类。然而,对于有些行为和属性,存储在类本身中要比存储在对象中更合理。例如,java.lang包中的Math类包含一个名为PI的变量,它存储的是兀的近似值。这个值是不变的,因此这个类的不同对象没有必要保留自己的PI变量。另一方面,每个String对象都包含了一个length( )方法,它计算该String中的字符数。这个值对于String类的每个对象都可能不同,因而它必须是实例方法。

类变量始终驻留在内存中,直到Java程序结束运行,因此应慎用类变量。如果类变量指向一个对象,该对象也将始终驻留在内存中。这是一种导致程序占据太多内存且运行缓慢的常见问题。

问:如果在Java类中导入整个包,是否会增大这个类编译后的尺寸?

答:不会。术语“导入”容易让人误解。关键字import不会将指定类或包的字节码加入到当前创建的类中,而只是使得在一个类中引用另一个类更容易。

通过导入,在Java语句中引用类时,可使用简短的名称,这是导入的唯一目的。在代码中,如果总是必须指定完整的类名,如javax.swing.JButton和java.awt.Graphics,而不是JButton和Graphics,那将非常繁琐。1.8 小测验

请回答下述3个问题,以复习本章介绍的内容。答案见附录F。

1.类又叫什么?

A.对象;

B.模板;

C.实例。

2.创建子类时,必须定义它的哪些方面?

A.什么都不用定义,它已定义好了;

B.不同于超类的内容;

C.各个方面。

3.类的实例方法表示的是什么?

A.类的属性;

B.类的行为;

C.根据类创建的对象的行为。1.9 认证练习

下面的问题是Java认证考试中可能出现的问题,请回答该问题,而不要查看本章的内容。

下面的哪些说法是正确的?

A.使用同一个类创建的所有对象都必须相同;

B.使用同一个类创建的所有对象可以互不相同;

C.对象将继承用于创建它的类的属性和行为;

D.类将继承其超类的属性和行为。

答案见本书的配套网站www.java21days.com。单击链接01,再单击链接Certification Practice。1.10 练习

为巩固今天介绍的知识,请尝试完成下面的练习。

1.在VolcanoApplication类的main( )方法中,再创建一个名为virgil的VolcanoRobot对象,设置其实例变量,并将它们的值显示出来。

2.为国际象棋中的棋子创建一个继承层次结构,并决定在层次结构的什么位置定义实例变量color、startingPosition、forwardMovement和sideMovement。

解决方案见本书的配套网站www.java21days.com。第 2 章 Java编程基础

Java程序是由类和对象组成的,而对象和类又是由方法和变量组成的。方法是由语句和表达式组成的,表达式又由运算符组成。

至此,您可能担心Java就像俄罗斯套娃。每个洋娃娃里边都有一个更小的洋娃娃,而后者同前者一样错综复杂。

本章将消除大洋娃娃的困扰,揭示Java编程的最小元素。本章暂时撇开类、对象和方法,介绍单行Java代码中的基本元素。

这包括以下内容:● Java语句和表达式;● 变量和基本数据类型;● 常量;● 注释;● 字面量;● 算术运算符;● 比较运算符;● 逻辑运算符。2.1 语句和表达式

您在Java程序中要完成的所有任务都可分解为一系列的语句。在编程语言中,语句是简单命令,它导致计算机执行某种操作。

语句表示程序中发生的单个操作。下面是3条简单的Java语句:  

有些语句能够提供一个值,如在将两个数相加或比较两个变量是否相等时。

生成一个值的语句被称为表达式。这个值可以存储下来,供程序后面使用,也可以立即用于另一条语句中或被丢弃。语句生成的值称为返回值。

有些表达式生成数字值,如将两个数相加或相乘时。有些表达式生成布尔值(true或false)或Java对象,这将在本章后面介绍。

虽然在很多Java程序中,每条语句占一行,但这只是一种格式,并不能决定语句到哪里结束。Java语句都以分号(;)结尾。程序员可以在一行放置多条语句,且它们都能够通过编译,如下所示:

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

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载