diff --git a/docs/book/00-Introduction.md b/docs/book/00-Introduction.md index 8752e26..f72bcb3 100644 --- a/docs/book/00-Introduction.md +++ b/docs/book/00-Introduction.md @@ -3,25 +3,25 @@ > “我的语言极限,即是我的世界的极限。” ——路德维希·维特根斯坦(*Wittgenstein*) -这句话无论对于自然语言还是编程语言来说都是一样的。你所使用的编程语言会将你的思维模式固化并逐渐远离其他语言,而且往往发生在不知不觉中。Java 作为一门傲娇的语言尤其如此。 +这句话无论对于自然语言还是编程语言来说都是一样的。你所使用的编程语言会将你的思维模式固化并逐渐远离其他语言,而且往往发生在潜移默化中。Java 作为一门傲娇的语言尤其如此。 -Java 是一门派生语言,早期语言设计者为了不想在项目中使用 C++ 而创造了这种看起来很像 C++,却比 C++ 有了改进的新语言(他们原始的项目到最后也没有实现)。Java 最核心的变化就是加入了“虚拟机”和“垃圾回收机制”,这两个概念在本书之后的章节会有详细描述。 此外,Java 还在其他方面推动行业了发展,例如,现在绝大多数编程语言都包含文档注释语法和 HTML 文档生成的工具。 +Java 是一门派生语言,早期语言设计者为了不想在项目中使用 C++ 而创造了这种看起来很像 C++,却比 C++ 有了改进的新语言(原始的项目并未成功)。Java 最核心的变化就是加入了“虚拟机”和“垃圾回收机制”,这两个概念在之后的章节会有详细描述。 此外,Java 还在其他方面推动了行业发展。例如,现在绝大多数编程语言都支持文档注释语法和 HTML 文档生成工具。 -Java 最主要的概念之一“对象”来自 SmallTalk 语言。SmallTalk 语言坚定不移的认为“对象”(在下一章中描述)是编程的最基本单元,于是,万物皆对象。时间已经检验了这种信念,并发现它太过狂热,有些人甚至认为“对象”是完全错误的概念,应该被丢弃。就我个人而言,把一切都当成一个对象不仅是一项不必要的负担,而且还会招致许多设计朝着不好的方向发展。尽管如此,“对象”的概念依然有其闪光点。固执地要求所有东西都是一个对象(特别是一直到最底层级别)是一个设计错误,相反,完全逃避“对象”的概念似乎同样太过苛刻。 +Java 最主要的概念之一“对象”来自 SmallTalk 语言。SmallTalk 语言恪守“对象”(在下一章中描述)是编程的最基本单元。于是,万物皆对象。历经时间的检验,人们发现这种信念太过狂热。有些人甚至认为“对象”的概念是完全错误的,应该舍弃。就我个人而言,把一切事物都抽象成对象不仅是一项不必要的负担,同时还会招致许多设计朝着不好的方向发展。尽管如此,“对象”的概念依然有其闪光点。固执地要求所有东西都是一个对象(特别是一直到最底层级别)是一种设计错误;相反,完全逃避“对象”的概念似乎同样太过苛刻。 -很多 Java 语言规划设计的功能并没有像承诺的那样完成。在本书中,我会尝试解释这些原因。力争让读者知道这些功能,并知道为什么这些功能并不适用。这无关 Java 是一种好语言或者坏语言,一旦你了解了该语言的缺陷和局限性,你就能够: +Java 语言曾规划设计的许多功能并未按照承诺兑现。本书中,我将尝试解释这些原因,力争让读者知晓这些功能,并明白为什么这些功能最终并不适用。这无关 Java 是一种好语言或者坏语言,一旦你了解了该语言的缺陷和局限性,你就能够: -1. 遇到“被砍掉”的功能特性时不会疑惑。 +1. 明白有些功能特性为什么会被“废弃”。 -2. 熟悉语言边界,以便更好地设计和编码。 +2. 熟悉语言边界,更好地设计和编码。 -编程的过程就是复杂性管理的过程:业务问题的复杂性,以及依赖的计算机的复杂性。由于这种复杂性,我们的大多数编程项目都失败了。 +编程的过程就是复杂性管理的过程:业务问题的复杂性,以及依赖的计算机的复杂性。由于这种复杂性,我们的大多数软件项目都失败了。 -许多语言设计决策时都考虑到了复杂性,试图降低语言的复杂性,但在设计过程中遇到了一些更棘手的问题,最终导致语言设计不可避免地“碰壁”,复杂性增加。例如,C++ 必须向后兼容 C(允许 C 程序员轻松迁移),并且效率很高。这些目标非常实用,并且也是 C++ 在编程界取得了成功的原因之一,但同时也引入了额外的复杂性,导致某些用C++编写的项目开发失败。当然,你可以责怪程序员和管理人员手艺不精,但如果有一种编程语言可以帮助你在开发过程中发现错误,那岂不是更好? +许多语言设计决策时都考虑到了复杂性,并试图降低语言的复杂性,但在设计过程中遇到了一些更棘手的问题,最终导致语言设计不可避免地“碰壁”,复杂性增加。例如,C++ 必须向后兼容 C(允许 C 程序员轻松迁移),并且效率很高。这些目标非常实用,并且也是 C++ 在编程界取得了成功的原因之一,但同时也引入了额外的复杂性,导致某些用C++编写的项目开发失败。当然,你可以责怪程序员和管理人员手艺不精,但如果有一种编程语言可以帮助你在开发过程中发现错误,那岂不是更好? -虽然 Visual BASIC(VB)绑定在 BASIC 上,但 BASIC 实际上并不是一种可扩展的语言,在 VB 上堆积的所有扩展造成大量无法维护的语法。Perl 向后兼容 awk,sed,grep 以及其它要替换的 Unix 工具,因此它经常被指责生产了一堆“只写代码”(写代码的人自己都看不懂的代码)。另一方面,C ++,VB,Perl 和其他语言(如 SmallTalk)在设计时关注点放在了一些复杂问题的处理上,因此在解决某些特定类型问题方面非常成功。 +虽然 VB(Visual BASIC)绑定在 BASIC 上,但 BASIC 实际上并不是一种可扩展的语言。大量扩展的堆积造成 VB 的语法难以维护。Perl 向后兼容 awk、sed、grep 以及其它要替换的 Unix 工具。因此它常常被诟病产生了一堆“只写代码”(*write-only code*,写代码的人自己都看不懂的代码)。另一方面,C ++,VB,Perl 和其他语言(如 SmallTalk)在设计时重点放在了对某些复杂问题的处理上,因而在解决这些特定类型的问题方面非常成功。 -通信革命使我们所有人更容易地相互沟通:无论是一对一沟通,还是团队里的互相沟通,甚至是整个地球不同地区。据说下一次革命是一种新全球思维的形成,这种全球思维源于足量的人以及足量相互连接。Java 可能会也可能不会成为这场革命的工具之一,但至少这种可能性让我觉得我现在正在做的传道授业是一件有意义的事情。 +通信革命使我们相互沟通更加便利。无论是一对一沟通,还是团队里的互相沟通,甚至是地球上不同地区的沟通。据说下一次革命需要的是一种全球性的思维,这种思维源于足量的人以及足量相互连接。不我不知道 Java 是否能成为这场革命的工具之一,但至少这种可能性让我觉得:我现在正在做的传道授业的事情是有意义的! @@ -34,17 +34,17 @@ Java 最主要的概念之一“对象”来自 SmallTalk 语言。SmallTalk 语 - 子程序、方法、宏的概念 -- 控制语句(例如 “if”),循环结构(例如“while”) +- 控制语句(例如 **if**),循环结构(例如 **while**) -你可能已经在学校、书籍或网络上了学过这些。只要你对上述的编程基本概念觉得熟悉,你就可以完成本书的学习。 +可能你已在学校、书籍或网络上了学过这些。只要你觉得对上述的编程基本概念熟悉,你就可以完成本书的学习。 -你可以通过在 On Java 8的网站上免费下载 Think in C 来补充学习 Java 所需要的前置知识。 本书介绍了 Java 语言的基本控制机制以及面对对象编程(OOP)的概念。在本书中我引述了一些 C/C ++ 语言中的一些特性来帮助读者更好的理解 Java,毕竟 Java 是在它们的基础之上发明的,理解他们之间的区别,有助于读者更好的学习 Java。 我试图去简化这些引述,以便让没有C/C++基础的人更好的理解。 +你可以通过在 On Java 8 的网站上免费下载 《Think in C》来补充学习 Java 所需要的前置知识。本书介绍了 Java 语言的基本控制机制以及面对对象编程(OOP)的概念。在本书中我引述了一些 C/C++ 语言中的一些特性来帮助读者更好的理解 Java。毕竟 Java 是在它们的基础之上发明的,理解他们之间的区别,有助于读者更好地学习 Java。我会试图简化这些引述,尽量让没有 C/C++ 基础的读者也能很好地理解。 ## JDK文档 -甲骨文公司已经提供了标准免费的 JDK 文档。除非必要,否则在本书中将不再赘述有关 API 使用的细节。使用浏览器来即时搜索最新最全的 JDK 文档要好过翻阅本书来查找。只有在需要补充特定的示例时,我才会提供有关的额外描述。 +甲骨文公司已经提供了免费的标准 JDK 文档。除非有必要,否则本书中将不再赘述 API 相关的使用细节。使用浏览器来即时搜索最新最全的 JDK 文档好过翻阅本书来查找。只有在需要补充特定的示例时,我才会提供有关的额外描述。 ## C编程思想 @@ -54,7 +54,7 @@ Java 最主要的概念之一“对象”来自 SmallTalk 语言。SmallTalk 语 ## 源码下载 -本书中所有源代码的示例都在版权保护的前提下通过 GITHUB 免费提供。你可以将这些代码用于教育。任何人不得在未经正确引用代码来源的情况下随意重新发布此代码示例。在每个代码文件中,你都可以找到以下版权声明文件作为参考: +本书中所有源代码的示例都在版权保护的前提下通过 GitHub 免费提供。你可以将这些代码用于教育。任何人不得在未经正确引用代码来源的情况下随意重新发布此代码示例。在每个代码文件中,你都可以找到以下版权声明文件作为参考: **Copyright.txt** @@ -78,9 +78,9 @@ Java 最主要的概念之一“对象”来自 SmallTalk 语言。SmallTalk 语 ## 编码样式 -本书中代码标识符(关键字,方法,变量和类名)以粗体,固定宽度代码字体显示。像“**class**”这种在代码中高频率出现的关键字可能让你觉得粗体有点乏味。其他显示为正常字体。本书文本格式尽可能遵循 Oracle 常见样式,并保证在大多数 Java 开发环境中被支持。书中我使用了自己喜欢的字体风格。Java 是一种自由的编程语言,你也可以使用 IDE(集成开发环境)工具(如 IntelliJ IDEA,Eclipse 或 NetBeans)将格式更改为适合你的格式。 +本书中代码标识符(关键字,方法,变量和类名)以粗体,固定宽度代码字体显示。像“**class**”这种在代码中高频率出现的关键字可能让你觉得粗体有点乏味。(译者注:由于中英排版差异,中问翻译过程并未完全参照原作者的说明。具体排版格式请参考[此处](https://github.com/ruanyf/document-style-guide))其他显示为正常字体。本书文本格式尽可能遵循 Oracle 常见样式,并保证在大多数 Java 开发环境中被支持。书中我使用了自己喜欢的字体风格。Java 是一种自由的编程语言,你也可以使用 IDE(集成开发环境)工具(如 IntelliJ IDEA,Eclipse 或 NetBeans)将格式更改为适合你的格式。 -本书代码文件使用自动化工具进行测试,并在最新版本的 Java 编译通过(除了那些特别标记的错误之外)。本书重点介绍并使用 Java 8 进行测试。如果你必须了解更早的语言版本,可以在 [www.OnJava8.com](http://www.OnJava8.com) 免费下载 *Thinking in Java*。 +本书代码文件使用自动化工具进行测试,并在最新版本的 Java 编译通过(除了那些特别标记的错误之外)。本书重点介绍并使用 Java 8 进行测试。如果你必须了解更早的语言版本,可以在 [www.OnJava8.com](http://www.OnJava8.com) 免费下载 《Thinking in Java》。 ## BUG提交 @@ -95,18 +95,17 @@ Java 最主要的概念之一“对象”来自 SmallTalk 语言。SmallTalk 语 ## Java图形界面 -Java 在图形用户界面和桌面程序方面的发展可以说是一段悲伤的历史。Java 1.0 中图形用户界面(GUI)库的原始设计目标是让用户能在所有平台提供一个漂亮的界面。但遗憾的是这个理想没有实现。相反,Java 1.0 抽象窗口工具包(AWT)在所有平台都表现平平,并且有诸多限制;你只能使用四种字体。另外, Java 1.0 AWT 编程模型也很笨拙且不面向对象。我的一个曾在 Java 设计期间工作过的学生道出了缘由:早期的 AWT 设计是在仅仅在一个月内构思,设计和实施的。不得不说这是一个“奇迹”,但同时更是“设计失败”的绝佳教材。 +Java 在图形用户界面和桌面程序方面的发展可以说是一段悲伤的历史。Java 1.0 中图形用户界面(GUI)库的原始设计目标是让用户能在所有平台提供一个漂亮的界面。但遗憾的是,这个理想没有实现。相反,Java 1.0 AWT(抽象窗口工具包)在所有平台都表现平平,并且有诸多限制。你只能使用四种字体。另外,Java 1.0 AWT 编程模型也很笨拙且非面向对象。我的一个曾在 Java 设计期间工作过的学生道出了缘由:早期的 AWT 设计是在仅仅在一个月内构思、设计和实施的。不得不说这是一个“奇迹”,但同时更是“设计失败”的绝佳教材。 -在 Java 1.1 版本的AWT中 情况有所改善,事件模型采用了更加清晰的面向对象方法,并添加了JavaBeans,致力于面向易于创建可视化编程环境的组件编程模型(已废弃)。 +在 Java 1.1 版本的 AWT 中 情况有所改善,事件模型带来更加清晰的面向对象方法,并添加了JavaBeans,致力于面向易于创建可视化编程环境的组件编程模型(已废弃)。 -Java 2(Java 1.2)通过基本上用 Java 基类(JFC)替换所有内容来完成从旧 Java 1.0 AWT的转换,其中 GUI 部分称为 “Swing”。这是一组丰富的 JavaBeans,它们创建了一个合理的GUI。修订版 3(3之前都不好)比以往更适用于开发图形界面程序。 +Java 2(Java 1.2)通过使用 Java 基类(JFC)内容替换来完成从旧版 Java 1.0 AWT 的转换。其中 GUI 部分称为 Swing。这是一组丰富的 JavaBeans,它们创建了一个合理的 GUI。修订版 3(3之前都不好)比以往更适用于开发图形界面程序。 -Sun 在图形界面的最后一次尝试,称为 JavaFX。当 Oracle 收购 Sun 时,他们将原来雄心勃勃的项目(包括脚本语言)改为库,现在它似乎是 Java 官方唯一还在开发中的UI工具包(参见维基百科关于 JavaFX 的文章) - 但即使如此。JavaFX 似乎最终后也失败了。 +Sun 在图形界面的最后一次尝试,称为 JavaFX。当 Oracle 收购 Sun 时,他们将原来雄心勃勃的项目(包括脚本语言)改为库,现在它似乎是 Java 官方唯一还在开发中的 UI 工具包(参见维基百科关于 JavaFX 的文章) - 但即使如此,JavaFX 最终似乎也失败了。 -现今 Swing 依然是 Java 发行版的一部分(只接受维护,不再有新功能开发),而 Java 现在是一个开源项目,它应该始终可用。此外,Swing 和 JavaFX 有一些有限的交互性。这些可能是为了帮助开发者过渡到 JavaFX。 - -桌面程序领域似乎从未尝勾起 Java 设计师的野心。Java 没有在图形界面取得该有的一席之地。另外,曾被大肆吹嘘的 JavaBeans 也没有获得任何影响力。(许多不幸的作者花了很多精力在 Swing 上编写书籍,甚至只用 JavaBeans 编写书籍)。Java 图形界面程序大多数情况下仅用于 集成开发环境(IDE)和一些企业内部应用程序。你是可以使用 Java 开发图形界面,但这不是 Java 最擅长的领域。如果你必须学习 Swing,它可以在 *Thinking in Java* 第4版(可从 www.OnJava8.com 获得)和其他专门的书籍中学习。。 +现今 Swing 依然是 Java 发行版的一部分(只接受维护,不再有新功能开发)。而 Java 现在是一个开源项目,它应该始终可用。此外,Swing 和 JavaFX 有一些有限的交互性。这些可能是为了帮助开发者过渡到 JavaFX。 +桌面程序领域似乎从未尝勾起 Java 设计师的野心。Java 没有在图形界面取得该有的一席之地。另外,曾被大肆吹嘘的 JavaBeans 也没有获得任何影响力。(许多不幸的作者花了很多精力在 Swing 上编写书籍,甚至只用 JavaBeans 编写书籍)。Java 图形界面程序大多数情况下仅用于 IDE(集成开发环境)和一些企业内部应用程序。你可以采用 Java 开发图形界面,但这并非 Java 最擅长的领域。如果你必须学习 Swing,可以参考 *Thinking in Java* 第4版(可从 www.OnJava8.com 获得)或者通过其他专门的书籍中学习。。