一、Java 程序设计概述
1996年 Java 第一次发布就引起了人们的极大兴趣。关注 Java 的人士不仅限于计算机出版界,还有诸如《纽约时报》《华盛顿邮报》和《商业周刊》这样的主流媒体。Java 是第一个也是唯一一个在 National Public Radio上占用了 10分钟 时间进行介绍的程序设计语言,并且还得到了 100 000 000 美元的风险投资基金。这些基金全部用来支持用这种特别的计算机语言开发的产品。你可能想了解 Java 语言的发展,这一章就会带你简单地重温这段历史。
1.1、Java 程序设计平台
在本书的第 1 版中,我和合著者 Gary Cornell 是这样描述 Java 的:
“作为一种计算机语言,Java 的广告词确实有点夸大其词。当然,Java 的确是一种优秀的程序设计语言。作为一个名副其实的程序设计人员,使用 Java 无疑是一个比较好的选择。我们认为:Java 本来有潜力成为一种卓越的程序设计语言,但可能有些为时过晚。一旦一种语言得到广泛应用,与现存代码尴尬的兼容性问题就摆在了人们的面前。”
关于这段文字,我们的编辑受到 Sun 公司某高层人士的严厉批评(Sun 是最早开发 Java 的公司)。Java 有许多非常优秀的语言特性,本章稍后会详细地讨论这些特性。但它确实也有缺点,由于兼容性需求,新增的一些特性就没有原有的特性那么精巧。
但是,正像我们在第 1 版中所说的,Java 并不只是一种语言。在此之前出现的那么多种语言都没有引起那么大的轰动。Java 是一个完整的平台,有一个庞大的库,其中包含了大量可重用的代码,还有一个提供诸如安全性、跨操作系统的可移植性以及自动垃圾收集等服务的执行环境。
作为一名程序设计人员,你可能希望能有这样一种语言,既要有令人舒适的语法,也要有易于理解的语义(C++ 就不是这样的语言)。Java 完全满足这些要求,另外还有很多其他优秀语言也能满足要求。不过尽管有些语言提供了可移植性、垃圾收集等特性,但它们没有提供一个丰富的库。如果你想要酷炫的绘图功能、网络连接或数据库存取特性,就必须自己动手编写代码。而 Java 一应俱全,它具备所有这些特性,是一种功能齐全的出色语言和一个高质量的执行环境,同时有一个庞大的库。正是因为 Java 集多种优势于一身,所以对广大程序设计人员有着不可抗拒的吸引力。
1.2、Java 白皮书的 11 个关键术语
Java 的设计者编写了一个颇有影响力的白皮书,来解释设计初衷以及完成的情况,他们还发布了一个简短的摘要。这个摘要按以下 11 个关键术语进行组织:
(1)简单性
(2)面向对象
(3)分布式
(4)健壮性
(5)安全性
(6)体系结构中立
(7)可移植性
(8)解释性
(9)高性能
(10)多线程
(11)动态性
在后面的小节中,我们将提供一个小结,给出白皮书中的相关说明(这是 Java 设计者对各个关键术语的描述),另外我还会根据使用 Java 当前版本的经验,给出对这些术语的理解。
白皮书可以在:The Java Language Environment: Contents 上找到。

Java 白皮书
关于 11 个关键术语的概述请参见:The Java Language: A White Paper。

