Java不只是语言

从1995年至今,Java已经快20个年头,经过这些年的演进,正如本节标题所示,Java已不仅是个程序语言,也代表了解决问题的平台(Platform),更代表了原厂、各个厂商、社群、开发者与用户沟通的成果。若仅以程序语言的角度来看待Java,正如冰山一角,你仅看到Java身为程序语言的一部分,而没看到Java身为程序语言之外,更可贵也更为庞大的资源。

前生今世

一个语言的诞生有其目的。

1.Java诞生

Java最早是Sun公司创造的一门编程语言。

2.版本演进
版本发布日期最终免费公开更新时间最后延伸支持日期
JDK Beta1995??
JDK 1.01996 年 1 月??
JDK 1.11997 年 2 月??
J2SE 1.21998 年 12 月??
J2SE 1.32000 年 5 月??
J2SE 1.42002 年 2 月2008 年 10 月(由 Oracle 提供更新)2013 年 2 月
J2SE 5.02004 年 9 月2009 年 11 月(由 Oracle 提供更新)2015 年 4 月
Java SE 62006 年 12 月2013 年 4 月(由 Oracle 提供更新)2018 年 12 月
Java SE 72011 年 7 月2015 年 4 月(由 Oracle 提供更新)2022 年 7 月
Java SE 8 (LTS)2014 年 3 月Oracle 在 2019 年 1 月停止免费商用更新 ,Oracle 在 2020 年 12 月停止非商用免费更新, AdoptOpenJDK 在 2023 年 9 月或之前停止免费更新2025 年 3 月
Java SE 92017 年 9 月2018 年 3 月(由 Oracle 提供更新)不适用
Java SE 10 (18.3)2018 年 3 月2018 年 9 月(由 Oracle 提供更新)不适用
Java SE 11 (18.9 LTS)2018 年 9 月Oracle 不为此版本提供免费更新 AdoptOpenJDK 在 2022 年 9 月或之前停止免费更新由所使用的具体实现决定
Java SE 12 (19.3)2019 年 3 月Oracle 不为此版本提供免费更新 OpenJDK 在 2019 年 9 月停止免费更新不适用
3.江山易主

Java SE 6之后,足足等了四年多,才等到新版本的推出,可能你会问:Java怎么了?

原因有许多,下面我们挑几个主要的和大家说一下。

  • Java SE 7对新版本的规划摇摆不定,涵盖许多不易实现的新特性
  • Sun 的营收低迷不振,影响了新版本的推动,新版本推出日期承诺不断推迟
  • 2009 Oracle并购Sun,因为组织调整,进一步导致再度推迟

然后就导致了Java SE 8 是更新最大的版本。

三大平台

在Java发展的过程中,由于Java的应用领域越来越广,并逐渐扩及至各级应用软件的开发,Sun公司在1999年6月美国旧金山的Java One大会上,公布了新的Java体系架构,该架构根据不同级别的应用开发区分了不同的应用版本:J2SE(Java 2 Platform, Standard Edition)、J2EE(Java 2 Platform, Enterprise Edition)与J2ME(Java 2 Platform, Micro Edition)。

J2SE、J2EE与J2ME是当时的名称,由于Java SE 6后Java不再带有2这个号码,J2SE、J2EE与J2ME分别被正名为Java SE、Java EE与Java ME。

1. Java SE

Java是各应用平台的基础,想要学习其他的平台应用,必须先了解Java SE。

Java SE可以分为四个主要的部分:JVM、JRE、JDK与Java语言。

image-20190607172519315

Java语言只是Java SE的一部分,除了语言之外,Java最重要的就是提供庞大且强大的标准API,提供字符串处理、数据输入/输出、网络套件、用户窗口接口等功能,可以使用这些API作为基础来进行程序开发,无须重复开发功能相同的组件。

事实上,在熟悉Java语言之后,更多的时候,都是在学习如何使用Java SE提供的API来组成应用程序。

2. Java EE

Java EE以Java SE为基础,定义了一系列的服务、API、协议等,适用于开发分布式、多层次(Multi-tiered)、以组件为基础、以Web为基础的应用程序,

整个Java EE的体系是相当庞大的,比较为人熟悉的技术像是JSPServletJavaMail、Enterprise JavaBeans(EJB)等。

3. Java ME

Java ME是Java平台版本中最小的一个,目的是作为小型数字设备上开发及部署应用程序的平台,像是消费性电子产品或嵌入式系统等,最为人熟悉的设备如手机、PDA、股票机等。

JCP与JSR

Java不仅是程序语言,还是标准规范。

先来看一下

先来看看没有标准会有什么问题?我们的身边有些东西没有标准,例如手机充电器,不同厂商的手机,充电器就不相同,家里面一堆充电器互不相容,换个手机,充电器就不能用的情况,相信你我都有过。

有标准的好处是什么?现在许多计算机外部设备,都采用USB作为传输接口,这让计算机中不用再接上一些转接器,跟过去计算机主机后面一堆不同规格的传输接口相比,实在方便了不少(现在有些手机的充电器,也改采用USB接口了,这真是件好事)。

回头来谈谈Java是标准规范这件事。

首先,编译/执行Java的JDK/JRE,并不只有Sun才能实现,IBM也可以撰写自己的JDK/JRE,其他厂商或组织也可以撰写自己的JDK/JRE,你写的Java程序,可以执行在这些不同厂商或组织写出来的JRE上。

比如下面是一段程序代码:

System.out.println("Hello World");

这行程序目的是:

