Author:Bruce Eckel
出版社印前PDF,非劣质扫描版/EPUB转换版! 本书是布鲁斯•埃克尔时隔 15 年,继Thinking in Java之后又一力作,基于 Java 的 3 个 长期支持版(Java 8、11、17),讲解 Java 核心语法,并对 Java 的核心变化进行详述。全书内容通俗易懂,配合示例讲解逐步深入,并结合实际开发需要,从语言底层设计出发,有效帮读者规避一些常见的开发陷阱。主体部分共 22 章,内容包含对象、操作符、控制流、初始化和清理、复用、多态、接口、 内部类、集合、函数式编程、流、异常、代码校验、文件、字符串、泛型等。本书适合各个层次的 Java 开发者阅读,同时也可作为面向对象程序设计语言以及 Java 语 言的参考教材。
Tags
Support Statistics
¥.00 ·
0times
Text Preview (First 20 pages)
Registered users can read the full content for free
Register as a Gaohf Library member to read the complete e-book online for free and enjoy a better reading experience.
Page
1
On Java 中 文 版 基 础 卷 BYBRUCE ECKEL On Java 中文版 基础卷 计算机 / 编程语言分类建议 精装展开 转曲 加封底20220301.indd 1 2022/3/8 下午5:25
Page
2
On Java 中文版 基础卷 精装展开 转曲 加封底20220301.indd 5 2022/3/8 下午5:25
Page
3
内 容 提 要 本书是布鲁斯 • 埃克尔时隔 15 年,继 Thinking in Java 之后又一力作,基于 Java 的 3 个长 期支持版(Java 8、11、17),讲解 Java 核心语法,并对 Java 的核心变化进行详述。全书内容 通俗易懂,配合示例讲解逐步深入,并结合实际开发需要,从语言底层设计出发,有效帮读 者规避一些常见的开发陷阱。 主体部分共 22 章,内容包含对象、操作符、控制流、初始化和清理、复用、多态、接口、 内部类、集合、函数式编程、流、异常、代码校验、文件、字符串、泛型等。 本书适合各个层次的 Java 开发者阅读,同时也可作为面向对象程序设计语言以及 Java 语 言的参考教材。 定价:129.80元 读者服务热线:(010)84084456-6009 印装质量热线:(010)81055316 反盗版热线:(010)81055315 广告经营许可证:京东市监广登字 20170147 号 著 [美] 布鲁斯 • 埃克尔(Bruce Eckel) 译 陈德伟 臧秀涛 孙 卓 秦 彬 责任编辑 乐 馨 责任印制 周昇亮 人民邮电出版社出版发行 北京市丰台区成寿寺路11号 邮编 100164 电子邮件 315@ptpress.com.cn 网址 https://www.ptpress.com.cn 北京 印刷 开本:720×960 1/16 印张:52.5 2022年 3 月第 1 版 字数:1185千字 2022年 3 月北京第 1 次印刷 著作权合同登记号 图字:01-2020-7186号 ◆ ◆ ◆ Authorized translation from the English language edition, titled On Java 8 by Bruce Eckel. Copyright © 2017, © 2021 by Bruce Eckel, President, MindView LLC. Simplified Chinese-language edition published by Posts & Telecom Press Co., Ltd. Copyright © 2022. All rights reserved. 本书中文简体字版由 Bruce Eckel 授权人民邮电出版社有限公司独家出版。未经出版者事 先书面许可,不得以任何方式或途径复制或传播本书内容。版权所有,侵权必究。 On Java 8 基础卷(全).indd 2 2022/2/21 18:23:51
Page
4
O N J A V A 1 月 16 日是中文译稿完整交付的日子,距离本书翻译项 目启动,时间恰好过去一年。感谢陈德伟、臧秀涛、孙卓、 秦彬四位译者的辛勤付出。尤其感谢他们在翻译时秉承专业 严谨的工作态度,校正了原稿中存在的诸多错漏。 特别感谢 DDD 专家张逸、服务端专家梁桂钊、软件系统 架构专家王前明、译者陈德伟为本书重点章节录制了精讲视 频,有效降低了本书的阅读门槛。 同时,非常感谢对本书译文给出诸多宝贵建议的审读专 家们,他们包括:梁树桦、王明发、叶沄龙、杨光宇、施仪画、 周剑飞、张伟、王前明、杨显波、史磊、张争龙、薛伟冬、张逸、 陈骜、小判、程锦、凌江涛、杜乐、龚泽龙。 还要感谢在本书“开放出版”阶段给出反馈建议的所有 读者朋友们:陈树明、陈渝、丁春盈、冯治潍、葛瑞士、 郭雅鑫、何金刚、刘一帆、刘梓桐、刘宗威、马康、冉浩、 徐浩清、薛猛书、翟特特、赵希奥、郑炫坤、翟国平、吉宇晟、 潘陈皓。 本书能够顺利出版,离不开以上所有人的帮助和贡献。 最后,感谢为 Java 中文社区做出卓越贡献的专家学者们, 感谢阿里科学家 Kingsum、Java Champion 李三红、JVM 研发 专家杨晓峰、中间件技术专家张建锋、Java 并发专家方腾飞 为本书撰写推荐语。 致 谢 On Java 8 基础卷(全).indd 3 2022/2/21 18:23:51
Page
5
我听说这本书之所以要翻译为中文版,是因为读者的要 求,我对此感到非常荣幸。谢谢你们—这让我知道,我在 做正确的事情。也非常感谢人民邮电出版社图灵公司听到了 读者的呼声,并投入了大量资源来促成本书中文版的翻译。 Thinking in Java, 4th Edition 涵盖了 Java 5 和部分 Java 6 的内容。自那以后,尽管还有其他的显著改进,但目前 Java 8 仍然是 Java 变化最大的一个版本。对许多程序员和公司来 说,改用 Java 8 仍然是一个具有挑战性的选择,希望本书能 对其有所帮助。 应图灵公司的要求,我在各个章节中添加了一些内容, 用来讲解 Java 9 到 Java 17 的新语言特性。 中文版序 On Java 8 基础卷(全).indd 4 2022/2/21 18:50:05
Page
6
O N J A V A 本书基于 Java 8 的特性进行该语言的编程教学,同时 根据 Java 11、17 等版本的新特性做了关键更新。 我的上一本 Java 书—Thinking in Java, 4th Edition,对 于用 Java 5 编程仍然很有用,Android 编程用的就是这个语 言版本。然而随着 Java 8 的到来,这门语言发生了许多显著 的变化,编写和阅读新版本 Java 代码的感受都与以往有了明 显的不同。于是,花费两年时间编写一本新书也就在情理之 中了。 Java 8 最大的改进是引入了函数式编程的一些长处,简 单来说包括 lambda 表达式、流(stream),以及“函数式基 本类型”(functional primitive)等。即便如此,Java 依然是 一门受 Smalltalk 启发而设计的面向对象编程语言。由于受制 于向后兼容性,Java 无法彻底翻新为一门函数式编程语言。 但我还是要为 Brian Goetz 和他的团队在重重限制之下所做出 的贡献喝彩。毋庸置疑,Java 8 让这门语言获得了升华,也 有助于你学习 Java 语言。同时,我希望这本书能够让你的 Java 学习之旅变得轻松和愉悦。 关于 Java 8 后续版本的新特性 就在本书的编写过程中,Java 17 发布了。本书的内容原 本是基于 Java 8 的,但是应人民邮电出版社图灵公司(本书 前 言 On Java 8 基础卷(全).indd 5 2022/2/21 18:23:51
Page
7
vi On Java 中文版·基础卷 中文版的出版商)的要求,我也会在本书中向读者介绍 Java 9 到 Java 17 的新特性,同时 会在对应的章节标题中用“新特性:”后加该特性的说明来予以标识。此外,通过目录也 可以很容易地找到这些新特性。如果你只能使用 Java 8,你大可跳过这些章节,这样做并 不会影响你阅读本书的其他内容。也就是说,新特性只会在对应的章节中使用,而不会出 现在本书其他关于 Java 8 的主要内容中。 本书所使用的位于 GitHub 代码仓库的示例都包含一个基于 Java 8 环境的构建文件 (使用 Gradle 构建工具生成)。只要你安装的是 Java 8(或者是 Java 8 后续的新版本), 这些构建文件就可以正常运行。此外,所有用于演示 Java 8 后续版本新特性的代码示 例,其顶部的注释都会包含一个特殊标签“{NewFeature}”以及实现了该特性的 JDK 版本 号(极少数情况下,你会见到一些未完成的特性)。同时,Gradle 构建时会自动排除带有 “{NewFeature}”标签的示例。如果想要测试这些代码示例,你需要先安装对应的 JDK 版本, 然后就可以通过命令行来编译对应的代码示例了。 出版说明 本书使用了自动化的构建过程,同样的自动化过程还有解压、编译以及测试所有示例 代码。我使用 Python 3 编写了大量的应用程序来处理所有的自动化过程。 封面设计 本书的封面插图来自美国公共事业振兴署(Works Progress Administration,简称 WPA,是 1935—1943 年美国大萧条时期所创建的一个大型公共事业项目,其目标是援助 失业人口重新返回工作岗位)。此外,它也让我想起了《绿野仙踪》系列丛书的插图。我 的设计师朋友 Daniel Will-Harris 和我都十分喜爱这张图片。 致谢 Thinking in Java 一书面世至今,我很感谢它带给我的诸多益处,尤其是让我有机会 在世界各地进行演讲。借此机会,我才得以与更多的人和公司建立联系,这是无价的。 感谢 Eric Evans(《领域驱动设计》一书的作者)针对本书书名提供了宝贵意见,也 感谢所有在讨论组里帮助我确定书名的人们。 感谢 James Ward,他使我得以为本书使用 Gradle 构建工具,感谢他一直以来提供 的帮助以及跟我的友谊。感谢 Ben Muschko 对构建文件所做的优化,同时也要感谢 Hans On Java 8 基础卷(全).indd 6 2022/2/21 18:23:51
Page
8
vii前言 Dockter 给予 Ben 时间来做这件事。 感谢 Jeremy Cerise 与 Bill Frasure 参与本书的开发者活动,并提供了有价值的帮助。 感谢所有抽出宝贵时间莅临科罗拉多州克雷斯特德比特市,参加我所组织的会议、 研讨活动、开发者活动以及其他活动的嘉宾们。即便你们做出的贡献不易让人察觉,但 我想说的是,这些贡献依然是至关重要的。 献词 谨献给我敬爱的父亲 E. Wayne Eckel,他生于 1924 年 4 月 1 日,卒于 2016 年 11 月 23 日。 On Java 8 基础卷(全).indd 7 2022/2/21 18:23:51
Page
9
On Java 8 基础卷(全).indd 8 2022/2/21 18:23:51
Page
10
O N J A V A “我的语言之局限,即我的世界之局限。” —Ludwig Wittgenstein(1889—1951) 这句话不仅适用于我们日常读写的语言,也适用于编程 语言。很微妙的一件事是,一门语言会悄然无息地引导你进 入某种思维模式,同时远离其他思维模式。Java 尤其如此。 Java 是一门派生语言。当时的情况是,早期的语言设计 师不想用 C++ 来开发项目,于是创建了一门和 C++ 极为相似 的新编程语言,不过也做出了一些改进。这种新编程语言最 主要的改动是加入了虚拟机和垃圾收集机制,本书后续章节 会对这两点进行详细介绍。此外,Java 还在其他方面推动着 行业的持续发展。 Java 最主要的概念之一来自 SmallTalk,这门语言强调“对 象”(详见第 1 章)是编程的基本单位,所以任何东西都必须 是对象。经历过长时间的洗礼之后,这个概念被证明是有些 激进的,有些人甚至断定对象的概念是彻头彻尾的失败,应 该果断丢弃。我个人认为,把所有内容都封装为对象不仅是 一种负担,而且还会将许多程序设计推向错误的方向。然而 不可否认的是,在一些情况下对象依然十分有用。所以,将 一切都封装为对象(尤其是深入到最底层的时候)是一种设 计失误,但完全抛弃对象同样太过极端。 本 书 导 读 On Java 8 基础卷(全).indd 9 2022/2/21 18:23:51
Page
11
x On Java 中文版·基础卷 Java 还有一些设计决策也没有达成预期目标。关于这一点,本书中会陆续加以说明, 以便你能够理解这些语言特性如鲠在喉的原因何在。但是,我并不是要将 Java 盖棺定论 为一门优秀或拙劣的语言。我想表达的是,如果你了解了一门语言的不足之处和局限性, 当你遇到某个语言特性不可用时,就不会被卡住,以致无法继续。同时,因为你已经知晓 其局限性,所以就可以更好地进行程序设计。 编程是一门管理复杂性的艺术,而问题的复杂程度取决于机器的复杂程度。由于这种 复杂性的存在,导致了大多数编程项目的失败。 许多编程语言在设计时充分考虑了复杂性的问题,然而有时候,其他问题才是更为本 质的问题。几乎不可避免的是,那些“其他问题”才是让使用该语言的程序员最终碰壁的 原因。例如,C++ 语言不得不向后兼容 C 语言(这是为了让 C 语言程序员更容易上手), 同时还要保证运行效率。不可否认的是,这两者都是非常实用的设计目标,并且成了 C++ 语言获得成功的功臣,但是随之也带来了大量额外的复杂性。 Visual Basic(VB)语言依赖于 BASIC 语言,而 BASIC 语言本身并不是一种扩展性 良好的语言。这导致 VB 在扩展时经常出现各种非常难以维护的语法。Perl 语言能够向 后兼容 awk、sed、grep以及其他 UNIX 工具,然而这些旧时代的工具本身就是需要被替 换和更新的。结果就是,Perl 程序里面充斥着大量的“只写代码”(意思是你自己都读不 懂自己写的代码是什么意思)。不过话说回来,C++、VB、Perl 以及其他一些语言(比如 SmallTalk)都提供了一些能够处理复杂性的设计方案,并且从解决特定问题的角度来看, 它们做得还相当不错。 信息革命让我们所有人可以更为便捷地交流,不管是一对一、在群组之内还是在全 球范围内。我听说下一次革命将促生一个由足够多的人和连接组合而成的全球化的大脑。 Java 会不会成为这种革命所需的工具之一呢?一切皆有可能。 本书目标 本书每一章都会介绍一个或者一组互相关联的概念,同时这些概念不依赖于当前章节 没有介绍的特性。因此,你可以结合当前获取的知识来充分理解上下文,然后再阅读下一章。 我个人为本书设定的目标如下。 1. 循序渐进地呈现相关知识点,以便你充分理解每一个理念,之后再继续前行。同时, 精心编排语言特性的介绍顺序,以便你在看到某个特性的运用之前,先对该特性的概念有 On Java 8 基础卷(全).indd 10 2022/2/21 18:23:51
Page
12
xi本书导读 所了解。然而我并不能保证百分之百可以做到这一点,当出现意外情况时,我也会提供一 些简要的相关说明。 2. 所使用的示例尽可能地浅显易懂。有时候我会因为这一条原则而放弃引入所谓“现 实世界”的问题,然而我发现对于初学者而言,相比于因为示例解决了一个范围很大的问 题而感到惊讶,当他们理解示例中所有细节的时候会觉得更有收获。对于这一点,也许有 人会批评我只热衷于“简单示例”,但是为了产生更为明显的教育成效,我依然乐于接受 目前的做法。 3. 我相信有些细节对于 95% 的程序员而言是无关紧要的。这些细节只会让人们感到 困惑,并且增加他们对于语言复杂度的认知。 4. 为你打下坚实的编程语言基础,以便你之后学习难度更大的课程和图书时,可以充 分理解自己所遇到的问题。 语言设计缺陷 每一种语言都存在设计缺陷。屡屡让新手程序员感到不安和挫败的是,他们必须“周旋” 于各种语言特性之中,不断猜测应该用什么、不应该用什么。承认错误总是让人感到不快, 但是相比承认错误所带来的不适感,这种糟糕的新手体验要严重得多。令人尴尬的是,所 有失败的语言 / 库设计一直存在于 Java 的发布版本里。 诺贝尔经济学奖得主 Joseph Stiglitz有一句生活哲言十分应景,也叫作“承诺升级理论” (The Theory of Escalating Commitment): 持续犯错的代价由别人承担,而承认错误的代价由你自己来承担。 当我发现编程语言的设计缺陷时,我倾向于指出这些问题。Java 发展到今天,已拥 有了许多热心的拥护者,其中有些人甚至将 Java 视为自家“孩子”,而非一种语言工具。 因为我编写了一些关于 Java 的著作,所以他们以为我也会像他们一样袒护 Java。于是, 当我发现了某个语言缺陷并进行批判时,经常会出现以下两种情况: 1. 起初会引起一阵类似于“我的孩子无论对错”的愤怒,到了最后(也许会经过许多 年),该缺陷逐渐被大家广泛承认,从此被视为 Java 的历史遗留问题。 2. 更为关键的是,新手程序员并没有经历过“想不通为什么会这样”的痛苦挣扎,尤 其是发现了某个看起来不对劲儿的地方之后所产生的自我怀疑,在这种情况下人们会很自 然地认为要么是自己做错了,要么就是自己还没有搞明白。更糟糕的是,有些教授该语言 On Java 8 基础卷(全).indd 11 2022/2/21 18:23:52
Page
13
xii On Java 中文版·基础卷 的人会直接引用一些错误的概念,而不是对问题进行更加深入的研究和分析。而如果能够 理解语言的设计缺陷,即使是新手程序员也能够理解不对劲儿的地方是一个错误,从而绕 过它继续前行。 我认为,理解语言和库的设计缺陷是必要的,因为它们会影响程序员的生产力。有些 语言特性非常具有吸引力,但可能会在你毫无准备之时突然卡住你的工作进程。此外,设 计缺陷也会影响新语言的采用。探索一门语言能做什么的过程十分有趣,然而设计缺陷能 够告诉你该语言不能做什么。 多年以来,我真切地感受到 Java 语言的设计者不够关心用户。有些语言缺陷可谓太 过明显,根本没有经过深思熟虑,看起来像是设计者的思绪早已飞到了九霄云外,对自己 的用户不管不顾。而这种对程序员看似不尊重的态度,也是我当初放弃 Java 选择其他语言, 并且在相当长的一段时间内都不想回头的主要原因。 而当我重新回过头来审视 Java 的时候,Java 8 给我的感觉焕然一新,就好像是该语 言的设计者对于语言和用户的态度发生了 180 度大转弯。比如,许多被用户诟病已久,甚 至被视为语言毒瘤的特性和库都得到了修正。新引入的特性也让人耳目一新,就好像是设 计团队中新加入了几位极其关注程序员使用体验的设计者。这些设计者终于行动了起来并 致力于让 Java 语言变得更为出众,这明显好过在没有深入探究一个理念的本质时就急不 可待地把它添加进来。此外,部分新特性十分优雅(至少可以说在考虑到 Java 局限性的 情况下,已经尽可能地优雅了)。 得益于语言设计者的良苦用心(其实我并没有料想到这一点),编写本书的过程相比 以往要顺利得多。Java 8 包含了许多基础和重要的改进,而由于 Java 一直严格遵守自己 的向后兼容性承诺,做出这些改进无疑需要花费相当多的精力。因此可以预料的是,将来 也很难再见到如此重大的改进了(关于这一点,希望我是错的)。话虽如此,我依然要为 那些把 Java 重新带入正确航道的人献上掌声。当终于能够用 Java 8 编写出某段代码时, 我第一次下意识地喊出:“我爱死这个了!” 普及程度 Java 的普及具有重要意义。我的意思是,如果你学会了 Java,也许找工作会容易一些, 而且市面上有大量的 Java 培训材料、课程以及其他学习资源等。另外,如果你开一家公 司并且选择 Java 作为工作语言,招募 Java 程序员时也会容易一些。Java 的这一点优势 确实无可争辩。 On Java 8 基础卷(全).indd 12 2022/2/21 18:23:52
Page
14
xiii本书导读 话虽如此,目光短浅终归不是好事。如果你并不是真心喜爱 Java,建议你还是远离 它为好。我的意思是,如果学习 Java 只是为了找工作,无异于选择了一种不幸福的人生。 而对于公司来说,如果你选择 Java 只是为了降低招聘难度,请务必三思而后行。根据 你的实际需求,也许采用其他语言的话,你可以雇用更少的员工,但能达到更高的生产力 (比如通过我的另一本书Atomic Kotlin 学习 Kotlin 语言)。此外,使用一种更新也更激动人 心的编程语言也许更容易吸引有志之士的加盟。 不过,如果你真的喜爱 Java 这门语言,那么欢迎你加入。同时,我希望本书可以进 一步丰富你的编程经验。 Java 新的“发布节奏” Java 的版本号总是显得十分怪异。比如 Java 早期的 1.1~1.4 版本使用带小数点的数 字代表主版本号,到了 Java 5 则变成使用整数代表主版本号。 现在 Java 拥有了一套新的版本号规则,也可以称之为“发布节奏”,内容如下。 1. 每隔 6 个月发布一个新版本,使用整数作为版本号。 2. 发布的版本会包含一些试用功能,让用户可以体验和指出问题。而这种 6 个月的版 本节奏,其主要目的可能就在于让用户尽早发现功能试用的相关问题。不过,由于无法保 证这些功能之后能够长期存在,一旦这些功能出于某些原因没有达成预期的效果,它们就 会被取缔。所以,你不应该依赖这些试用性质的功能。 3. 区分清楚短期支持(Short-Term-Support, STS)版本和长期支持(Long-Term-Support, LTS)版本。Java 8、11、17 都是 LTS 版本,其他版本则是支持周期只有 6 个月的 STS 版本。 具体而言,只要有新版本问世,对 STS 版本的支持即宣告终止。类似地,一旦有新的 LTS 版本问世,(通常在一年以内)很快也会停止对原 LTS 版本的支持(这里指的是 Oracle 所 提供的免费支持,也就是说,OpenJDK 可能会支持更长时间)。 值得一提的是,STS 版本和 LTS 版本都可能包含一些试用性质的功能。 此外,每一个 Java 版本都会包含不同类型的功能试用,举例如下。 • 实验(Experimental):代表该功能仍处于早期阶段,可以认为完成度只有 25% 左右。 On Java 8 基础卷(全).indd 13 2022/2/21 18:23:52
Page
15
xiv On Java 中文版·基础卷 • 预览(Preview):该功能已经完全实现,但是在最终确定之前仍然可能会有所调整。 可以认为这些功能达到了 beta 版本,甚至是候选发布(Release Candidate, RC) 版本的标准。有时候会看到,某些功能带有标注“预览 2”(Preview 2),这大概 表示此功能已经做出了一些修改,同时希望之后可以获得一些相关的反馈。 • 孵化中(Incubating):代表一个 API 或工具(相对于语言的核心功能而言)还不 是 Java 发布内容的一部分。因为 Java 的标准下载包并不会包含这些内容,所以 必须主动获取这些 API 或工具才能使用它们。比如 jshell A,在 Java 8 里依然是一个 孵化中的功能,然而从 Java 9 开始,它就成了正式发布版本的一部分。 实验和孵化中的功能被统称为“非正式”功能。非正式功能默认不会被启用,需要通 过命令行或者 IDE 的设置菜单手动启用它们。本书之后的内容也会介绍一些 Java 17 所包 含的非正式功能,并且相关示例也会指引如何通过命令行编译这些功能。 对于大多数公司和程序员来说,关注 STS 版本不仅可能需要付出额外的精力,而且使 用这种生命周期较短的版本究竟有多少回报也让人存疑,所以我只推荐使用 LTS 版本。如 果你只更新 LTS 版本,那就没什么问题了,而且无须担心 STS 版本的快速更新所带来的 影响。 图形用户界面 对于 Java 而言,图形用户界面(GUI)和桌面编程代表着一段动荡甚至有些悲惨的 历史。 在 Java 1.0 时代,GUI 库最初的设计目的是让程序员可以创建一种在所有平台上看起 来都光鲜亮丽的 GUI。遗憾的是,这个目标并没有达成。取而代之的是,Java 1.0 通过抽 象窗口工具集(Abstract Windowing Toolkit, AWT)创建了一种在所有平台上都表现平平 的 GUI。不仅如此,这套 GUI 还有一些局限性。比如,你最多只能使用 4 种字体,而且你 不能调用操作系统中任何成熟的 GUI 组件。此外,Java 1.0 AWT 的编程模式最令人尴尬 的是,它甚至不支持面向对象编程。我的研讨班中的一名学生(他曾经在 Sun 公司经历过 最初创造 Java 语言的那段时光)曾经解释过这一情况:最初的 AWT 是在一个月之内构想、 设计和实现出来的。这样的产能效率纵然让人称奇,却也是体现框架设计重要性的一份反 面教材。 A 一个交互式的编程工具(Read-Evaluate-Print-Loop, REPL),通过命令行直接输入 Java 语句并查看其 输出结果。 On Java 8 基础卷(全).indd 14 2022/2/21 18:39:10
Page
16
xv本书导读 随后发展到 Java 1.1 AWT 事件模型的时期,情况终于有所改善。这次的 AWT 使用 一种更为清晰且面向对象的编程方式,同时添加了一种名为 JavaBeans 的组件编程模 式(现已不复存在),其目的是可以轻松创建可视化的编程环境。到了 Java 2(也叫 Java 1.2) 时期,Java 不再继续改进 Java 1.0 AWT,而是用 Java 基础类(Java Foundation Classes, JFC)重写了一切,其中 GUI 部分称为“Swing”。通过 JavaBeans 及其丰富的代码库,用 户可以创建出效果不错的 GUI。 然而,Swing 也不是 Java 语言 GUI 库的最终解决方案,随后 Sun 公司又做出了最后 一次努力,推出了 JavaFX。当 Oracle 公司收购 Sun 公司后,他们将这个曾经野心勃勃的 项目(其中甚至还包含了一种脚本语言)调整为 Java 的一个库,现在它似乎是唯一一个 得以继续开发的 UI 工具包(详情请参考维基百科关于 JavaFX 的文章)。然而即便是这种 程度的开发力度也难以为继,于是 JavaFX 和它的几个前辈一样,最终也难逃覆灭的命运。 现如今,Swing 依然是 Java 的一部分(不过只是维护,没有再开发新内容)。因为 Java 现在已经是开源项目,所以也可以轻松获取 Swing。此外,Swing 和 JavaFX 之间存 在一些有限的交互,因其原本的目的是将 Swing 的功能移植到 JavaFX 中。 归根结底,Java 在桌面领域从未真正强大过,甚至从未触及设计师的雄心壮志。至于 其他,比如 JavaBeans,也总是雷声大、雨点小(不幸的是,有不少人花费了大量心血来 编写关于 Swing 的书,甚至是仅仅关于 JavaBeans 的书),始终没有获得大众的青睐。结 果就是,Java 在桌面领域的大多数应用场景是 IDE 以及一些企业内部的应用程序。虽然人 们确实也会用 Java 开发用户界面,但要清楚地意识到,这只是 Java 语言的一个小众需求。 JDK HTML 文档 Oracle 公司为 Java 开发工具集(Java Development Kit, JDK)提供了电子文档,用 Web 浏览器即可查看。除非必要,本书不会重复文档的内容,因为你用浏览器查看一个类 的详细说明要比在本书中查找快得多(此外,在线文档的内容还是即时更新的)。所以在 本书中,通常我只会提及某处需要参考“JDK 文档”。如果 JDK 文档的内容不足以让你理 解某个特定的示例,我也会提供额外的说明。 经过测试的示例 本书提供的示例使用的是 Java 8 环境和 Gradle 编译工具。虽然我也使用新版本的 Java 测试过这些示例,但我依然推荐使用该语言的 LTS 版本:在我写这本书时,对应的 On Java 8 基础卷(全).indd 15 2022/2/21 18:23:52
Page
17
xvi On Java 中文版·基础卷 是 Java 11 或 Java 17。此外,本书所有示例都可以从 GitHub 仓库免费获取。 每当构建一个应用程序时,如果没有一套内置测试流程来测试你的代码,就无法判断 该代码是否坚实可信。因此,我为本书创建了一套测试系统,用于展示和验证大多数示例 的输出结果。具体而言,运行示例代码后的输出结果会包含一段注释,附加在代码的末尾处。 有时候注释并不显示全部内容,而是只显示开头的几行,或者开头和末尾的几行。这种嵌 入式的输出方式提升了代码可读性,降低了学习门槛,同时也提供了一种验证代码正确性 的方式。 代码规范 在本书中,各种标识符(关键字、方法名、变量名、类名等)会以等宽字体显示。而 例如“类”(class)等频繁出现的关键字,如果使用特殊字体的话反而可能会让人感到不适。 因此,具备足够辨识度的词语将采用常规字体显示。 本书示例会采用一种特定的编程风格。在尽可能满足本书格式要求的前提下,这种 编程风格和 Oracle 网站上提供的编程风格几乎完全一致,同时能够兼容大多数 Java 开发 环境。鉴于编程风格这个话题足以引发长达数小时的激烈争论,我需要在此澄清的是,我 并没有试图通过我的代码示例来表明何为正确的编程风格,我使用的编程风格完全只是根 据自己的意愿而为之。由于 Java 是一种形态自由的编程语言,所以你可以按照自己的喜 好选择编程风格。此外,在使用诸如 IntelliJ IDEA 或者 Visual Studio Code(VSCode)等 IDE(Integrated Development Environment,集成开发环境)时,你可以设置自己熟悉的 编程风格,以此解决编程风格不一致的问题。 本书的源代码都通过了自动化测试,最新版本的 Java 应该可以正常运行这些源代码 (除了被特别标识的内容)。 bug 反馈 即使作者本人用尽各种办法来检测编程错误,依然可能会有漏网之鱼,通常新的读者 可能会有所发现。在阅读本书的过程中,只要你确信自己发现了某处错误,不管是文字还 是代码示例问题,请第一时间将该错误以及你修正后的内容提交到:https://github.com/ BruceEckel/Onjava8-examples/issues。A感谢你的帮助! A 本书中文版勘误请提交到 ituring.cn/book/2935。—编者注 On Java 8 基础卷(全).indd 16 2022/2/21 18:23:52
Page
18
xvii本书导读 源代码 本书所有源代码都可以在 GitHub 网站上获取:https://github.com/BruceEckel/Onjava8- examples。这些源代码可以用于在校学习或者其他教育类场景。 源代码的版权保护主要是为了确保这些源代码可以被正确地引用,以及防止在未经授 权的情况下被随意发布。(只要是本书中引用了版权信息的源代码,在大多数情况下,使 用是没有问题的。) 在所有源代码文件里,你都会发现类似以下的版权信息说明: // Copyright.txt This computer source code is Copyright ©2021 MindView LLC. All Rights Reserved. Permission to use, copy, modify, and distribute this computer source code (Source Code) and its documentation without fee and without a written agreement for the purposes set forth below is hereby granted, provided that the above copyright notice, this paragraph and the following five numbered paragraphs appear in all copies. 1. Permission is granted to compile the Source Code and to include the compiled code, in executable format only, in personal and commercial software programs. 2. Permission is granted to use the Source Code without modification in classroom situations, including in presentation materials, provided that the book “On Java 8” is cited as the origin. 3. Permission to incorporate the Source Code into printed media may be obtained by contacting: MindView LLC, PO Box 969, Crested Butte, CO 81224 MindViewInc@gmail.com 4. The Source Code and documentation are copyrighted by MindView LLC. The Source code is provided without express or implied warranty of any kind, including any implied warranty of merchantability, fitness for a particular purpose or non-infringement. MindView LLC does not warrant that the operation of any program that includes the Source Code will be uninterrupted or error-free. MindView LLC makes no representation about the suitability of the Source Code or of any software that includes the Source Code for any purpose. The entire risk as to the quality and performance of any program that includes the Source Code is with the user of the Source Code. The user On Java 8 基础卷(全).indd 17 2022/2/21 18:23:52
Page
19
xviii On Java 中文版·基础卷 understands that the Source Code was developed for research and instructional purposes and is advised not to rely exclusively for any reason on the Source Code or any program that includes the Source Code. Should the Source Code or any resulting software prove defective, the user assumes the cost of all necessary servicing, repair, or correction. 5. IN NO EVENT SHALL MINDVIEW LLC, OR ITS PUBLISHER BE LIABLE TO ANY PARTY UNDER ANY LEGAL THEORY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR ANY OTHER PECUNIARY LOSS, OR FOR PERSONAL INJURIES, ARISING OUT OF THE USE OF THIS SOURCE CODE AND ITS DOCUMENTATION, OR ARISING OUT OF THE INABILITY TO USE ANY RESULTING PROGRAM, EVEN IF MINDVIEW LLC, OR ITS PUBLISHER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. MINDVIEW LLC SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOURCE CODE AND DOCUMENTATION PROVIDED HEREUNDER IS ON AN “AS IS” BASIS, WITHOUT ANY ACCOMPANYING SERVICES FROM MINDVIEW LLC, AND MINDVIEW LLC HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. Please note that MindView LLC maintains a Web site which is the sole distribution point for electronic copies of the Source Code, https://github.com/BruceEckel/OnJava8-examples, where it is freely available under the terms stated above. If you think you’ve found an error in the Source Code, please submit a correction at: https://github.com/BruceEckel/OnJava8-examples/issues 在编程过程中,只要你在每一个源代码文件里都保留了上面提及的版权信息,这些源 代码就可以用于你的项目以及在校学习等教育用途(包括幻灯片演示等文件)。 获取随书资源 扫描下方二维码,获取“随书源码”和“导读指南”。 On Java 8 基础卷(全).indd 18 2022/2/21 18:23:52
Page
20
目 录 什么是对象 / 001 1.1 抽象的历程 / 002 1.2 对象具有接口 / 003 1.3 对象可以提供服务 / 005 1.4 隐藏的实现 / 006 1.5 复用实现 / 008 1.6 继承 / 008 is-a 关系与 is-like-a 关系 / 012 1.7 多态 / 013 1.8 单根层次结构 / 016 1.9 集合 / 017 参数化类型(泛型) / 018 1.10 对象的创建和生命周期 / 019 1.11 异常处理 / 021 1.12 总结 / 022 安装 Java 和本书示例 / 023 2.1 编辑器 / 023 2.2 shell / 024 2.2.1 运行 shell / 024 2.2.2 目录(文件夹) / 025 2.2.3 shell 基础操作 / 025 2.3 安装 Java / 026 2.4 确认安装成功 / 027 01 03 02 2.5 安装和运行本书示例 / 028 Gradle 基础任务 / 028 对象无处不在 / 029 3.1 通过引用操作对象 / 030 3.2 必须创建所有对象 / 031 3.2.1 数据保存在哪里 / 031 3.2.2 特殊情况:基本类型 / 032 3.2.3 Java 中的数组 / 034 3.3 注释 / 034 3.4 无须销毁对象 / 035 3.4.1 作用域 / 035 3.4.2 对象的作用域 / 036 3.5 使用class关键字创建新类型 / 037 字段 / 037 3.6 方法、参数以及返回值 / 039 参数列表 / 039 3.7 编写 Java 程序 / 041 3.7.1 名称可见性 / 041 3.7.2 使用其他组件 / 042 3.7.3 static 关键字 / 043 3.8 你的第一个 Java 程序 / 045 编译和运行 / 047 3.9 编程风格 / 048 3.10 总结 / 049 什 么 是 对 象 安 装Jav a 和 本 书 示 例 对 象 无 处 不 在 001 023 029 On Java 8 基础卷(全).indd 19 2022/2/21 18:23:52
Comments 0
Loading comments...
Reply to Comment
Edit Comment