《Java核心技术:卷I 基础知识》第1章 Java 程序设计概述 阅读与重点标记

第 1 章 Java 程序设计概述

1996年 Java 第一次发布就引起了人们的极大兴趣。关注 Java 的人士不仅限于计算机出版界,还有诸如《纽约时报》《华盛顿邮报》《商业周刊》这样的主流媒体。Java 是第一种也是唯 一一种在 National Public Radio(全国公共广播电视台)上占用了 10分钟时间来进行介绍的程序设计语言,并且还得到 了$100 000 000 的风险投资基金。这些基金全部用来支持用这种特别的计算机语言开发的产品。重温那些令人兴奋的日子是很有意思的。本章将简要地介绍一下 Java语言的发展历史

1.1 Java 程序设计平台

有人认为:Java将有望成为一种最优秀的程序设计语言,但还需要一个相当长的发展时期。一旦一种语言应用于某个领域,与现存代码的相容性问题就摆在了人们的面前。

Java 有许多非常优秀的语言特性。由于相容性这个严峻的问题确实存在于现实中,所以,或多或少地还是有 一些"累赘” 被加到语言中,这就导致 Java并不如想象中的那么完美无瑕。

Java 并不只是一种语言,Java 是一个完整的平台,有一个庞大的库,其中包含了很多可重复使用的代码和一个提供诸如安全性、跨操作系统的可移植性以及自动垃圾收集等服务的执行环境

假如找工作被面试官问道:“Java”是什么?以上这句话即是标准答案。

Java具有令人赏心悦目的语法易于理解的语义,提供了可移植性垃圾收集等。还有奇特的绘图功能网络连接功能数据库存取功能 。它是一种功能齐全的出色语言,是一个高质量的执行环境,还提供了一个庞大的库。正是因为它集多种优势于一身,所以对广大的程序设计人员有着不可抗拒的吸引力

1.2 Java“ 白皮书” 的关键术语

白皮书是政府或议会正式发表的以白色封面装帧的重要文件或报告书的别称。作为一种官方文件,代表政府立场,讲究实事求是、立场明确、行文规范、文字简练,没有文学色彩

白皮书已经成为国际上公认的正式官方文书。各国文件分别有其惯用的颜色,封面用白色的就是白皮书。

Java 的设计者已经编写了颇有影响力的“ 白皮书”(Java白皮书英文版地址:www.oracle.com/technetworic/java/langenv-140151.html),用来解释设计的初衷以及完成的情况,并且发布了一个简短的摘要,这个摘要用下面 11 个关键术语进行组织:

  1. 简单性

  2. 面向对象

  3. 分布式

  4. 健壮性

  5. 安全性

  6. 体系结构中立

  7. 可移植性

  8. 解释性

  9. 高性能

  10. 多线程

  11. 动态性

1.2.1简单性

Java是一个无须深奥的专业训练就可以进行编程的系统,并且符合当今的标准惯例。设计 Java 的时候还是尽可能地接近 C++, 以便系统更易于理解 ,Java 剔除了 C++ 中许多很少使用、难以理解、 易混淆的特性。

Java语法是 C++语法的一个“ 纯净” 版本。没有头文件、指针运算(甚至指针语法)、结构、联合、操作符重载、 虚基类等。

简单的另一个方面是小。Java 是支持开发能够在小型机器上独立运行的软件。基本的解释器以及类支持大约仅为 40KB 再加上基础的标准类库和线程的支持(基本上是一个自包含的微内核)大约需要增加 175KB

Java的类库已经相当庞大。 Java 微型版(Java Micro Edition):是一个独立的具有较小类库的Java版本,此版本适用于嵌人式设备。

1.2.2面向对象

面向对象设计是一种程序设计技术。它将重点放在数据(即对象)和对象的接口上。用木匠打一个比方,一个“ 面向对象的” 木匠始终关注的是所制作的椅子,第二位才是所使用的工具;一个“ 非面向对象的” 木匠首先考虑的是所用的工具。

Java的面向对象技术相当成熟。Java 的面向对象特性与 C++ 旗鼓相当。Java与C++ 的主要不同点在于多重继承,在 Java中,取而代之的是更简单的接口概念。与C++ 相比,Java 提供了更丰富的运行时自省功能

1.2.3分布式

Java 有一个丰富的例程库,用于处理像 HTTP 和FIT之类的 TCP/IP 协议。Java 应用程序能够通过 URL 打开和访问网络上的对象,其便捷程度就好像访问本地文件一样。

