Java历经多年发展,知识体系庞大且复杂,包含大量的概念、技术点、原理等。

即使从事多年Java开发,依然不敢很肯定完全吃透了Java。

仿佛在知识的海洋中游泳,游了很久也看不到边际。

image-20210603115307805

怎样避免这种困境,提高Java的学习效率呢?

笔者认为最好的方法是掌握Java体系的全貌,进而在实战中有计划、有针对性的迭代式学习。

1.从Java概念图理解Java体系

在《Java Platform Standard Edition 8 Documentation》中,列举了一张图——“Java Conceptual Diagram”——即Java概念图。

虽然这张概念图不能代表Java体系的全部,但是这张概念图为我们提供了两个重要信息:

  • Java SE的产品构成。
  • 各个产品的关系。
  • 产品包含了哪些组件。

image-20210603120446121

1.1.JavaSE的产品构成

在文档的开篇:

Oracle has two products that implement Java Platform Standard Edition (Java SE) 8: Java SE Development Kit (JDK) 8 and Java SE Runtime Environment (JRE) 8.

Oracle告诉我们:

Java SE 8 = 产品1(JDK 8) + 产品2(JRE 8)

  • Java SE 8,全称Java Platform Standard Edition (Java SE) 8

  • 产品1:JDK 8,全称 Java SE Development Kit (JDK) 8

  • 产品2:JRE8,全称 Java SE Runtime Environment (JRE) 8

1.2.JDK8与JRE8的关系

在文档的Section2:

JDK 8 is a superset of JRE 8, and contains everything that is in JRE 8, plus tools such as the compilers and debuggers necessary for developing applets and applications. JRE 8 provides the libraries, the Java Virtual Machine (JVM), and other components to run applets and applications written in the Java programming language. Note that the JRE includes components not required by the Java SE specification, including both standard and non-standard Java components.

我们可以知道:

JDK 8 是 JRE 8 的超集

  • JDK8:除了包含 JRE 8,JDK8额外还有开发小程序和应用程序所需的编译器和调试器等工具。
  • JRE 8:提供了库、Java 虚拟机 (JVM) 和其他组件来运行用 Java 编程语言编写的小程序和应用程序。JRE 包括了Java SE 规范不需要的组件,包括标准和非标准 Java 组件。

2.Java Language

在Java的概念架构中,第一个组件是"Java Language”,这个组件包含了Java的语言语法。

image-20210603144339225

那么,我们应该如何学习这个组件呢?

2.1.了解Java各版本的新特性列表

这是一件非常重要的事,通过新特性,可以把握Java语言以及编程语言的发展趋势。

image-20210603145513209

2.2.浅尝辄止《Java Language Specification》

《Java Language Specification》——Java语言规范。这份文档像一本工具书,刚开始更适合"浅尝辄止”。

image-20210603150036175

从这份规范的作者,我们就可以知道《Java Language Specification》的分量。

image-20210603150736346

《Java Language Specification》讲述的内容,可以概括为如下8点:

(1)语言的设计思想

规范的开篇讲解了Java编程语言的语言风格、词法结构、句法、语法。

image-20210603151646129

每种编程语言都要遵循一种套路,编译原理就是这种套路的高度抽象,有兴趣更加深入地理解《Java Language Specification》上述章节中的一些概念,可以阅读龙书虎书这两部经典著作:

image-20210603154258626

image-20210603154332760

(2)变量

Java语言规范中,将数据类型、变量、类型擦除等放在一起讲的,这是站在"编译原理"的视角来阐述的。

作为编程语言的学习者和使用者,可以先了解Java这种语言如何声明与初始化。

image-20210603152148650

(3)数据类型

这部分讲述了Java提供的基础数据类型、包装类型,重点阐述了数据类型转换、拆箱装箱等。

这部分是实战中最常用的语法知识。

image-20210603153325400

(4)表达式

这部分讲述了Java的表达式、运算优先级等语法知识,这也是一种编程语言的基础语法设施。

image-20210603153403473

(5)控制语句

在14章中,讲述了块、语句,控制语言也是编程语言语法的重要基础设施之一。

image-20210603153426618

(6)方法、面向对象

在Java语言规范的第8/9章中,阐述了类、接口相关的语法。

这些语法知识属于面向对象的编程语言的重中之重。

第13章,还阐述了类、接口的语法演进。

image-20210603153521546

(7)异常处理

异常有哪些种类?如何处理异常?异常体系也是一种编程语言的基础设施。

image-20210603153533675

(8)代码组织方式(package)

在Java 8中,包是相对比较好理解和掌握的语言语法,也是编程语言的基础设施。

在模块化的激烈斗争中,Java 11支持了模块化特性,模块化特性在Java 11中是重要的学习内容。

image-20210603153610292

2.3.反复探索《Java Language Specification》

《Java语言规范》作为一门编程语言的规范,词句必然是简洁精炼、高屋建瓴、高度抽象的。

比如在讲解类型推断的部分,《Java语言规范》采用了接近数学公式的抽象逻辑表达,严谨、逻辑性极强。

反复阅读这种思维模式,非常有利于提升我们的抽象能力和逻辑能力。

image-20210603163351690

我们可以把《Java编程规范》当做一本工具书。