11 个关键术语
1.2.1、简单性
我们希望构建一个无须深奥的专业训练就可以进行编程的系统,并且要符合当今的标准惯例。因此,尽管我们发现 C++ 不太适用,但在设计 Java 的时候还是尽可能地接近 C++,以使系统更易于理解。Java 剔除了 C++ 中许多很少使用、难以理解、容易混淆的特性。在我们看来,这些特性带来的问题远远多于它们的好处。
的确,Java 语法是 C++ 语法的一个“纯净”版本。这里没有头文件、指针运算(甚至没有指针语法)、结构、联合、操作符重载、虚基类等(请参阅本书各个章节给出的 C++ 注释,其中比较详细地解释了 Java 与 C++ 之间的区别)。不过,Java 设计者并没有试图修正 C++ 中所有不适当的特性。例如,switch 语句的语法在 Java 中就没有改变。如果你了解 C++,会发现可以轻而易举地转换到 Java 语法。
Java 发布时,实际上 C++ 并不是最常用的程序设计语言。很多开发人员都在使用 VisualBasic 和它的拖放式编程环境。这些开发人员并不觉得 Java 简单。很多年之后 Java 开发环境才迎头赶上。如今,Java 开发环境已经远远超越了大多数其他编程语言的开发环境。
“简单”的另一面是“小”。Java 的目标之一是支持开发能够在小型机器上独立运行的软件。基本的解释器和类支持大约仅为 40KB,再加上基础的标准类库和线程支持(基本上是一个自包含的微内核),大约需要增加 175KB。
在当时,这是一个了不起的成就。当然,由于不断的扩展,类库已经相当庞大了。现在还有一些带有较小类库的独立版本,这些版本适用于嵌入式设备和智能卡。
1.2.2、面向对象
简单地讲,面向对象设计是一种程序设计技术。它将重点放在数据(即对象)和对象的接口上。用木匠打一个比方:一个“面向对象的”木匠主要关注的是所制作的椅子,其次才是使用的工具;一个“非面向对象的”木匠主要考虑的则是使用的工具。在本质上,Java 的面向对象能力与 C++ 是一样的。开发 Java 时面向对象技术已经相当成熟。Java 的面向对象特性与 C++ 旗鼓相当。Java 与 C++ 的主要不同点在于多重继承,在 Java 中,取而代之的是更简单的接口概念。与 C++ 相比,Java 提供了更丰富的运行时自省功能(有关内容将在第 5章中讨论)。
1.2.3、分布式
Java 有一个丰富的例程库,用于处理 HTTP 和 FTP 之类的 TCP/IP 协议。Java 应用程序能够通过 URL 打开和访问网上的对象,其便捷程度就好像访问本地文件一样。如今,这一点被认为是理所当然的,不过在 1995 年主要还是从 C++ 或 Visual Basic 程序连接 Web 服务器。
1.2.4、健壮性
Java 的设计目标之一是要让用 Java 编写的程序具有多方面的可靠性。Java 非常强调进行早期的问题检测、后期的动态(运行时)检测,以及消除容易出错的情况……Java 与 C/C++ 最大的不同在于 Java 采用的指针模型可以消除重写内存和损坏数据的可能性。Java 编译器能够检测许多其他语言中仅在运行时才能够检测出来的问题。至于第二点,对于曾经花费几个小时来检査由于指针 bug 而引起内存冲突的人来说,一定很喜欢 Java 的这一特性。
1.2.5、安全性
Java 要适用于网络 / 分布式环境。为了实现这个目标,安全性颇受重视。使用 Java 可以构建防病毒、防篡改的系统。
从一开始,Java 就设计成能够防范各种攻击,其中包括:
(1)运行时堆栈溢出,这是蠕虫和病毒常用的攻击手段。
(2)破坏自己的进程空间之外的内存。
(3)未经授权读写文件。
起初,Java 对下载代码的态度是“尽管来吧!”不可信代码在沙箱环境中执行,在这里它不会影响主系统。用户可以确信不会发生不好的事情,因为 Java 代码不论来自哪里,都不能逃离这个沙箱。
不过,Java 的安全模型很复杂。Java 开发包(Java Development Kit,JDK)的第一版发布之后不久,普林斯顿大学的一些安全专家就发现一些小 bug 会允许不可信的代码攻击主系统。最初安全 bug 可以快速修复。
遗憾的是,经过一段时间之后,黑客已经很擅长找出安全体系结构实现中的小漏洞。Sun 公司以及之后的 Oracle 公司为不断修复 bug 经历了一段很是艰难的日子。
遭遇多次高调攻击之后,浏览器开发商和 Orace 公司变得越来越谨慎。有一段时间,远程代码必须有数字签名。如今,通过浏览器交付 Java 应用已经是很遥远的记忆。
现在看来,尽管 Java 安全模型没有原先预想的那么成功,但 Java 在那个时代确实相当超前。微软公司提出了一种与之竞争的代码交付机制,称为 ActiveX,其安全性完全依赖于数字签名。显然这是不够的,因为微软公司的产品的任何用户都可以证实,一些知名开发商的程序确实会崩溃并对系统产生危害。
1.2.6、体系结构中立
编译器生成一个体系结构中立的目标文件格式,这是一种编译型代码,这些编译型代码可以在很多处理器上运行(只要它们有 Java 运行时系统)。Java 编译器通过生成与特定计算机体系结构无关的字节码指令来实现这一特性。精心设计的字节码不仅可以很容易地在任何机器上解释执行,而且可以很容易地动态转换为原生机器代码。当时,为“虚拟机”生成代码并不是一个新思路,诸如 Lisp、Smalltalk 和 Pascal 等编程语言多年前就已经采用了这种技术。当然,解释虚拟机指令肯定比全速运行机器指令慢很多。不过,虚拟机有一个选项,可以将执行最频繁的字节码序列转换成机器码,这一过程称为即时编译(just-in-timecompilation)。Java 虚拟机还有其他一些优点。它可以检查指令序列的行为,从而增强安全性。
1.2.7、可移植性
与 C 和 C++ 不同,Java 规范中没有“依赖具体实现”的地方。基本数据类型的大小以及有关运算的行为都是明确的。
例如:
(1)Java 中的 int 总是 32 位整数,
(2)而在 C / C++ 中,int 可能是16 位整数、32 位整数,也可能是编译器开发商指定的任何其他大小。
(3)唯一的限制是,int 类型的字节数不能低于 short int,并且不能高于 long int。
(4)在 Java 中,数值类型有固定的字节数,这消除了代码移植时一个令人头痛的主要问题。
(5)二进制数据以固定的格式进行存储和传输,消除了有关字节顺序的困扰。
(6)字符串则采用标准的 Unicode 格式存储。作为系统组成部分的类库定义了可移植的接口。
例如,有一个抽象 Window 类,并给出了面向 UNIX、Windows 和 Macintosh 环境的不同实现。
选择 Window 类作为例子可能并不太合适。凡是尝试过的人都知道,要编写一个在 Windows、Macintosh 和 10 种不同风格的 UNIX 上看起来都不错的程序是多么困难。Java 1.0 就尝试着做了这么一个壮举,发布了一个简单的工具包,为多个不同平台提供了常用的用户界面元素。遗憾的是,尽管花费了大量的心血,结果却不尽如人意,这个库并不能在不同系统上都提供让人接受的结果。原先的用户界面工具包已经重写,而且后来又再次重写,跨平台的可移植性仍然是个问题。
不过,除了与用户界面有关的部分外,所有其他 Java 库确实能很好地支持平台独立性。你可以处理文件、正则表达式、XML、日期和时间、数据库、网络连接、线程等,而不用操心底层操作系统。不仅程序是可移植的,JavaAPI 往往也比原生 API 质量更高。
1.2.8、解释性
Java 解释器可以在任何移植了解释器的机器上直接执行 Java 字节码。由于链接(linking)是一个增量式的轻量级过程,所以,开发过程也会更加快捷,更具有探索性。这看上去很不错。用过 Lisp、Smalltalk、Visual Basic、Python、R 或 Scala 的人都知道“快捷而且具有探索性”的开发过程是怎样的。你可以做些尝试,然后立即就能看到结果。在 Java 发展的前 20年里,开发环境并没有把重点放在这种体验上。直到 Java 9 才提供了 jshell 工具来支持快捷而且具有探索性的编程。
1.2.9、高性能
尽管解释型字节码的性能通常已经足够让人满意,但在有些场合下还需要更高的性能。字节码可以(在运行时)动态转换为面向运行这个应用的特定 CPU 的机器码。使用 Java 的头几年,许多用户不同意“性能已经足够让人满意”的说法。不过,现在的即时编译器已经非常出色,可以与传统编译器相媲美,而且在某些情况下甚至超越了传统编译器,原因是它们有更多的可用信息。例如:
(1)即时编译器可以监控哪些代码频繁执行,并优化这些代码以提高速度。
(2)更为复杂的优化是消除函数调用(即“内联”)。
(3)即时编译器知道已经加载了哪些类。
(4)基于当前加载的类集合,如果一个特定的函数不会被覆盖,就可以使用内联。
(5)必要时,以后还可以撤销这种优化。
1.2.10、多线程
多线程可以带来更好的交互响应和实时行为。如今,我们非常关注并发性,因为摩尔定律即将走到尽头。我们不再追求更快的处理器,而是着眼于获得更多的处理器,而且要让它们保持繁忙。不过,可以看到,大多数编程语言对于这个问题并没有显示出足够的重视。 Java 在当时很超前。它是第一个支持并发程序设计的主流语言。从白皮书中可以看到,它的出发点稍有些不同。当时,多核处理器还很神秘,而 Web 编程才刚刚起步,处理器要花很长时间等待服务器的响应,需要并发程序设计来确保用户界面没有“冻住”。并发程序设计绝非易事,不过 Java 在这方面表现很出色,可以很好地管理这个工作。
1.2.11、动态性
从很多方面来看,Java 与 C 或 C++ 相比更具有动态性。Java 设计为能够适应不断演进的环境。库可以自由地添加新方法和实例变量,而对客户端没有任何影响。在 Java 中找出运行时类型信息十分简单。需要为正在运行的程序增加代码时,动态性将是一个非常重要的特性。一个很好的例子是:
(1)在浏览器中运行从 Internet 下载的代码。
(2)如果使用 C 或 C++,这确实难度很大,不过 Java 设计者很清楚动态语言可以很容易地让一个正在运行的程序实现演进。
(3)最终,他们将这一特性引入到这个主流程序设计语言中。
Java 成功地推出后不久,微软就发布了一个叫作 J++ 的产品,它与 Java 有几乎相同的编程语言和虚拟机。现在,微软不再支持 J++,取而代之的是另一个名为 C# 的语言。C# 与 Java 有很多相似之处,不过在一个不同的虚拟机上运行。本书不准备介绍 J++ 或 C# 语言。
1.3、Java applet 与 Internet
这里的想法很简单:
(1)用户从 Internet 下载 Java 字节码,并在自己的机器上运行。
(2)在网页中运行的 Java 程序称为 applet。
(3)要使用 applet,只需要一个启用 Java 的 Web 浏览器,它会为你执行字节码。 (4)不需要安装任何软件。
(5)只要你访问包含 applet 的网页,都会得到这个程序的最新版本。
(6)最重要的是,归功于虚拟机的安全性,我们不必担心来自恶意代码的攻击。在网页中插入一个 applet 就如同在网页中嵌入一幅图片。applet 会成为页面的一部分。文本环绕在 applet占据的空间周围。关键是,这个图片是活动的(alive)。它会对用户命令做出响应,改变外观,在显示它的计算机和提供它的计算机之间交换数据。
图 1-1 展示了 Jmol applet,它会显示分子结构。可以利用鼠标旋转和放大各个分子,从而更好地理解分子结构。在发明 applet 的时代,用网页是无法实现这种直接的操作的,那时只有基本的 JavaScript 而没有 HTML 画布。地址:https://jmol.sourceforge.net/demo/aminoacids。

