Java 简介

1. Java 的历史

1995 年 5 月 23 日,Sun Microsystems 公司宣布 Java 语言诞生, 当时使用 Java 的总人数还不到 30 人,可能包括 Java 语言之父詹姆斯·高斯林在内的大多数联合创始人都无法预想,Java 在未来的二十年间,居然会给互联网乃至我们的生活带来如此深远的影响。

目前 Java 提供以下三个版本:

  • Java Platform, Enterprise Edition(Java EE:Java 平台企业版);

  • Java Platform, Standard Edition(Java SE:Java 平台标准版);

  • Java Platform, Micro Edition(Java ME:Java 平台微型版)。

2006 年,SUN 公司在 JavaOne 大会上,宣布在 GNU 通用公共协议(GPL)的构架下向开源世界贡献 Java 平台,这次开放的 Java 版本包括了其标准版(Standard)、微型版(Micro)以及企业版(Enterprise)。这是一个具有 “历史性意义” 的改变。

2. 语言特性

Java 语言的诞生,重新定义了面向对象编程(OOP)。Java 语言的创建之初,就定下了以下几个目标:

  • 简单易学,并且面向对象;

  • 必须健壮且安全;

  • 摆脱平台的依赖性;

  • 高性能执行;

  • 必须是可解释的,多线程的,动态的。

2.1 面向对象

面向对象(Object Oriented)指的是一种编程方法。面向对象的主要思想是:围绕着我们所操纵的 “事物”(即对象)来设计软件。 计算机硬件的发展为软件技术的发展提供了更好的土壤,为了让大型软件项目易于管理,降低开发和维护的成本,面向对象技术也就应运而生。为了了解面向对象技术的诞生原因,我们下面来介绍几种比较具有代表性的软件技术。

2.1.1 汇编语言

汇编语言是软件技术的开端,这种语言与机器语言非常接近,并且可以很容易地转换为可执行代码。使用汇编语言的程序员,必须了解计算机的详细体系结构才能编写程序。

2.1.2 程序语言

在汇编语言之后,开发了高级语言,可以使用语言的编译器(如 gcc)将高级程序代码转换为机器指令。这样程序员无需再深入了解计算机硬件的体系结构。为了提高代码的可复用性并最大程度地减少 GOTO 指令的使用,引入了面向过程技术。虽然简化了软件流程控制的创建和维护,但是忽视了数据的组织。调试和维护许多全局变量的程序,变成了程序员的一场噩梦。

2.1.3 面向对象语言

在面向对象的语言中,数据被抽象地封装在对象中。特定于对象中的数据只能通过该对象来进行访问。这样,程序就成为了对象之间的一系列交互。Java 语言就是一个纯面向对象的语言。

2.2 跨平台性

我们也许常常听到一句口号 ——“一次编译,到处执行(write once, run anywhere.)”,这里说的就是 Java 的跨平台性,我们首先来看下在 cc++ 中,代码是如何在不同平台运行的:

cc++ 中,我们首先要将源代码文件编译为机器代码文件,然后再去执行它。这个过程中,机器代码文件必须在为其编译的平台才能执行(这里的平台指的是 Windows、Linux、Mac OS 等),也就是说,我们的代码如果希望在多个平台执行,那就必须多次编译程序。这不仅给程序员带来了繁琐的开发步骤(代码稍做变更就要重新编译整个程序),也给程序带来了更大的漏洞风险。当代码已经编译为可执行文件时,这个可执行文件不能动态更改,此时需要更改代码重新编译,以替换旧的可执行文件。

我们来看看 Java 是如何做的吧:

Java 的思想是,将代码编译为中间语言,中间语言是字节码,解释器是 Java 虚拟机(JVM)。字节码文件可以通用,JVM 是特定于平台的。如下图所示:

每一个平台都需要一个 JVM这里 JVM 是实现 “到处执行” 的关键前提,所以,在 Java 中,我们只需要生成一个字节码文件,就可以保证我们编写的程序在任何平台都能运行了。

2.3 标准化

Java 中,提供了大量的标准化库,这保证了我们使用统一的接口对程序进行控制。

2.4 异常处理

