一文彻底搞懂Java和JDK的版本命名问题

Java是面向对象的编程语言,在我们开发Java应用的程序员的专业术语里,Java这个单词其实指的是Java开发工具,也就是JDK(Java Development Kit)。所以我们常常在CSDN等各大程序员论坛讨论到安装Java8或者JDK8或者JDK1.8或J2SE8或J2SE1.8或J2SE8或J2SE1.8,其实这3个专业词汇的概念是一样的。

告诉庆哥,你对Java的版本号以及JDK的命名真正清楚嘛?比如:

  1. Java8
  2. Java SE 8.0
  3. JDK1.8
  4. ……

知道这些是怎么回事嘛?知道还有个Java 2的说法嘛?知道还有以下说法嘛?

  • J2SE1.3
  • J2SE1.4
  • ……

现在已经6月份了,到了9月份,一个新的长期支持版本,Java17就要发布了,啥?Java版本都到17了?不不不,我一直在用JDK1.8啊,咦,JDK1.8?Java17?

这是怎么回事呢?别着急,今天庆哥带你彻底搞懂这些蜜汁操作!

Java版本和JDK版本

要搞懂这些令人疑惑的人命名,那理解的一个关键就是Java版本和JDK版本了,首先啊,咱们常说Java有三个版本,对吧,分别是:

  • JavaSE(Java Platform,Standard Edition)Java标准版
  • JavaME(Java Platform,Micro Edition)Java微型版
  • JavaEE(Java Platform,Enterprise Edition) JAVA企业版

其实啊,你只要关注JavaSE就行,这个是Java的标准版本,像ME忽视就行,至于JavaEE是在JavaSE的基础上升级而来的一套规范,我们平常做Java开发,你想下,是不是就是需要个JDK,这个JDK是与JavaSE相对应的。

完了,我知道你们又懵了……

JavaEE到底是个啥

那我就再详细点给大家说说这个JavaEE,其实我们平常听到最多的,用到最多的就是JavaSE,因为人家是Java的标准版本,但是这个JavaSE提供的是Java的核心功能,一般是用来开发桌面应用的,但是企业级开发,我们做的项目啥的就不简简单单是个桌面级应用了,一般是web应用,动态网站这些!

那么问题来了,面对企业级的比较大的项目开发,JavaSE提供的一些核心基础功能用倒是可以用,但是用起来太费劲了,很多东西都得自己从头造轮子,一步步的用代码从最基础的开始写,费劲啊。

于是乎,在JavaSE的基础上整理出一套规范,其目的就是用来解决企业级开发中遇到的一些问题,这些问题就是单独用JavaSE去整比较费劲的东西!

那啥又是规范呢?说白了,就是规定你该怎样怎样去做,比如面对常见的web请求处理,我们知道有servlet,那JavaEE就对servlet做了规范,也就是说你如果要用servlet去处理一个web请求,首先嘞,你必须得实现一个HttpServlet类,这还没完,你这个类还得继承Servlet接口,而且你还得实现它的接口方法,哪些呢?就是doGet和doPost这些,咋样,熟悉吧,再比如你这个doGet方法还必须得接收两个参数……

你看,JavaEE就给你规定了Servlet得按照这个规定去使用,于时一些其他厂商就围绕JavaEE的这些规范去做一些具体的实现,比如我们常见的tomcat,它被成为servlet容器,其中的servlet实现就是给予JavaEE对servlet做出的规范!

说的再简单点,JavaEE规定了servlet如何去处理web请求,然后具体的厂商根据这个规定去做具体的实现和增强,然后就搞出了tomcat……

那Spring是啥呢?最开始的Spring就是为了解决JavaEE在使用中遇到的一些问题,比如JavaEE中规定的servlet,那spring中的spring-mvc就是对这个servlet的进一步封装,从而让其变得更加好用!

实际上,spring中大量使用了或者实现了JavaEE的一些规范标准!说的再直白点,你JavaEE不是一组规范嘛,规定了啥啥啥该怎么用,那我spring就这样做,你规范中确实比较好用的我就直接拿来用,不好用的我就在加工处理封装成更好用的,可以简单的理解成spring就是JavaEE的升级版,或者超强实现版!

随着时间的发展,JavaEE的更新太慢了,而Spring就非常迅速,而且人家超级好用,因此,慢慢的JavaEE早就落后十万八千里了。

你像我们平常做开发,就下载配置个JDK,其实就是对应的JavaSE,然后我们使用的一般就是以Spring为主的框架了,那JavaEE体现在哪里,Spring框架中大量使用和实现了JavaEE规范,而JavaEE又是在JavaSE基础上升级而来的一组规范,那可不就是一个JDK就行了!