1.2.4健壮性

Java 编写的程序具有多方面的可靠性,Java采用的指针模型可以消除重写内存和损坏数据的可能性。

1.2.5安全性

Java 适用于网络/分布式环境。使用 Java 可以构建防病毒、防篡改的系统

Java能够防范各种攻击:

  • 运行时堆栈溢出。如蠕虫和病毒常用的攻击手段。
  • 破坏自己的进程空间之外的内存
  • 未经授权读写文件。

1.2.6体系结构中立

编译器生成一个体系结构中立的目标文件格式,这是一种编译过的代码,只要有Java系统运行时,这些编译后的代码可以在许多处理器上运行。Java编译器通过生成与特定的计算机体系结构无关的字节码指令来实现这一特性。精心设计的字节码不仅可以很易地在任何机器上解释执行,而且还可以动态地翻译成本地机器代码。

虚拟机指令肯定会比全速运行机器指令慢很多。然而,虚拟机有一个选项, 可以将执行最频繁的字节码序列翻译成机器码,这一过程被称为即时编译。 Java 虚拟机还有一些其他的优点。它可以检测指令序列的行为,从而增强其安全性。

1.2.7可移植性

在 Java中,数据类型具有固定的大小,这消除了代码移植时令人头痛的主要问题。二进制数据以固定的格式进行存储和传输,消除了字节顺序的困扰。字符串是用标准的 Unicode 格式存储的。

Java 库都能很好地支持平台独立性。处理文件、正则表达式、 XML、 日期和时间、数据库、 网络连接、线程等,而不用担心底层操作系统。不仅程序是可移植的,Java API 往往也比原生 API 质量更高。

1.2.8解释性

Java 解释器可以在任何移植了解释器的机器上执行 Java 字节码。由于链接是一个增量式且轻量级的过程,所以, 开发过程也变得更加快捷,更加具有探索性。

1.2.9高性能

尽管对解释后的字节码性能已经比较满意,但在有些场合下还需要更加高效的性能。字节码可以(在运行时刻)动态地翻译成对应运行这个应用的特定 CPU 的机器码。

使用 Java 的头几年,许多用户不同意这样的看法:性能就是“ 适用性更强”。然而,现 在的即时编译器已经非常出色,以至于成了传统编译器的竞争对手。在某些情况下,甚至超 越了传统编译器,原因是它们含有更多的可用信息。例如,即时编译器可以监控经常执行哪 些代码并优化这些代码以提高速度。更为复杂的优化是消除函数调用(即“ 内联”)。即时编译器知道哪些类已经加载基于当前加载的类集,如果特定的函数不会被覆盖,就可以使用内联。必要时,还可以撤销优化。

1.2.10多线程

多线程可以带来更好的交互响应和实时行为。

如今,我们非常关注并发性,因为摩尔定律将完结。

摩尔定律:集成电路上可以容纳的晶体管数目在大约每经过24个月便会增加一倍。换言之,处理器的性能每隔两年翻一倍。摩尔定律是内行人摩尔的经验之谈,汉译名为“定律”,但并非自然科学定律,它一定程度揭示了信息技术进步的速度。

我们不再追求更快的处理器,而 是着眼于获得更多的处理器,而且要让它们一直保持工作。不过,可以看到,大多数编程语 言对于这个问题并没有显示出足够的重视。 Java 在当时很超前。它是第一个支持并发程序设计的主流语言。从白皮书中可以看到, 它的出发点稍有些不同。当时,多核处理器还很神秘,而 Web 编程才刚刚起步,处理器要花 很长时间等待服务器响应,需要并发程序设计来确保用户界面不会“ 冻住”。 并发程序设计绝非易事,不过 Java 在这方面表现很出色,可以很好地管理这个工作。

1.2.11动态性

从各种角度看,Java 与 C 或 C++ 相比更加具有动态性。它能够适应不断发展的环境库中可以自由地添加新方法和实例变量, 而对客户端却没有任何影响。**在 Java 中找出运行时类型信息十分简单。

当需要将某些代码添加到正在运行的程序中时,动态性将是一个非常重要的特性.一个很好的例子是:从 Internet 下载代码,然后在浏览器上运行。如果使用C 或C++, 这确实难 度很大,不过 Java 设计者很清楚动态语言可以很容易地实现运行程序的演进。最终,他们将 这一特性引入这个主流程序设计语言中。