异常处理的老方式是:让每个函数返回一个错误代码,调用者会检查其返回的内容,这样就导致了代码中到处都是错误码的校验,从而让源码变得难以阅读。

在异常处理的新方式中,函数或方法不再返回错误码,而是以抛出异常的方式来进行异常处理,在 Java 中可以使用 catch 关键字来捕获在 try 语句块中所发生的异常。这样我们无需频繁通过定义错误代码的方式处理异常,代码可读性大大提高。

2.5 动态类加载

在 Java 中,如果在执行阶段不需要某个类,那么这个类就不会被编译为字节码。在网络编程中,这个特性非常常用。当我们不知道将执行什么代码时,程序可以从文件系统或远端服务器加载类。

2.6 自动垃圾回收机制

在常规语言(例如 C 和 C++)中,程序员必须确保已分配的内存被释放。防止造成内存泄漏的麻烦。

内存资源或缓冲区具有特定的操作模式以获得最佳性能。一旦缓冲区中充满了数据,就需要在不再使用其内容之后将其清除。如果程序员忘记清除其代码中的内容,则内存很容易过载。Java 使用自动垃圾收集器来管理对象生命周期中的内存。程序员确定何时创建对象,一旦不再使用对象,Java 运行时将负责恢复内存。一旦没有了对对象的引用,则垃圾回收器将自动释放无法访问的内存。

自动垃圾回收机制,让使用 Java 编写的代码更加健壮,降低了内存泄漏和溢出的风险。程序员唯一需要注意的是对象创建的速度。如果应用程序创建对象的速度超过了垃圾收集器释放对象的速度,则可能导致内存相关问题。

3. Java 的版本历史

Java 的主要发行版本及其发行日期如下:

  • JDK 1.0(1996 年 1 月 23 日)

  • JDK 1.1(1996 年 2 月 19 日)

  • J2SE 1.2(1998 年 12 月 8 日)

  • J2SE 1.3(2000 年 5 月 8 日)

  • J2SE 1.4(2002 年 2 月 6 日)

  • J2SE 5.0(2004 年 9 月 30 日)

  • Java SE 6(2006 年 12 月 11 日)

  • Java SE 7(2011 年 7 月 28 日)

  • Java SE 8(2014 年 3 月 18 日)

  • Java SE 9(2017 年 9 月 21 日)

  • Java SE 10(2018 年 3 月 20 日)

  • Java SE 11(2018 年 9 月 25 日)

  • Java SE 12(2019 年 3 月 19 日)

  • Java SE 13(2019 年 9 月 17 日)

  • Java SE 14(2020 年 3 月 17 日)

  • Java SE 15(2020 年 9 月 15 日)

  • Java SE 16(2021 年 3 月 16 日)

4. 名词解释

我们将在后续详细介绍如何在不同平台上安装 Java,在安装 Java 之前,我们需要理解两个名词,JDK 和 JRE:

  • JRE:Java Runtime Environment (Java 运行时环境)

  • JDK:Java Development Kit (Java 开发工具包)

以上两个名词是 Java 平台的两大重要软件,他们分别可以帮助用户运行开发 Java 程序,JDK 是 JRE 的超集,包含 JRE 的所有内容,以及开发小程序和应用程序所需的工具,例如编译器和调试器。

简单来说,我们如果想要利用 Java 语言去开发应用程序,就要在我们的电脑上安装 JDK。本教程使用最新版本的 Java 16

5. 学习基础

学习本教程,最好有一定的计算机基础知识,熟悉计算机软件的下载、安装等。当然,如果你没有任何基础知识也不必担心,本教程会尽量使用通俗易懂的语言来讲解知识点。

6. 小结

在大多数人看来,Java 语言已经非常完美,但是,Java 语言并非没有缺陷,Java 语言缺少硬件特定的数据类型,也没有能够指向任意地址的指针或编程方法之类的功能。尽管这些功能有可能被程序员误用或滥用,但不得不承认它们是强大的工具。

在本节中,我们对 Java 语言的历史以及主要特性有了一个初步的了解,小伙伴们是不是已经迫不及待,要更加深入了解 Java 了呢?那么在下一小节,我们将了解如何在自己的电脑上安装 Java。