所以,现在你看一些关于JavaEE开发框架的书,其实都是在介绍SSM这些框架的,说白了,JavaEE慢慢也就成了各种给予其规范实现的一些框架了,为首的就是老大哥Spring了!

Java版本的蜜汁操作

以上花了较多篇幅去介绍到底啥是JavaEE以及和Spring的一些关系,你就记住:

用Spring就对了

那我们再来看Java版本号的这些神奇操作,之前也说了,理解的关键就是Java版本和JDK版本,重点理解如下:

我们无论说Java版本还是JDK版本都是对于JavaSE这个标准版本而言,最终的则是要知道,每个Java版本其实是对应一个具体的JDK版本,也就是说Java是语言,JDK是Java这门语言的开发工具包,所以Java的版本可以说是抽象上的宏观上的一个概念,有其自己的版本名称,对应的具体的实实在在存在的则是JDK了

记住啦,一个Java版本对应着一个JDK版本!

我这里花了一个图,大家一起来看下:

也就是最开始啊,Java的早期版本是在1995年发布的,那个时候是叫做Oak,但是这个商标被注册了,于时在1996年的时候更改为Java,那这个时候Java的第一个正式版本Java1.0就发布了,于此同时对应的开发工具包jdk的版本就是JDK1.0了。

J2SE是个啥

那随着时间的发展,Java的版本不是一直叫做Java1.X这种形式,在到了1998年的时候,Java的平台更名为J2SE,所以从那个时候,Java的版本命名就成了J2SE 1.2这种形式,也就是这里:

那与之对应的JDK的版本就是JDK1.2和JDK1.3这种形式了!

JDK1.5的重大变化

那到了2004年的时候,Java版本变化比较大,此时对应的JDK1.5升级比较大,那为了表明该版本的重要性,于时将Java版本从原来的J2SE 1.5更名为Java SE 5.0(内部版本号1.5.0),于是后续的Java版本号都是Java SE X的这种形式,也就是这样:

这里需要注意的是,直到2017年JavaSE 9的发布,此时对应的JDK版本都是JDK1.X这种形式,但是到了2018年JavaSE 10的发布就变了!

JDK命名的变化

到了2018年发布JavaSE 10的时候,此时对应的JDK版本不再是JDK1.10这种形式,而是变成了JDK10这种形式,其实这个也是比较好理解的!

那后续的版本就是这个样子了:

直到现在一直就稳定这样的命名了,比如最新的JavaSE 16对应的JDK16,那到了这里,又有个蜜汁操作了,我们看下Oracle的官网上的JDK变化:

看到没,这里有JDK7,JDK8还有JDK9,按照我们之前说的不应该是这样的嘛:

所以说啊,关于Java的版本和JDK版本命名真的挺乱的,在2018年更新JavaSE 10之后,对应的JDK版本叫做JDK10,后续为了方便统一,之前的JDK1.8也可以叫做JDK8了!

不过到了现在,Java的版本号比较稳定了,也就是Java SE XX这种形式,比如即将发布的Java SE 17,这是一个长期受支持的版本!那对应的JDK版本就是JDK17了。

查看JDK版本的更新内容

作为一个Java程序员,你要随时关注着Java的版本更新,以及JDK的升级带来了哪些新特性,那该如何关注这些呢?

其实就是这个:

比如我们点击最新的JDK16:


不知道的赶紧收藏这个地址吧:https://docs.oracle.com/en/java/javase/index.html

查看Javav版本变化

另外这里再提供一个随时查看Java版本变化的地址,可以看到一个比较直观的图片,就是这样的:

是不是很直观呢?

赶紧收藏地址吧:https://zh.wikipedia.org/wiki/Java%E7%89%88%E6%9C%AC%E6%AD%B7%E5%8F%B2

小结

以上内容是我根据自己的经验以及查找相关资料所得,当然,其中的内容也有可能存在一些错误,比如关于JavaEE那块的理解,我理解的可能不够准确,因此,如果你在阅读本文中发现描述不够准确或有误的地方,还请给予我一定的反馈,非常感谢!