请系统(System)的输出装置(out)显示一行(println)Hello World。

谁决定使用System、out、println这些名称的?为什么不是Platform、Output、ShowLine这些名称?

如果Sun使用System、out、println这些名称,而IBM使用了Platform、Output、ShowLine这些名称,用Sun的JDK写的程序,就不能执行在IBM的JRE上,那Java最基本的特性之一“跨平台”,就根本无法实现了。

Java由Sun创造,为了让对Java感兴趣的厂商、组织、开发者与用户参与定义Java未来的功能与特性,Sun公司于1998年组成了JCP(Java Community Process),这是一个开放性国际组织,目的是让Java演进由Sun非正式地主导,成为全世界数以百计代表成员公开监督的过程。

任何想要提议加入Java的功能或特性,必须以JSR(Java Specification Requests)正式文件的方式提交,JSR必须经过JCP执行委员会(Executive Committee)投票通过,方可成为最终标准文件,有兴趣的厂商或组织可以根据JSR实现产品。

若JSR成为最终文件后,必须根据JSR成果做出免费且开发原始码的参考实现,称为RI(Reference Implementation),并提供TCK(Technology Compatibility Kit)作为技术兼容测试工具箱,方便于其他想根据JSR实现产品的厂商或组织参考与测试兼容性。

JCP、JSR、RI与TCK的关系.

image-20190607175721316

Java的版本历史Wikihttps://zh.wikipedia.org/wiki/Java%E7%89%88%E6%9C%AC%E6%AD%B7%E5%8F%B2

关于Java的学习路径

Java不仅是程序语言,还是标准规范,每个标准代表着厂商面临的问题,代表着解决问题的方案,也因此,学习Java,就等于在面临各式问题如何解决,然而,这么多的问题,衍生出如此多的解决方案,也因此对于初学Java的人,如同面临满载产品的庞大货轮,不知从何开始,也不知将来何去何从。

1.深入了解JVM/JRE/JDK
2. 理解封装、继承、多态
3 .掌握常用Java SE API架构
4. 学习容器观念
5. 研究开放原始码项目
6.学习设计模式与重构
7.熟悉相关开发工具

JVM/JRE/JDK

什么是JVM

JVM让Java可以跨平台,但是跨平台是怎么一回事,在这之前,得先了解不能跨平台是怎么一回事。

正常情况我们使用一种程序语言编写的程序。通过编译器编译成机器码。那后就可以执行了。

image-20190607201101886

问题在于,每个平台认识的0、1序列并不一样。某个指令在Windows上也许是0101,在Linux下也许是1010,因此必须使用不同的编译程序为不同平台编译出可执行的机器码,在Windows平台上编译好的程序,不能直接拿到Linux等其他平台执行。也就是说,你的应用程序无法达到“编译一次,到处执行”的跨平台目的

image-20190607201332350

Java是个高级语言,要让计算机执行你撰写的程序,也得通过编译程序的翻译。不过Java编译时,并不直接编译为相依于某平台的0、1序列,而是翻译为中介格式的位码(Byte code)。

Java原始码扩展名为.java,经过编译程序翻译为扩展名为.class的位码。如果想要执行位码文档,目标平台必须安装JVM。JVM会将位码翻译为相依于平台的机器码。

image-20190607201653698

不同的平台必须安装专属该平台的JVM。这就好比你讲中文(.java),Java编译程序帮你翻译为英语(.class),这份英语文件到各个国家之后,再由当地看得懂英文的人(JVM)翻译为当地语言(机器码)。

所以JVM担任的职责之一就是当地翻译员,将位码文档翻译为当时平台看得懂的0、1序列,有了JVM,你的Java程序就可以达到“编译一次,到处执行”的跨平台目的。除了了解JVM具有让Java程序跨平台的重要任务之外,撰写Java程序时,对JVM的重要认知就是:

对Java程序而言,只认识一种操作系统,这个系统叫JVM,位码文档(扩展名为.class的文档)就是JVM的可执行文件。

Java程序理想上,并不用理会真正执行于哪个平台,只要知道如何执行于JVM就可以了。至于JVM实际上如何与底层平台沟通,则是JVM自己的事。由于JVM实际上就相当于Java程序的操作系统,JVM就负责了Java程序的各种资源管理。

JRE与 JDK的区别

Java Runtime Environment就是Java执行环境,简称JRE,包括Java SE API与JVM。

image-20190607201954989

前面说过,要在.java中编写Java程序语言,使用编译程序编译为.class文件,那么像编译程序这样的工具程序是由谁提供?

答案就是是Java Development Kit! 简称JDK。

JDK包括了javac、javadoc等工具程序,对于要开发Java程序的人,必须安装的是JDK,这样才有这些工具程序可以使用,JDK本身包括了JRE,

在Java 11 之后,Oracley已经不会为我们提供单独的JRE了。

下载和安装JDK

首先需要下载JDK,本课程使用JDK 11。

https://www.oracle.com/technetwork/java/javase/downloads/index.html

image-20190607210225769

点击DOWNLOAD按钮跳转到下面的页面。

image-20190607210754136

然后点击我们下载的EXE文件。

image-20190607214556790

一直下一步就好

image-20190607220518502

image-20190607220603801

image-20190607220620040

安装目录简介

我们选择的默认路径C:\Program Files\Java\jdk-11.0.3

image-20190607230840072

我们需要知道的是bin目录, 该路径下存放了JDK的各种工具命令,常用的javac、java等命令就放在该路径下。