当实战中踩到某个语法陷阱时,回过头再来翻阅《Java语言规范》是一种不错的学习方法。

每当带着实战中的教训和经验,重读规范中的语句,就会理解其中的隐喻和背后的原因。

这有点像佛教徒学习《金刚经》的修行过程,刚开始看山是山,而后经历看山不是山、看山又是山的过程。

image-20210603163049574

3.Libraries

Java概念架构中第二大组件就是语言本身自带的类库,《Java语言规范》将这些类库分为了3大类:

  • Lang and Util Packages
  • Other Base Libraries
  • Integration Libraries

说明1:User Interface Toolkits属于使用Java进行客户端开发的定向场景,所以本文不展开描述

说明2:Deployment属于没落和抛弃的特性,本文不展开描述

image-20210603163604627

按照这样的划分方式,还是很难直奔主题地抓住Java提供的类库重点,我们可以进行另一种分类:

  • 核心类库:基于Java Language的语法特性,实现的类库。
  • 扩展类库:基于核心类库实现的类库,这种类库用来解决实战中的某种应用场景。

3.1.核心类库

核心类库主要包括:集合、多线程、反射

集合、多线程、反射,也促进了Java体系中,产生了各种有趣的类库、模块、中间件。

image-20210603170428978

其中,Collections官方文档的逻辑脉络,比较好地可以指导我们高效学习Java类库。(以List为例)

  • 首先,官方文档讲述了集合体系的宏观结构,这个是掌握好集合的第一步。

image-20210603171247671

  • 然后,文档中讲解了List操作的几大类场景,以这些场景作为线索,我们可以去查阅List中对应的API。

image-20210603172058619

  • 最后,文档描述了一下List的API的算法实现。

理解API的算法实现也是一件非常重要的事情:只有理解了API的实现采用了哪种经典算法,才能更好地选择合适的API解决合适的实战问题。

image-20210603172416586

3.2.扩展类库

扩展类库主要包括:IO编程、序列化、正则表达式、数据库、网络编程。

这些类库的API很多,短时间的集中学习也不太可能熟练掌握。

笔者的经验是先了解这些类库的原理、能做哪些事情,然后在实战中使用这些API。

NIO就是一个很好的例子,我们可以理解一些原理性的知识:

  • BIO、NIO、AIO是什么
  • NIO中的Buffer、Channel、Selector是什么
  • 零拷贝

等到实战中需要用到NIO的时候,再查阅NIO的类库API。

4.Java Virtual Machine

Java虚拟机是整个Java体系的基石,也是Java概念架构中最难突破的第三大组件。

image-20210603173309154

JVM本身就是一个庞大的技术体系:

  • 字节码
  • 类加载子系统
  • 运行时数据区
  • 垃圾回收算法和垃圾回收器
  • JIT

所以,JVM是一个长期、反复的学习过程,随着对JVM的理解加深,我们再次回顾Java LanguageLibraries,会看到语法特性、类库的在虚拟机层面的底层实现,甚至到操作系统的底层实现。

5.Tools & Tool APIs

Java概念架构中第四大组件就是工具以及工具API。

image-20210603174538915

从工具形态看,Java的工具包括:

  • 命令行工具
  • GUI工具

从应用场景看,Java的工具包括:

  • 编译
  • 监控
  • 辅助(例如:javadoc)

无论怎样分类,怎样才算掌握了这种工具呢?

笔者曾经陷入过2种误区:

  • 误区1:刚开始,觉得工具本身不是很关键的技术点,等到用的时候再查Java的工具手册就好了。结果等到真的查文档的时候,才发现怎么有这么多参数、这么多概念要理解?真是"书到用时方恨少”。
  • 误区2:经历了误区1的伤,很容易陷入另一个极端——那我就把工具手册逐字逐句的仔细阅读,把命令行参数都敲一遍。结果发现,即使背下来了命令行的参数也没用,因为工具最难掌握的是工具输出的报告,这些报告中包含着定位内存泄露、线程死锁的线索。为什么这些工具输出的报告难以看懂呢?因为这些工具的监视对象、作用对象是JVM,输出的报告中有大量的JVM的概念、术语。

所以,真正掌握这些Tools,强依赖对Java Virtual Machine的深入理解。

Tools & Tool APIs中另一个重点/亮点就是APIs:

  • 在JDK1.4中,JVM提供了JVMPI,这是用来监控JVM信息的接口。
  • 在JDK1.4中,JVM提供了JVMDI,这是用来调试JVM的接口。(例如:IDE就是依赖这种接口实现了编译、调试等功能)
  • 在JDK5中,JVM提供了JVMTI,最终收编了JVMPI和JVMDI,提供了更高级的JVM接口。
  • 在JDK9中,JVM提供了JVMICI,可以用来扩展编译能力的接口。

比如:一个已经在运行的Java进程中,如何动态运行一段用户提交的java源码呢?就可以通过JVMTI实现。

6.总结

本文主要内容:

  • 了解Java体系的全貌,是一种高效学习Java的方法。
  • Java的概念架构。
  • Java概念架构中的组件1:Java Language
  • Java概念架构中的组件2:Libraries
  • Java概念架构中的组件3:Java Virtual Machine
  • Java概念架构中的组件4:Tools & Tool APIs

7.参考文献

https://docs.oracle.com/javase/8/docs/