到此这篇关于一文彻底搞懂Java和JDK的版本命名问题的文章就介绍到这了,更多相关Java和JDK的版本命名内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java修改maven的默认jdk版本为1.7的方法

    问题: 1.创建maven项目的时候,jdk版本是1.5版本,而自己安装的是1.7或者1.8版本. 2.每次右键项目名-maven->update project 时候,项目jdk版本变了,变回1.5版本或者其他版本 解决办法: 解决办法一:在项目中的pom.xml指定jdk版本,如下: <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <ar

  • java项目jar包与jdk的版本不兼容的问题解决

    这篇文章主要介绍了java项目jar包与jdk的版本不兼容的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在我们搭建框架或者引入jar包是,总是会因为版本不统一导致版本兼容问题,而且错误还不好找, 今天就遇到了一个问题Unsupported major.minor version 52.0并记录下解决方案 错误原因: 我当时使用的是jdk7,因为公司是传统行业,所以jdk的版本不是很到,而我现在需要搭建一套新的项目框架,我引入了一些最

  • java 指定某个jdk版本方法

    java 指定某个jdk版本方法 指定某个jdk版本方法 背景:当我们在同一台机器上运行多个Java程序,但是所需的java版本不同,此时就需要在运行容器如tomcat中指定所需的jdk版本 jar文件方式 写启动脚本run.sh 内容如下: #!/bin/bash JAVA_HOME=/home/xinli/jdk1.8.0_92 JAVA=$JAVA_HOME/bin/java nohup $JAVA -jar yunnan-rest-service-0.1.0.jar -Djava.ext

  • 详解java接口(interface)在不同JDK版本中的变化

    JDK1.7以及以前: 接口(interface)在JDK7及之前的版本对接口的要求: 接口定义: 使用 interface 关键字 . 接口中的 所有 成员变量 都默认是由 public static final 修饰的. 接口中的 所有方法 都默认是由 public abstract 修饰的.也可以使用 protected ,但不能用 private . 接口中的 所有方法 都没有方法体. 接口没有构造方法.因为构造方法用于创建对象. 实现接口的类 必须提供接口中所有方法的具体实现内容. 可

  • 关于JAVA_HOME路径修改之后JDK的版本依然不更改的解决办法

    今天重新配置Java的时候出现了一点问题,下面主要讲一下自己的解决方案: 问题描述: 今天想更改一下本机JDK的版本,发现更改之后使用 java -version命令,出现的JDK版本并没有变换. 查找原因: 系统目录里面可能有java.exe,导致优先调用了系统目录中的java.exe:刚安装的jdk自动增加了path内容,所增加的内容(指向的路径)下存在java.exe,且在path内容中该路径的顺序位于你自己配置java的路径前面(笔者的坑在这). 解决办法: 将%JAVA_HOME%/b

  • 浅谈JAVA版本号的问题 Java版本号与JDk版本

    初学Java时便一直疑惑Java版本号到底是如何命名的?时常在网上看到Java5.Java6.Java7.Java8 (到今天已经到了Java12了,2019.4.5) 这一类 "Java X" 的Java版本名称,同时又会看到诸如JDK1.5.JDK1.6这中 "JDK1.X" 的JDK叫法. 一直以来都在纠结Java以及JDK的规范版本名称到底是如何,直到最近在几本书上看到了相关的解释才有点明白, 现总结在这里: 首先1996年发布了最初版本Java1.0(此前

  • 一文彻底搞懂Java和JDK的版本命名问题

    Java是面向对象的编程语言,在我们开发Java应用的程序员的专业术语里,Java这个单词其实指的是Java开发工具,也就是JDK(Java Development Kit).所以我们常常在CSDN等各大程序员论坛讨论到安装Java8或者JDK8或者JDK1.8或J2SE8或J2SE1.8或J2SE8或J2SE1.8,其实这3个专业词汇的概念是一样的. 告诉庆哥,你对Java的版本号以及JDK的命名真正清楚嘛?比如: Java8 Java SE 8.0 JDK1.8 -- 知道这些是怎么回事嘛?

  • 一文彻底搞懂java多线程和线程池

    目录 什么是线程 一. Java实现线程的三种方式 1.1.继承Thread类 1.2.实现Runnable接口,并覆写run方法 二. Callable接口 2.1 Callable接口 2.2 Future接口 2.3 Future实现类是FutureTask. 三. Java线程池 3.1.背景 3.2.作用 3.3.应用范围 四. Java 线程池框架Executor 4.1.类图: 4.2 核心类ThreadPoolExecutor: 4.3 ThreadPoolExecutor逻辑结

  • 一文搞懂Java的SPI机制(推荐)

    目录 1 简介 缺点 源码 使用 适用场景 插件扩展 案例 1 简介 SPI,Service Provider Interface,一种服务发现机制. 有了SPI,即可实现服务接口与服务实现的解耦: 服务提供者(如 springboot starter)提供出 SPI 接口.身为服务提供者,在你无法形成绝对规范强制时,适度"放权" 比较明智,适当让客户端去自定义实现 客户端(普通的 springboot 项目)即可通过本地注册的形式,将实现类注册到服务端,轻松实现可插拔 缺点 不能按需

  • 一文搞懂Java中的序列化与反序列化

    目录 序列化和反序列化的概念 应用场景 序列化实现的方式 继承Serializable接口,普通序列化 继承Externalizable接口,强制自定义序列化 serialVersionUID的作用 静态变量不会被序列化 使用序列化实现深拷贝 常见序列化协议对比 小结 序列化和反序列化的概念 当我们在Java中创建对象的时候,对象会一直存在,直到程序终止时.但有时候可能存在一种"持久化"场景:我们需要让对象能够在程序不运行的情况下,仍能存在并保存其信息.当程序再次运行时 还可以通过该对

  • 一文搞懂Java并发AQS的共享锁模式

    目录 概述 自定义共享锁例子 核心原理机制 源码解析 成员变量 共享锁获取acquireShared(int) 共享释放releaseShared(int) 概述 这篇文章深入浅出理解Java并发AQS的独占锁模式讲解了AQS的独占锁实现原理,那么本篇文章在阐述AQS另外一个重要模式,共享锁模式,那什么是共享锁呢? 共享锁可以由多个线程同时获取, 比较典型的就是读锁,读操作并不会产生副作用,所以可以允许多个线程同时对数据进行读操作而不会有线程安全问题,jdk中的很多并发工具比如ReadWrite

  • 一文带你搞懂Java中Synchronized和Lock的原理与使用

    目录 1.Synchronized与Lock对比 2.Synchronized与Lock原理 2.1 Synchronized原理 2.2 Lock原理 3.Synchronized与Lock使用 Synchronized Lock 4.相关问题 1.Synchronized与Lock对比 实现方式:Synchronized是Java语言内置的关键字,而Lock是一个Java接口. 锁的获取和释放:Synchronized是隐式获取和释放锁,由Java虚拟机自动完成:而Lock需要显式地调用lo

  • 一文搞懂JAVA 修饰符

    Java语言提供了很多修饰符,主要分为以下两类: 访问修饰符 非访问修饰符 修饰符用来定义类.方法或者变量,通常放在语句的最前端.我们通过下面的例子来说明: public class ClassName { // ... } private boolean myFlag; static final double weeks = 9.5; protected static final int BOXWIDTH = 42; public static void main(String[] argum

  • 一文搞懂JAVA 枚举(enum)

    Java 枚举是一个特殊的类,一般表示一组常量,比如一年的 4 个季节,一个年的 12 个月份,一个星期的 7 天,方向有东南西北等. Java 枚举类使用 enum 关键字来定义,各个常量使用逗号 , 来分割. 例如定义一个颜色的枚举类. enum Color { RED, GREEN, BLUE; } 以上枚举类 Color 颜色常量有 RED, GREEN, BLUE,分别表示红色,绿色,蓝色. 使用实例: enum Color { RED, GREEN, BLUE; } public c

  • 一文搞懂Java中的反射机制

    前一段时间一直忙,所以没什么时间写博客,拖了这么久,也该更新更新了.最近看到各种知识付费的推出,感觉是好事,也是坏事,好事是对知识沉淀的认可与推动,坏事是感觉很多人忙于把自己的知识变现,相对的在沉淀上做的实际还不够,我对此暂时还没有什么想法,总觉得,慢慢来,会更快一点,自己掌握好节奏就好. 好了,言归正传. 反射机制是Java中的一个很强大的特性,可以在运行时获取类的信息,比如说类的父类,接口,全部方法名及参数,全部常量和变量,可以说类在反射面前已经衣不遮体了(咳咳,这是正规车).先举一个小栗子

  • 一文搞懂Java MD5算法的原理及实现

    目录 MD5加密简介 MD5加密原理 MD5加密常用方法 MD5加密简介 哈希算法又称散列算法,是将任何数据转换成固定长度的算法的统称. 从本质上讲,MD5也是一种哈希算法,其输出是生成128位的输出结果. 如果输入两个不同的明文,就会输出两个不同的输出值,并且根据输出值,不能得到原始的明文,这个过程是不可逆的. MD5加密原理 MD5算法对512位报文的输入信息进行处理,每个报文被分成16个32位报文. 经过一系列处理后,算法的输出由4个32位的数据包组成,这些数据包级联生成一个128位的哈希

随机推荐