Applet是采用Java编写的网页应用程序,现该技术已过时并被JavaScript和Flash取代,故跳过1.3Applet和Internet部分

1.4 Java发展简史

​ Java 的历史要追溯到 1991年,由 Patrick Naughton 和 James Gosling (一个全能的计算机奇才)带领的 Sun公司的工程师小组想要设计一种小型的计算机语言,主要用于像有线电视转换盒这类的消费设备。由于这些消费设备的处理能力和内存都很有限所以语言必须非常小且能够生成非常紧凑的代码。另外,由于不同的厂商会选择不同的中央处理器(CPU), 因此这种语言的关键是不与任何特定的体系结构捆绑在一起。这个项目被命名为“ Green”。 代码短小、紧凑且与平台无关,这些要求促使开发团队设计一个可移植的语言,可以为 虚拟机生成中间代码。 不过,Sun公司的人都有 UNIX 的应用背景。因此,所开发的语言以 C++ 为基础,而不是 Lisp、 Smalltalk 或 Pascal。不过, 就像 Gosling 在专访中谈到的:“ 毕竟,语言只是实现目标的工具,而不是目标本身”。Gosling 把这种语言称为**“ Oak”**(这么起名的原因大概是因为他非常喜欢自己办公室外的橡树)。Sun公司的人后来发现Oak 是一种已有的计算机语言的 名字,于是,将其改名为 Java。事实证明这是一个很有灵感的选择。

​ 1992 年,Green项目发布了它的第一个产品,称之为“ *7”。这个产品具有非常智能的远程控制。遗憾的是,Sun公司对生产这个产品并不感兴趣,Green项目组的人员必须找出 其他的方法来将他们的技术推向市场。然而,没有一个标准消费品电子公司对此感兴趣。于 是,Green项目组竞标了一个提供视频点播等新型服务的有线电视盒的项目,但没有成功(有 趣的是,得到这个项目的公司的领导恰恰是开创 Netscape 公司的 Jim Clark。Netscape 公司后 来对 Java 的成功给予了很大的帮助)。

​ Green项目(这时换了一个新名字—“ First Person 公司”)花费了 1993 年一整年以及 1994 年的上半年,一直在苦苦寻求其技术的买家。然而,一个也没有找到( Patrick Naughton, 项目组的创立人之一,也是完成此项目大多数市场工作的人,声称为了销售这项 技术,累计飞行了 300 000英里)。1994 年 First Person 公司解散了

​ 当这一切在 Sun公司发生的时候, Internet 的万维网也在日渐发展壮大。万维网的关键 是把超文本页面转换到屏幕上的浏览器。1994 年大多数人都在使用 Mosaic, 这是一个 1993年出自伊利诺斯大学超级计算中心的非商业化的 Web浏览器( Mosaic 的一部分是由 Marc Andreessen 编写的。当时,他作为一名参加半工半读项目的本科生,编写了这个软件,每小时 的薪水只有 6.85 美元。他后来成了 Netscape 公司的创始人之一和技术总监,可谓名利双收)。

​ 在接受 SunWorld 采访的时候,Gosling说在 1994年中期,Java语言的开发者意识到:“ 我们能够建立一个相当酷的浏览器。我们已经拥有在客户机 / 服务器主流模型中所需要的体系结构中立、实时、可靠、 安全——这些在工作站环境并不太重要,所以,我们决定开发浏览器."

​ 实际的浏览器是由 Patrick Naughton 和 Jonathan Payne 开发的,并演变为 HoUava 浏览器。为了炫耀 Java语言超强的能力, HoUava浏览器采用 Java 编写。设计者让 HoUava浏览 器具有在网页中执行内嵌代码的能力。这一“ 技术印证” 在 1995 年 5月 23 日的 SunWorld 上得到展示,同时引发了人们延续至今的对 Java 的狂热追逐。

1996 年年初,Sun发布了 Java 的第 1 个版本:人们很快地意识到 Java1.0不能用来进行真正的应用开发。的确,可以使用 Java 1.0 来实现在画布上随机跳动的神经质的文本 applet, 但它却没有提供打印功能。坦率地说,Java 1.0 的确没有为其黄金时期的到来做好准备。后 来的 Java 1.丨弥补了其中的大多明显的缺陷,大大改进了反射能力,并为GUI 编程增加了新 的事件处理模型:
不过它仍然具有很大的局限性。