图 1-1 Jmol appletapplet
首次出现时,人们欣喜若狂。许多人相信 applet 的魅力会让 Java 迅速流行起来。然而,初期的兴奋很快就变成了沮丧。不同版本的 Netscape 与 Internet Explorer 运行不同版本的 Java,其中有些早已过时。这种糟糕的情况导致更加难以利用 Java 的最新版本开发 applet。实际上,为了在浏览器中得到动态效果,Adobe 的 Flash 技术变得相当流行。后来 Java 受到严重安全问题的困扰时,浏览器也放弃了对 applet 的支持。当然,FLash 的命运也好不到哪里去。
1.4、Java 发展简史
本节将介绍 Java 的发展简史。这些内容来自很多已发布的资料(最重要的是 SunWorld 的在线杂志 1995年7月刊上对 Java 创始人的专访)。
Java 的历史要追溯到 1991年。由 Patrick Naughton 和 James Gosling(一个全能的计算机奇才,Sun 公司会士)带领的 Sun 公司的一个工程师小组想要设计一种小型的计算机语言,希望用于有线电视转换盒之类的消费设备。由于这些消费设备的处理能力和内存都很有限,所以这个语言必须非常小,而且要能够生成很紧凑的代码。另外,由于不同的厂商会选择不同的中央处理器(CPU),因此很重要的一点是这种语言不应与任何特定的体系结构绑定。这个项目被命名为“Green”。
代码短小、紧凑且与平台无关,这些要求促使开发团队设计出一个可移植的语言,可以为虚拟机生成中间代码。
Sun 公司的人都有 UNIX 的应用背景。因此,所开发的语言以 C++ 为基础,而不是 Lisp、Smalltalk 或 Pascal。不过,正如 Gosling 在专访中谈道:“毕竟,语言只是实现目标的工具,而不是目标本身。”Gosling 把这种语言称为“Oak”(这么起名大概是因为他非常喜欢他在 Sun 公司的办公室窗外的一棵橡树)。Sun 公司的人后来发现,已经有另外一个计算机语言取名为 Oak,于是,他们将这个语言改名为 Java。事实证明这是一个很有灵感的选择。
1992年,Green 项目发布了它的第一个产品,称之为“*7”。这个产品可以提供非常智能的远程控制。遗憾的是,Sun 公司对生产这个产品并不感兴趣,Green 项日组的人员必须找到其他方法将他们的技术推向市场。然而,也没有任何一家标准消费品电子公司对此感兴趣。于是,Green 项目组投标了一个设计有线电视盒的项目,它能提供视频点播等新型有线服务,但他们没能拿到这个合同(有趣的是,得到这个项目的公司的领导人恰恰是开创 Netscape 公司的 Jim Clark。Netscape 公司后来对 Java 的成功做出了很大贡献)。
在 1993年 以及 1994年的上半年,Green 项目(这时候换了一个新名字——“First Person 公司”)一直在苦苦寻求买家购买他们的技术。然而,一个也没有找到(Patrick Naughton——项目组的创始人之一,也是完成大部分营销工作的人,声称为了销售这项技术,累计飞行了 300000 英里)。1994 年 First Person 公司解散了。
当这一切在 Sun 公司发生的时候,Internet 的万维网也在日渐发展壮大。万维网的关键是浏览器把超文本页面转换到屏幕上。1994年 大多数人都在使用 Mosaic,这是 1993年出自伊利诺伊大学超级计算中心的一个非商业化的 Web 浏览器(Mosaic 的一部分是由 Marc Andreesser 编写的。当时,他作为一名参加半工半读项目的本科生,编写了这个软件,每小时的薪水只有 6.85 美元。他后来成为 Netscape 公司的创始人之一和技术总监,可谓名利双收)。
在接受 SunWorld 采访的时候,Gosling 说,在 1994年 年中,Java 语言的开发者意识到“我们能建立一个相当酷的浏览器。在客户 / 服务器主流框架中,浏览器恰好需要我们已经完成的一些工作:体系结构中立、实时、可靠、安全——这些问题在工作站环境并不太重要,所以,我们决定开发浏览器。
”实际的浏览器是由 Patrick Naughton 和 JonathanPayne 开发的,并演变为 HotJava 浏览器。Hotava 浏览器采用 Java 编写,以炫耀 Java 语言超强的能力。这个浏览器能够在网页中执行内嵌的 Java 代码。这一“技术证明”在 1995年5月23日 的 SunWorld’95 大会上展示,引发了人们对 Java 的狂热追逐并延续至今。
1996 年年初,Sun 公司发布了 Java 的第 1 个版本。人们很快地意识到 Java1.0 不能用来完成真正的应用开发。的确,可以使用 Java1.0 实现在画布上随机跳动的“神经质文本”applet,但它没有提供打印功能。坦率地说,Java 1.0 的确没有为其黄金时期的到来做好准备。后来的 Java 1.1 弥补了大多明显的缺陷,大大改进了反射能力,并为 GUI 编程增加了新的事件处理模型。不过它仍然有很大的局限性。
1998 年 Java0ne 会议的头号新闻是即将发布 Java 1.2 版。这个版本将早期玩具式的 GUI 和图形工具包代之以复杂而且可伸缩的工具包。在 1998年12月 Java 1.2 发布仅 3 天之后 Sun 公司市场部将它改名为更加吸引人的“Java 2 标准版软件开发包 1.2 版”。除了“标准版”(Standard Edition)之外,Sun 公司还推出了另外两个版本:
(1)一个是用于手机等嵌入式设备的“微型版”(Micro Edition);
(2)另一个是用于服务器端处理的“企业版”(Enterprise Edition)。
本书主要介绍标准版。
标准版的 1.3 和 1.4 版本对最初的 Java 2 版本做出了增量式的改进,提供了不断扩展的标准类库,提高了性能,当然,还修正了一些 bug。在此期间,原先对 Java applet 和客户端应用的炒作逐渐消退,但 Java 成了服务器端应用的首选平台。
5.0 版是自 1.1 版以来第一个对 Java 语言做出重大改进的版本(这一版本原来定为 1.5 版,但在 2004 年的 JavaOne 会议之后,版本号直接升至 5.0)。经过多年的研究,这个版本添加了泛型类型(generic type,大致相当于 C++ 的模板),其挑战性在于添加这一特性而不需要对虚拟机做任何修改。另外,受到 C# 的启发,还增加了几个很有用的语言特性:“foreach”循环、自动装箱和注解。
6 版(没有后缀 .0)于 2006 年年底发布。同样,这个版本没有对语言方面再进行修改,而是做了另外一些性能改进,并增强了类库。
随着数据中心越来越依赖于商业硬件而不是专用服务器,Sun 公司终于陷入困境,于 2009 年被 Oracle 公司收购。Java 的开发停滞了很长一段时间。直到 2011 年 Oracle 公司发布了 Java 的一个新版本——Java 7,其中只做了一些简单的改进。
2014 年,Java 8 终于发布,在近 20 年中这个版本的改变最大。Java 8 包含了一种“函数式”编程方式,可以很容易地表述能并发执行的计算。所有编程语言都必须与时俱进,Java 在这方面显示出了非凡的能力。
Java 9 的主要特性要一直追溯到 2008 年。那时,Java 平台的首席工程师 Mark Reinhold 开始着力解析这个庞大的 Java 平台。为此引入了模块(module),模块是提供一个特定功能的自包含代码单元。设计和实现一个适用于 Java 平台的模块系统前后用了 11年,而它是否也适用于 Java 应用和类库还有待观察。Java 9 于 2017 年发布,它还提供了另外一些吸引人的特性,我们将在本书中介绍这些特性。
从 2018 年开始,每 6 个月就会发布一个 Java 版本,以支持更快地引入新特性。每过一段时间,会把某个版本(如 Java 11 和 Java 17)指定为长期支持版本。中间版本提供了一种试验新特性的机制。表 1-1 展示了 Java 语言及类库的演进。可以看到,API 的规模有了惊人的增长。
| 版本 | 年 份 | 语言新特性 | 类与接口的数量 |
| 1.0 | 1996 | 语言本身 | 211 |
| 1.1 | 1997 | 内部类 | 477 |
| 1.2 | 1998 | strictfp 修饰符 | 1 524 |
| 1.3 | 2000 | 无 | 1 840 |
| 1.4 | 2002 | 断言 | 2 723 |
| 5.0 | 2004 | 泛型类型、"for each"循环、可变元参数、自动装箱、元数据、枚举、静态导入 | 3 279 |
| 6 | 2006 | 无 | 3 793 |
| 7 | 2011 | 基于字符串的switch 语句、菱形运算符、二进制字面量、异常处理改进 | 4 024 |
| 8 | 2014 | Lambda 表达式、包含默认方法的接口、流、日期、时间库 | 4 240 |
| 9 | 2017 | 模块、其他的语言和类库增强 | 6 005 |
| 11 | 2018 | 局部变量类型推导(var)、HTTP 客户端、移除 Java FX、JNLP | 4 410 |
| 17 | 2021 | Switch 表达式、文本块、instanceof 模式匹配、记录、密封类 | 4 859 |
1.5、关于 Java 的常见误解
在结束本章之前,我们将列出关于 Java 的一些常见误解,同时给出解释。
(1)Java 是 HTML 的扩展
Java 是一种程序设计语言,HTML 是一种描述网页结构的方式。除了用于在网页上放置 Java applet 的 HTML 扩展之外,两者没有任何共同之处。
(2)我使用 XML,所以不需要 Java
Java 是一种程序设计语言,XML 是一种描述数据的方式。可以使用任何一种程序设计语言处理 XML 数据,而 Java API 对 XML 处理提供了很好的支持。此外,许多重要的 XMI 工具都是用 Java 实现的。有关的更多信息请参见卷Ⅱ。
(3)Java 是一种非常容易学习的程序设计语言
像 Java 这种功能强大的语言大多都不太容易学习。首先,必须将编写玩具式程序的轻松与开发实际项目的艰难区分开来。另外,需要注意的是:本书只用了7章讨论 Java 语言,其余几章和卷Ⅱ都在介绍如何使用 Java 类库来具体应用 Java 语言。Java 类库包含数千个类和接口,还有数万个函数。好在,你不需要知道其中的每一个类或函数,不过,要想用 Java 解决实际问题,还是需要了解不少内容的。
(4)Java 将成为适用于所有平台的通用编程语言
从理论上讲,这是完全有可能的。但在实际中,某些领域其他语言有更出色的表现,比如,0bjectivec 和后来的 Swift 在 iOS 设备上就有着无可取代的地位。浏览器中的处理几乎完全由 JavaScript 掌控。
Windows 程序通常都用 C++ 或 C# 编写。Java 在服务器端编程和跨平台客户端应用领域则很有优势。
(5)Java 只不过是另外一种程序设计语言
Java 是一种很好的程序设计语言,很多程序设计人员喜欢 Java 胜过 C、C++ 和 C#。有几百种很好的程序设计语言没有广泛流行,而有明显缺陷的语言(如 C++ 和 Visual Basic)却大行其道。
这是为什么呢?程序设计语言的成功更多地取决于其支持系统(support system)的能力而不是语法的精巧性。人们主要关注的是:是否提供了有用、便捷和标准的库来实现所需要的特性?是否有工具开发商建立了强大的编程和调试环境?语言和工具集是否与计算基础架构的其他部分有效整合? Java 的成功缘于其类库能够让人们轻松地完成原本有一定难度的工作,例如网络连接、Web 应用和并发。Java 减少了指针错误,这是一个额外的好处,因此使用 Java 编程的效率更高。但这些并不是 Java 成功的全部原因。
(6)Java 是专用的,应该避免使用
最初创建 Java 时,Sun 公司为发布者和最终用户提供了免费许可。尽管 Sun 公司对 Java 拥有最终的控制权,不过在语言版本的不断发展和新库的设计过程中还涉及很多其他公司。虚拟机和类库的源代码可以免费获得,不过仅限于查看,而不能修改和再发布。Java 是“闭源的,不过可以很好地使用”。
这种状况在 2007 年发生了巨大变化,Sun 公司宣布 Java 未来的版本将在 General Public License(GPL)下发布(Linux 也使用同样的开放源代码许可)。Oracle 公司一直致力于保持 Java 开源。目前有多个开源 Java 实现提供商,分别提供不同级别的承诺和支持。
(7)Java 是解释性的,因此对于关键应用速度太慢了
早期的 Java 确实是解释性的。现在 Java 虚拟机使用了即时编译器,因此用 Java 编写的热点”代码运行速度与 C++ 相差无几,有些情况下甚至更快。
(8)所有的 Java 程序都在网页中运行
有一段时间,Java applet 在 Web 浏览器中运行。如今,Java 程序是运行在 Web 浏览器之外的独立应用。实际上,大多数 Java 程序都在服务器上运行,为网页生成代码或者计算业务逻辑。
(9)Java 程序存在重大安全风险
对于早期的 Java,有过关于 Java 安全系统失效的报道,曾经引起过公众关注。研究人员努力找出 Java 的漏洞,并质疑 applet 安全模型的强度和复杂度,将这视为一种挑战。人们很快就解决了所发现的技术问题。后来又发现了更严重的漏洞,而 Sun 公司以及后来的 Oracle 公司反应却很迟缓。浏览器制造商禁用了 Java applet 支持。促成 applet 的安全管理器体系结构现在已经过时。如今,Java 应用与其他应用同样安全。由于虚拟机提供的保护,Java 应用比用 C 或 C++ 编写的应用要安全得多。
(10)JavaScript 是Java 的简易版。
JavaScript 是一种可以在网页中使用的脚本语言,它由 Netscape 发明,最初的名字是 LiveScript。JavaScript 的语法让人想到 Java,因为名字也有些相像,但除此之外,两者并无任何关系。尤其是,Java 是强类型的,编译器能捕获类型滥用导致的很多错误。而在 JavaScript 中,只有当程序运行时才能发现这些错误,所以消除错误要费劲得多。
(11)使用 Java 时,可以用廉价的“Internet 设备”取代桌面计算机。
Java 刚刚发布的时候,一些人打赌这肯定会发生。一些公司已经生产出支持 Java 的网络计算机原型,不过用户还不打算放弃功能强大且方便的桌面计算机,而去使用没有本地存储而且功能有限的网络计算机。当然,如今世界已经发生改变,对于大多数最终用户,常用的平台往往是手机或平板电脑。这些设备大多使用 Android(安卓)平台。学习 Java 编程对 Android 编程也很有帮助。
760

被折叠的 条评论
为什么被折叠?



