曾经有人说,作为Java程序员如果没有卷过这本书,就算不上是真正的Java程序员,那么我就也来卷卷它吧。下面是我的读书摘录笔记。
1.1 Java 程序设计平台
一旦一种语言得到广泛应用,与现存代码尴尬的兼容性问题就摆在了人面的面前。
Java 并不只是一种语言,
Java 是一个完整的平台,有一个庞大的库
1.2 Java “白皮书”的关键术语
11个关键术语进行组织:
1)简单性
2)面向对象
3)分布式
4)健壮性
5)安全性
6)体系结构中立
7)可移植性
8)解释性
9)高性能
10)多线程
11)动态性
1.2.1 简单性
无须深奥的专业画训练就可以进行编程的系统
符合当今的标准惯例
1.2.2 面向对象
面向对象设计是一种程序设计技术
它将重点放在数据(即对象)和对象的接口上
Java 提供了更丰富的运行时自省功能
1.2.3 分布式
Java 有一个丰富的例程库,用于处理像 HTTP 和 FTP 之类的 TCP/IP 协议
Java 应用程序能够通过 URL 打开和访问网络上的对象,其便捷程度就好像访问本地文件一样
1.2.4 健壮性
可靠性
强调进行早起的问题检测、后期动态的(运行时)检测,以及消除容易出错的情况
Java 编译器能够检测许多其他语言中仅在运行时才能够检测出来的问题
1.2.5 安全性
防范各种攻击,其中包括
- 运行时堆栈溢出
- 破坏自己的进程空间之外的内存
- 未经授权读写文件
1.2.6 体系结构中立
编译器生成一个体系结构中立的目标文件格式,这是一种编译过的代码,只要有 Java 运行时系统,这些编译后的代码可以在许多处理器上运行
生成与特定的计算机体系结构无关的字节码指令来实现这一特性
还可以动态地转换成本地机器代码
虚拟机有一个选项,可以将执行最频繁的字节码序列转换成机器吗,这一过程成为即时编译
1.2.7 可移植性
数值类型有固定的字节数,这消除了代码移植时一个令人头痛的主要问题
二进制数据以固定的格式进行存储和传输,消除了字节顺序的困扰
字符串则采用标准的 Unicode 格式存储
除了与用户界面有关的部分外,所有其他 Java 库确实能很好地支持平台独立性
不仅程序是可移植的,Java API 往往也比原生 API 质量更高
1.2.8 解释性
Java 解释器可以在任何移植了解释器的机器上直接执行 Java 字节码
Java 9 提供了 jshell 工具支持快捷而且具有探索性的编程
1.2.9 高性能
字节码可以(在运行时)动态地转换成对应运行这个应用的特定 CPU 的机器吗
现在的即时编译器已经非常出色,可以与传统编译器现媲美,而且在某些情况下甚至超越了传统编译器,原因是它们有更多的可用信息。例如,即时编译器可以监控哪些代码频繁执行,并优化这些代码以提高速度。更为复杂的优化是消除函数调用(即“内联”)。即时编译器知道哪些类已经加载。基于当前加载的类集合,如果一个特定的函数不会被覆盖,就可以使用内联。必要时,以后还可以撤销这种优化。
1.2.10 多线程
多线程可以带来更快的交互响应和实时行为
如今,我们非常关注并发性,因为摩尔定律即将走到尽头。不再追求更快的处理器,而是着眼于获得更多的处理器,而且要让它们一直保持工作。
1.2.11 动态性
它能适应不断发展的环境。库中可以自由地添加新方法和实例变量,而对客户端却没有任何影响。
在 Java 中找出运行时类型信息十分简单。
1.3 Java applet 与 Internet
用户从 Internet 下载 Java 字节码,并在自己的机器上运行。在网页中运行的 Java 程序称为 applet。要使用 applet,只需要一个启动 Java 的 Web 浏览器,它会为你执行字节码。
不同版本的 Netscape 与 Internet Explorer 运行不同版本的 Java,其中有些早已过时。这种糟糕的情况导致更加难于利用 Java 的最新版本开发 applet。
后来,Java 遭遇了严重的安全问题,浏览器和 Java 浏览器插件变得限制越拉越多
1.4 Java 发展简史
设备的处理能力和内存都很有限,所以语言必须非常小且能够生成非常紧凑的代码
不同的厂商会选择不同的中央处理器(CPU),因此很重要的一点是这种语言不应与任何特定的体系结构绑定
代码短小、紧凑且与平台无关,这些要求促使开发团队设计出一个可移植的语言,可以为虚拟机生成中间代码
Sun 公司的人都有 UNIX 的应用背景
不过,像 Gosling 在专访中谈到:“毕竟,语言只是实现目标的工具,而不是目标本身”。
标准版(Standard Edition)
用于手机等嵌入式设备的“微型版”(Micro Edition)
用于服务器端处理的“企业版”(Enterprise Edition)
Java 则成为服务器端应用的首选平台
5.0 这个版本增加了泛型类型(generic type,大致相当于 C++ 的模板),其挑战性在于添加这一特性而不需要对虚拟机作出任何修改
受到 C# 的启发,还增加了几个很有用的语言特性:“for each”循环、自动装箱和注解
Sun 公司终于沦陷,于 2009 年被 Oracle 收购
2014 年,Java 8 终于发布,在近 20 年中这个版本发生的改变最大。Java 8 包含了一种“函数式”编程方式,可以很容易地表述并发执行的计算。
从 2018 年开始,每 6 个月就会发布一个 Java 版本,以支持更快的引入新特性
1.5 关于 Java 的常见误解
1.Java 是 HTML 的扩展
2.使用 XML,所以不需要 Java
3.Java 是一种非常容易学习的程序设计语言
4.Java 将成为适用于所有平台的通用性编程语言
在实际中,某些领域其他语言有更出色的表现
Java 在服务器端编程和跨平台客户端应用领域则很有优势
5.Java 只不过是另外一种程序设计语言
程序设计语言的成功更多地取决于其支撑系统的能力,俄入世语法的精巧性。人们主要关注的是:是否提供了有用、便捷和标准的库能实现你需要的功能?是否有工具开发商建立强大的编程和调试环境?语言和工具集是否与计算基础架构的其他部分整合在一起?
6.Java 是专用的,应该避免使用
根据 GPL,任何人都可以得到专利许可,允许其使用和修改 Java,不过仅限于桌面和服务器平台。如果你像在嵌入式系统中使用 Java,就需要另外一个不同的许可,这很可能需要付费。
7.Java 是解释型的,因此对于关键的应用程序速度太慢了
现在 Java 虚拟机使用了即时编译器,因此采用 Java 编写的“热点”代码运行速度与 C++相差无几,有些情况下甚至更快
8.所有的 Java 程序都是在网页中运行的
9.Java 程序存在重大安全风险
10.JavaScript 是 Java 的简易版
Java 是强类型的,编译器能捕获类型滥用导致的很多错误。而在 JavaScript 中,只有当程序运行时才能发现这些错误,所以消除错误会更费劲
11.使用 Java 可以用廉价的 Internet 设备取代桌面计算机