1998 年 JavaOne 会议的头号新闻是即将发布 Java 1.2 版。这个版本取代了早期玩具式的GUI, 并且它的图形T.具箱更加精细而具有可伸缩性,更加接近“ 一次编写,随处运行” 的 承诺,, 在 1998 年 12月 Java 1.2 发布7天之后,Sun公司市场部将其名称改为更加吸引人的“ Java 2标准版软件开发工具箱1.2 版”。

​ 除了‘ 标准版’ 之外,Sun还推出了两个其他的版本:一个是用于手机等嵌人式设备的‘ 微型版”;另一个是用于服务器端处理的“ 企业版”。本书主要讲述标准版。

​ **标准版的 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#启发的很有用的语言特性:“ for each” 循环、 自 动装箱和注解。

版本 6 (没有后缀 .0 ) 于 2006 年年末发布。同样,这个版本没有对语言方面再进行改进。 但是,改进了其他性能,并增强了类库。

随着数据中心越来越依赖于商业硬件而不是专用服务器,Sun Microsystems终于沦陷于 2009 年被 Oracle收购。Java 的开发停滞了很长一段时间。直到 2011年 Oracle 发布了 Java的一个新版本,Java 7, 其中只做了一些简单的改进

2014 年,Java 8终于发布,在近 20 年中这个版本有了最大的改变。Java 8 提供了一种“ 函数式” 编程方式,可以很容易地表述并发执行的计算。所有编程语言都必须与时俱进,Java 在这方面显示出非凡的能力。

​ 下表展示了 Java语言以及类库的发展状况。可以看到,应用程序编程接口(API ) 的规 模发生了惊人的变化

Java语言的发展状况
版本 年份 语言新特性 类与接口的数量
1.0 1996 语言本身 211
1.1 1997 内部类 477
1.2 1998 strictfp 修饰符 1524
1.3 2000 1840
1.4 2002 断言 2723
5.0 2004 泛型类、“ for each” 循环、可变元参数、自动装箱、元数据、枚举、静态导入 3279
6 2006 3793
7 2011 基于字符串的 switch、钻石操作符、二进制字面量、 异常处理改进 4024
8 2014 lambda 表达式,包含默认方法的接口,流和日期 / 时 间库 4240

1.5关于Java的常见误解

在结束本章之前,列出了一些关于 Java 的常见误解,同时给出了解释。

  1. Java 是HTML 的扩展

Java 是一种程序设计语言;HTML 是一种描述网页结构的方式。除了用于在网页上放置
Java applet 的 HTML扩展之外,两者没有任何共同之处。

  1. 使用 XML, 所以不需要 Java

Java 是一种程序设计语言;XML 是一种描述数据的方式可以使用任何一种程序设计语言处理XML 数据,而 Java API 对 XML处理提供了很好的支持。此外,许多重要的第三方XML工具采用 Java 编写。

  1. Java 是一种非常容易学习的程序设计语言

像 Java 这种功能强大的语言大都不太容易学习首先,必须将编写玩具式程序的轻松和开发实际项目的艰难区分开来。需要注意的是:其他的章节介绍如何使用 Java 类库将 Java语言应用到实际中去Java 类库包含了数千种类 和接口以及数万个函数幸运的是,并不需要知道它们中的每一个,然而,要想Java 解决实 际问题,还是需要了解不少内容的

  1. Java 将成为适用于所有平台的通用性编程语言

从理论上讲,这是完全有可能的。但在实际中,某些领域其他语言有更出色的表现,比如,Objective C 和后来的 Swift 在 iOS 设备上就有着无可取代的地位, 浏览器中的处理几乎 完全由 JavaScript 掌控。Windows 程序通常都用C++ 或 C#编写。Java 在服务器端编程和跨平台客户端应用领域则很有优势 .

  1. Java 只不过是另外一种程序设计语言

Java 是一种很好的程序设计语言,很多程序设计人员喜欢 Java 胜过 C、C++ 或C#。有上百种好的程序设计语言没有广泛地流行,而带有明显缺陷的语言, 如:C++ 和 Visual Basic 却大行其道。

