一 总体概述
最近下定决心要把将近10年前买的《Java编程思想》(第4版)(Thinking in Java Fourth Edition)这本大黑书量子速读一下,看这本书到底是怎样的一个定位,适不适合新手入门,值不值得老手研读。
在通读这本书之前,我一直认为这本书是应该当作工具书来用,就是遇到什么不会的了直接过来查阅。直到我真的把这本书读差不多的时候,我意识到这本书其实更适合通读,而不是查阅,因为其侧重对编程思想的阐述,对于语法的讲解并不够直接,很大的篇幅其实都是在讲编程实践中Java语言特性的一些例子。最终我给这本书的定位:适合新手入门,并且对一些较为深入的概念有基本的探讨,但不会过深,书中的讲解侧重于面向对象编程思想的体现。例如对JVM内存、垃圾回收机制、设计模式等有简单的介绍和示例,但并不会深入。这些对于新手入门来说足够了,对于有开发经验的老手来说也有一定的复习意义。
值得一提的是书中给的例子基本都是相当到位的,对要讲解的特性有着非常好的体现。同时对于一些比较刁钻的问题也有相关的示例。既然书名都叫编程思想了,那么撰写时必然或更加侧重编程思想的体现,书中的例子就很好地体现了面向对象编程思想。还有非常好的一点就是书中是有很多练习题的,如果把这些练习题都做了,或者研读了答案,一定能让新手更快地学会这门语言。
《Java编程思想》是以Java SE5/6为基础进行讲解的,阐述了很多Java SE5的新特性(竟然不是我们最常用的Java8,好在Java6到Java8的新特性并不是太多)。我们可以从Java版本更迭的时间点图示中得知,JDK 1.4到JDK 1.5的这次更新Java才正式命名为Java5,可见这次更新添加了许多至关重要的特性。本文也会有一个章节总结在《Java编程思想》中对Java5新特性的总结。
我对本书中的各个章节进行了总结,提炼出了每章中我认为值得注意的点,同时我也给出了每一章的推荐指数,推荐指数仅取决于我个人阅读后的主观感受:是否有收获以及阅读体验。部分章节也给出了新手必看的字样,就是字面意思,这些章节是基础中的基础。推荐指数和新手必看是两个独立的指标,并不会因为是新手必看所以推荐指数会高。
温故而知新,在通读这本书时也发现了一些以前没注意到或者不太在意的细节,我在本文第四章节进行了罗列。
二 Java SE5 新特性
1.Javadoc标签@deprecated -> @Deprecated (2.8.4 一些标签示例);
2.Foreach语法 (4.4);
3.枚举类型enum (4.8 switch;5.9 枚举类型);
4.可变参数列表 (5.8.1);
5.添加@Override注解 (7.4.2 名称屏蔽);
6.内嵌调用自动化,final不再用于性能优化 (7.8.2 final方法);
7.协变返回类型 (8.4);
8.添加@SuppressWarnings注解 (11.1 泛型和类型安全的容器);
9.迭代器接口Iterable (11.13 Foreach与迭代器);
10.StringBuilder (13.2);
11.格式化输出 (13.5.1);
12.Scanner类、Readable接口 (13.7 扫描输入);
13.泛型:参数化类型 (15);
14.自动包装机制 (15.11.1);
15.容器相关新特性:Queue接口、ConcurrentMap接口、CopyOnWriteArrayList和CopyOnWriteArraySet、EnumSet和EnumMap以及Collections工具类中的新方法 (17.1)。
三 章节概述
第一章 对象导论 (推荐指数:⭐⭐⭐⭐⭐ 新手必看)
面向对象编程思想的概述:①万物皆为对象,②程序是对象的集合,其通过发送消息来告知彼此所要做的,③每个对象都有自己的由其他对象构成的存储,④每个对象都拥有其类型,⑤某一特定类型的所有对象都可以接收同样的消息。
本章也对面向对象编程中的一些核心概念进行了概述:接口、访问控制、组合和继承、多态、容器、对象创建和生命期、异常处理、并发等。
第二章 一切都是对象 (推荐指数:⭐⭐⭐⭐ 新手必看)
编写“HelloWorld”程序必须知道的一些知识:class、new、static等关键字的用法,如何定义一个类、基本类型等。本章会带领你写出第一个Java程序。
第三章 操作符 (推荐指数:⭐⭐⭐⭐⭐ 新手必看)
本章对Java中的操作符有了比较全面的讲解,包括算术、关系、按位操作符等等。如果有其他语言基础,这一章是非常好掌握的。需要注意的是Java中并不支持操作符的重载。
第四章 控制执行流程 (推荐指数:⭐⭐⭐⭐⭐ 新手必看)
程序必须在执行过程中控制它的世界,并做出选择。条件分支和迭代是程序逻辑的核心,本章讲解了诸如if、while、for、break、continue、return、switch等关键词的使用。
第五章 初始化与清理 (推荐指数:⭐⭐⭐⭐⭐ 新手必看)
Java是一门更加安全的语言,得益于其初始化和清理相关的流程:构造器会确保对象的初始化、对象的清理则由垃圾回收器负责。本章介绍了构造器的使用和垃圾回收机制。相比C++,Java的垃圾自动清理功能为程序员大大简化了对象生命周期的管理。
第六章 访问权限控制 (推荐指数:⭐⭐⭐⭐ 新手必看)
访问权限控制首先是为了解决名称冲突的问题,其次是低层程序员向上层程序员指明哪些可用、可修改,哪些不可用、不可修改。其实一张图就可以概述4种访问权限。
第七章 复用类(推荐指数:⭐⭐⭐⭐⭐ 新手必看)
组合和继承是复用代码的常用手段,当需要进行向上转型时优先考虑继承的方式。更通俗来讲,选择组合还是继承还是取决于对象的具体语义,如果新类型与基类是is-a的关系就用继承,如果是has-a的关系,那就用组合。例如汽车Car,汽车是一种交通工具TrafficTool,那Car就可以继承自TrafficTool,而引擎Engine,则只能说Car具有引擎,Car类的内部有Engine这个成员属性,而不能说Car是一种Engine。
同时在本章中也介绍了继承相关的关键字:protected、final.
第八章 多态(推荐指数:⭐⭐⭐⭐⭐ 新手必看)
本章是对继承的深入探讨。Java实现多态的方式是动态绑定,即方法的调用是运行时才确定的。多态可以理解为“一个引用调用的是哪一个方法,取决于这个引用所指向的对象”。继承与向上转型是密不可分的,还是举交通工具的例子,比如说要对多种交通工具进行调用,Car、Train、Airplane都继承TrafficTool,然后定义一个TrafficTool类型的列表List,以上三种交通工具都可以放入这个列表中,然后在使用时,对其进行遍历调用比如TrafficTool的move()方法,这个方法在三种交通工具中都有各自的实现,在调用时就能够调用对象各自对应类型的方法。
本章也对静态方法和构造器在继承中的一些细节进行了阐述。
第九章 接口 (推荐指数:⭐⭐⭐⭐⭐ 新手必看)
本章对抽象类和接口进行了探讨。简单理解抽象类:抽象类允许其方法只有声明而没有具体实现。而接口是一种更纯粹的抽象类,所有的方法都没有具体实现(至少在Java6是这样,Java8更新了接口的默认方法特性)。接口更重要的作用是实现类似于C++中的多重继承特性,类是可以实现多个接口的。因此接口可以理解为“是,但只有一部分是”这个概念,也就是说接口可以只是类的一小部分,但这个类完全可以当作这个接口来使用。当使用接口作为方法的参数时,便可以体会到其强大之处(详见9.6 适配接口)。
本章也使用了几种设计模式的例子:策略模式(9.3)、适配器模式(9.3)、工厂模式(9.8).
第十章 内部类 (推荐指数:⭐⭐⭐⭐)
内部类即定义在某个类的内部、定义在某个方法内部或定义在某个域内部的类,内部类可以获取外围类中的所有属性和方法。Java内部类的特性其实是对多重继承特性的完善:“每个内部类都能独立地继承一个接口的实现,所以无论外围类是否已经继承的某个接口的实现,对于内部类都是没有影响的。“
我理解的内部类特性主要目的是隐藏,即内部类的定义我是不希望他人来修改复用的,所以我才定义了内部类。匿名内部类则是更加重要和常用的,例如在使用SWT/JFace为组件添加监听器时,往往需要将监听器接口的方法进行实现,实质是定义了一个匿名内部类,这种编程方式其实类似于模板方法设计模式:流程是一致的,只是其中的某些具体步骤,我需要对其进行自定义的修改。而在Java8中新增了lambda表达式,如果匿名内部类继承的接口只有一个方法,则可以简化为使用lambda表达式进行定义。
第十一章 持有对象 (推荐指数:⭐⭐⭐⭐⭐ 新手必看)
本章对Java基本容器有比较全面的讲解。容器主要分为两类:Collection、Map,分别是元素序列和键值对,常用的接口分别是List和Map。本章对于容器接口和具体实现的API有比较详尽的讲解,这里不进行赘述。
第十二章 通过异常处理错误 (推荐指数:⭐⭐⭐)
异常处理是为了增加程序的健壮性。本章对Java中的异常相关特性进行了讲解:基本的异常模型、自定义异常、异常的捕获等。
第十三章 字符串 (推荐指数:⭐⭐⭐⭐⭐ 新手必看)
本章讲解了字符串的基本使用:String类型不可变性、基本API、StringBuilder、格式化输出等,也有较大篇幅讲解了正则表达式的基本使用。
第十四章 类型信息 (推荐指数:⭐⭐⭐)
识别对象和类的信息有两种方式:1.RTTI (Runtime Type Identification 运行阶段类型识别),使用的是编译时获取到的类型信息,Class对象是RTTI实现的核心;2.反射机制,允许在运行时发现和使用类的信息。
运行时对象的自省能力是非常强大的,是实现动态代理的基础。
第十五章 泛型 (推荐指数:⭐⭐⭐ 新手必看)
如果希望类或方法能够具备最广泛的表达能力,那么将类型进行参数化将是一种不错的选择。Java中所有对象都是Object的子类,这就给泛型的实现提供了基础。由于泛型并非Java与生俱来的特性,在Java5添加泛型特性的时候必须考虑兼容性,因此使用了擦除的方式来实现泛型,即在泛型代码内部无法获得泛型参数的信息。最直观的例子:List<TrafficTool> list = new ArrayList<Car>(); 这行代码是无法通过编译的,原因就是编辑器无法获取TrafficTool类型和Car类型的信息,从而也无法得知其具有继承关系。但是可以通过指定边界来进行修改:List<? extends TrafficTool> list = new ArrayList<Car>(); 这样就可以通过编译了。
本章还有一些不常用特性的讲解:超类型通配符、自限定类型、混型等。
第十六章 数组 (推荐指数:⭐⭐⭐⭐⭐ 新手必看)
数组是一块连续的内存,用来存储相同类型的元素的数据结构。相比容器例如ArrayList,数组在时间和空间上都有着更高的效率。本章介绍了数组相关基本API的使用,也包括泛型数组、Arrays工具类API等内容。
第十七章 容器深入研究 (推荐指数:⭐⭐⭐⭐⭐)
本章讲解容器的高级特性:包括Collection、List、Set、Queue、Map等接口的进阶API的使用与底层实现机制,hashCode()方法和equals()方法的作用和联系,Collections工具类的基本使用,软引用弱引用及幻象引用的基本概念和作用,早期Java版本提供的容器等内容。容器相关类和接口的完整关系图如下。
本章是讲解数据结构的重要章节,是面试常考的内容。
第十八章 Java I/O系统 (推荐指数:⭐⭐⭐)
输入输出系统是对于各种流相对于Java程序而言的输入输出使用的API,包括文件流、网络流、视频流等。实际工程实践中一般就是会用即可,我对本章也粗略地进行了翻阅,不打算细细研读。Java I/O是装饰器模式的经典实践,可以带着这个思考来进行这一部分的学习。
第十九章 枚举类型 (推荐指数:⭐⭐)
本章对enum关键字、枚举类、EnumSet和EnumMap进行了讲解。枚举类除了用在switch的条件中,还常与多态、泛型和反射等功能结合使用,可以结合本章的示例进行学习。
第二十章 注解 (推荐指数:⭐⭐⭐)
注解(或称元数据)是写给编译器看的信息,而并非代码。本章介绍了一些常用的注解,着重讲解了注解处理工具apt的使用和单元测试相关注解。
第二十一章 并发 (推荐指数:⭐⭐⭐⭐⭐)
并发编程是面试考察的重点。本章对Java中并发相关的API有较为全面的讲解,包括线程相关API的使用、临界资源的共享、线程同步、死锁现象等内容。
第二十二章 图形化用户界面 (推荐指数:⭐)
本章主要介绍了AWT/Swing的图形化API,简单介绍了SWT第三方图形化API。使用Java进行图形化开发目前已经应用很少了,当前Web前端技术已经占据了用户界面领域的大半江山。即便有项目在使用Java开发界面,也更倾向于使用SWT/JFace的方案而并非AWT/Swing,因为SWT/JFace有着更加成熟的RCP (富客户端框架)作为支持,开发更加简单且界面更加美观。
四 细节
1.Java中仅支持无符号右移位操作符 >>> ,而不支持也不需要支持无符号左移位操作符;
2.使用逻辑操作符(&& || !)会发生短路现象,而使用按位操作符(& | ^ ~)则不会发生短路;
3.switch的选择因子只能是整数(枚举类型);
4.即便类(例:class Example )是private的,也可以使用java Example来调用其main函数;
5.导出类(子类)在尝试重写基类(父类)的private方法时,并不能成功地重写,因为导出类无法访问基类的private方法,private方法被自动认为是final的。编译器会视为在导出类中定义了一个新方法,只不过是跟基类的方法同名了而已。当在方法前加上@Override注解后,编译器才会报错;
6.构造方法实际上是static的,只不过该声明是隐式的。构造方法的调用是从基类开始随层级依次调用到导出类的;
7.定义内部类时可以使用.this和.new语法,分别用来获取内部类对象和调用内部类构造方法。
五 写在末尾
在2026年如果你问我新人想学习Java语言该看什么书,我或许并不会推荐这本2007年出版的古董书,因为现在的人们都不怎么读书了,即便读,市面上也有更多效率更高且版本更新的Java语法书籍,用这本书来学Java语言本身其实有点杀鸡用牛刀的感觉了。最扎心的是如果只读书是无法学会一门编程语言的,必须有大量的编程实践。但如果你想学习面向对象编程思想,那我还是会毫不犹豫地推荐这本《Java编程思想》的。