这是为什么呢? 程序设计语言的成功更多地取决于其支撑系统的能力,而不是优美的语法。人们主要关注:是否提供了易于实现某些功能的易用、便捷和标准的库? 是否有开发工具提供商能建立强大的编程和调试环境? 语言和工具集是否能够与其他计算基础架构整合在 一起? Java 的成功源于其类库能够让人们轻松地完成原本有一定难度的事情。例如:联网 Web应用和并发。Java 减少了指针错误,这是一个额外的好处,因此使用 Java 编程的效率更 高。但这些并不是 Java 成功的全部原因。

  1. Java 是专用的,应该避免使用

​ 最初创建 Java 时;Sun 为销售者和最终用户提供了免费许可尽管 Sim 对 Java拥有最终的控制权,不过在语言版本的不断发展和新库的设计过程中还涉及很多其他公司. 虚拟机和类库的源代码可以免费获得不过仅限于查看,而不能修改和再发布。Java 是“ 闭源的,不 过可以很好地使用”

这种状况在 2007年发生了戏剧性的变化,Sun声称 Java 未来的版本将在 General Public License ( GPL) 下提供。和Linux 使用的是同一个开放源代码许可 , Oracle 直致力于保持 Java 开源。只有一点美中不足:专利根据 GPL, 任何人都可以得到专利许可,允许其使用和修改 Java, 不过仅限于桌面和服务器平台。如果你想在嵌人式系统中使用 Java, 就需要另外 一个不同的许可,这很可能需要付费。不过,这些专利在未来十年就会到期,那时 Java 就完 全免费了

  1. Java 是解释型的, 因此对于关键的应用程序速度太慢了

​ 早期的 Java 是解释型的。现在 Java 虚拟机使用了即时编译器,因此采用 Java 编写的“ 热点” 代码其运行速度与C++ 相差无几,有些情况下甚至更快。

​ 对于 Java 桌面应用速度慢,人们已经抱怨很多年了。但是,今天的计算机速度远比人 们发出抱怨的时候快了很多一个较慢的 Java 程序与几年前相当快的C++ 程序相比还要快 一些。

  1. 所有的 Java 程序都是在网页中运行的

所有的 Java applet 都是在网页浏览器中运行的。这也恰恰是 applet 的定义,即一种在浏 览器中运行的 Java 程序 然而,大多数 Java 程序是运行在 Web浏览器之外的独立应用程序。实际上,很多 Java 程序都在 Web 服务器上运行并生成用于网页的代码。

  1. Java 程序是主要的安全风险

​ 对于早期的 Java,有过关于安全系统失效的报道,曾经一度引起公众哗然。研究人员将这视为一种挑战,即努力找出 Java 的漏洞,对 applet 安全模型的强度和复杂度发起挑战。随 后,人们很快就解决了引发问题的所有技术因素。后来又发现了更严重的漏洞,而 Sim 以及 后来的 Oracle反应却过于迟缓。浏览器制造商则有些反应过度,他们甚至默认禁用了 Java。 客观地来讲,可以想想针对 Windows可执行文件和 Word宏有数百万种病毒攻击,并造成了 巨大的损害,不过奇怪的是却很少有人批评被攻击平台的脆弱。

​ 有些系统管理员甚至在公司浏览器中禁用了 Java, 而同时却允许用户下载可执行文件和Word 文档,实际上,这些带来的风险远甚于使用 Java。尽管距离 Java诞生已经 20年之久, 与其他常用的执行平台相比,Java还是安全得多。

  1. JavaScript 是 Java 的简易版

JavaScript 是一种在网页中使用的脚本语言,它是由 Netscape 发明的,原来的名字叫做LiveScript。JavaScript 的语法类似 Java, 除此之外,两者无任何关系。当然,名字有些相像。 JavaScript 的一个子集已经标准化为ECMA-262。与 Java applet 相比,JavaScript 更紧密地与浏览器集成在一起。特别是 JavaScript 程序可以修改正在显示的文档,而 applet 只能在有限 的区域内控制外观。

  1. 使用 Java 可以用廉价的 Internet 设备取代桌面计算机

当 Java刚刚发布的时候,一些人打赌:肯定会有这样的好事情发生。一些公司已经生产出 Java 网络计算机的原型,不过用户还不打算放弃功能强大而便利的桌面计算机,而去使用 没有本地存储而且功能有限的网络设备。当然,如今世界已经发生改变,对于大多数最终用 户,常用的平台往往是手机或平板电脑。这些设备大多使用安卓平台,这是 Java 的衍生产物学习Java 编程肯定也对 Android编程很有帮助。

你可能感兴趣的:(笔记,java)