前言
世界上没有完美的编程语言,因为编程语言本身就是一个不断发展进步的结果。可能会有更优秀的语言诞生,热度超过java,但是选择java作为人生的第一门编程语言,我觉得是没有问题的。打好基础才是最重要的,理解好编程语言的原理和思想,正所谓一法通,万法通,掌握好学习方法和习惯,对学习其它语言也会大有帮助。接下来我们来了解下java语言的起源及发展。
Java的诞生
C语言
在了解java的诞生前,我们先了解下C语言的历史。C语言诞生于1972年,它具有运行快,效率高的特点,程序员们利用C语言开发了许多系统级软件,如操作系统、数据库、网络系统等。但同时C语言也存在两个让程序员头疼的特性:指针和内存管理。指针虽然强大,但没有越界检查,新手程序员很容易犯错。至于内存需要自己管理及释放,这些编译时无法发现的问题,在运行时才暴露,导致我们可能需要花费大量的时间去调试处理。
到了1982年,推出了一门新的语言C++,它添加了面向对象的功能,兼容了C语言,有静态类型检查,性能也很好。但是复杂的特性,导致程序员很难完全掌握这门语言。
所以,有需求开发一门新的编程语言,它的语法像C,这样大家容易接受,但同时撇弃C语言令人头疼的指针,不用再考虑内存管理,具备真正的可移植性,面向对象,类型安全,附带一套高质量的类库,随版本发行,最终,在这个大背景下,java诞生了。
Java发展史
- 1991年4月,Java之父James Gosling带领绿色计划(Green Project)项目启动,定位于消费电子产品(机顶盒、冰箱、收音机)运行架构的Oak语言诞生,这也是Java的前身,但是市场反响一般。
- 1995年5月23日,随着互联网浪潮在1995年兴起,Oak迅速蜕,Java语言诞生,在SunWorld大会上发布Java1.0,第一次提出Write Once,Run Anywhere的口号。
- 1996年1月23日,JDK1.0发布,工程代号Oak(橡树),纯解释型的Java虚拟机(Sun Classic VM)、Applet、AWT等诞生。
- 1997年2月19日,Sun公司发布了JDK1.1,引入的新特性包括:引入JDBC(Java Database Connectivity);支持内部类;引入Java Bean;引入RMI(Remote Method Invocation);引入反射(仅用于内省)。
- 1998年12月4日,JDK1.2发布,这是一个里程碑式的重要版本,工程代号为Playground(竞技场)。引入的新特性包括:引入集合(Collection)框架;对字符串常量做内存映射;引入JIT(Just In Time)编译器;引入对打包的Java文件进行数字签名;引入控制授权访问系统资源的策略工具;引入JFC(Java Foundation Classes),包括Swing 1.0、拖放和Java 2D类库;引入Java 插件;在JDBC中引入可滚动结果集、BLOB、CLOB、批量更新和用户自定义类型;在Applet中添加声音支持。也是在这个版本中Sun开始拆分对应的Java产品线,Sun在这个版本中把Java技术体系拆分为三个方向:
- 面向桌面应用开发的J2SE(Java 2 Platform,Standard Edition)
- 面向企业级开发的J2EE(Java 2 Platform,Enterprise Edition)
- 面向手机等移动终端开发的J2ME(Java 2 Platform,Micro Edition)
- 1999年4月27日,HotSpot虚拟机诞生,HotSpot最初由Longview Techno-logies公司研发,后来在1997年被Sun公司收购,后来它成为JDK 1.3及之后所有JDK版本的默认Java虚拟机。
- 2000年5月8日,工程代号为Kestrel(美洲红隼)的JDK 1.3发布。引入的新特性包括:引入Java Sound API;jar文件索引;对Java的各个方面都做了大量优化和增强。
- 2002年2月13日,JDK 1.4发布,工程代号为Merlin(灰背隼)。JDK 1.4是标志着Java真正走向成熟的一个版本,java逐渐成为服务器应用端的首选平台,同时在此版本上出现了大量的开源框架。引入的新特性包括:XML处理;Java打印服务;引入Logging API;引入Java Web Start;引入JDBC 3.0 API;引入断言;引入Preferences API;引入链式异常处理;支持IPv6;支持正则表达式;引入Image I/O slot machine API。
- 2004年9月30日,JDK 5发布,工程代号为Tiger(老虎),这是java语言的里程碑,为了体现此版本的重要性,Sun公司从这个版本开始放弃JDK 1.x的命名方式,将产品版本号修改成了JDK x。引入的新特性包括:引入泛型;增强循环,可以使用迭代方式;自动装箱与自动拆箱;类型安全的枚举;可变参数;静态引入;元数据(注解);引入Instrumentation。
- 2006年11月13日,JavaOne大会上,Sun公司宣布计划要把Java开源,随后在一年多的时间内,陆续的将JDK各部分在GPL V2协议下公开源码,随后并建立了OpenJDK组织对这些源码进行独立管理,除了极少部分的产权代码,OpenJDK几乎拥有了SunJDK 7中的全部代码。
- 2006年12月11日,JDK6发布,工程代号为Mustang(野马)。在这个版本中,Sun公司终结了从JDK 1.2开始已经有八年历史的J2EE、J2SE、J2ME的产品线命名方式,启用Java EE 6、Java SE 6、Java ME 6的新命名来代替。引入的新特性包括:支持脚本语言;引入JDBC 4.0 API;引入Java Compiler API;可插拔注解;增加对Native PKI(Public Key Infrastructure)、Java GSS(Generic Security Service)、Kerberos和LDAP(Lightweight Directory Access Protocol)的支持;继承Web Services;做了很多优化。
- 2009年4月20日,Oracle宣布正式以74亿美元的价格收SUN公司,一代巨头由此没落,Java商标正式划归Oracle所有,Java语言本身并不属于哪间公司所有,它由JCP组织进行管理。此外Oracle还收购了BEA公司,JavaEE服务器Weblogic就是该公司的产品。
- 2011年7月28日,JDK7发布,代号是Dolphin(海豚),引入的新特性包括:switch语句块中允许以字符串作为分支条件;在创建泛型对象时应用类型推断;在一个语句块中捕获多种异常;支持动态语言;支持try-with-resources;引入Java NIO.2开发包;数值类型可以用2进制字符串表示,并且可以在字符串表示中添加下划线;钻石型语法;null值的自动处理。
- 2014年3月18日,Oracle公司发布JDK 8,代号是Spider(蜘蛛),从此使用JEP(JDK Enhancement Proposals)来定义和管理纳入新版JDK发布范围的功能特性,这个版本也是现在企业中使用范围最广的一个版本。引入的新特性包括:支持 lambda支持;增强日期与时间API的功能;对垃圾回收的性能也进行了改进;并且移除了permgen区。Lambdas表达式与Functional接口接口的默认与静态方法方法引用重复注解更好的类型推测机制扩展注解的支持。
- 2017年9月21日,Oracle公司发表 JDK 9,这个版本算是比较大的调整,加入了很早之前就规划的模块化功能。并且对整个 JDK 基于模块进行了重新编写。Java 9 提供了轻量级 JSON API; 使用 G1 作为默认的垃圾收集器,替代了之前默认使用的 Paralel GC; 引入了 jShell 这个交互性工具。并且全面支持 HTTP 2.0。
- 2018年3月20日,Oracle公司发布JDK 10,主要对内部进行重构,统一源仓库,统一垃圾收集器接口,统一即时编译器接口(引入Graal几时编译器,这里也埋下一个伏笔),这些改进对于用户并不明显,但对后期的版本打下了良好的基础。
- 2018年9月25日,JDK 11发布,这也是一个LTS(long-term support)版本,包含17个JEP,同时被引入的还有ZGC这样革命性的垃圾收集器,好比G1的诞生,比G1又更具神秘感。同时Oracle也调整了JDK的授权许可证,把以前的商业许可证授权给OpenJDK,官方宣布同时发布两个JDK,一个是Oracle OpenJDK,一个是OracleJDK,共享大部分源码近乎一致,个人均可免费使用,OpenJDK有半年的更新支持,OracleJDK商用必须付费,且支持三年的更新。因此Java收费纯属谣言,商业用户如果想使用最新的版本支持就必须付费。
- 2019年3月20日,JDK 12发布,RedHat接手了OpenJDK 8和OpenJDk 11的管理和维护权。在JDK 12中包含了8个JEP,主要有Switch表达式和JMH测试套件,最引人注目的就是Shenandoah垃圾收集器,作为首个在JDK 7以后非Oracle开发的垃圾收集器,其目标与ZGC一致,这种竞争关系,立马得到了Oracle的抵制,在OracleJDK中剔除代码,因此Oracle JDK和OpenJDK的隔离性又如历史在JDK9中开始重演,至于后续Java的发展,以及迎接的挑战也是任重而道远,这取决于Oracle的产品线的定制和JCP的决策了。
- 2019年在9月17日,JDK 13发布,这个版本主要通过改善Java SE平台和JDK的性能,稳定性和安全性来提高开发人员的生产力。
- 2020年3月17日,JDK 14发布,这个版本主要是对JDK历史版本的一些增强,也引入了一些新增的功能。
- 2021年3月16日,JDK 16发布,这部分依旧是一些功能的优化升级。
- 2021年9月14日,JDK17发布,这也是在JDK 11之后的下一个LTS版本,JDK 17也是Java六个月发布节奏下的最新的长期支持(LTS)发布,主打安全、性能、稳定为特性,并且官方计划支持到2029年9月。
Java的特性
Java 语言的风格很像 C 语言和 C++ 语言,是一种纯粹的面向对象语言,它继承了 C++ 语言面向对象的技术核心,但是拋弃了 C++ 的一些缺点,比如说容易引起错误的指针以及多继承等,同时也增加了垃圾回收机制,释放掉不被使用的内存空间,解决了管理内存空间的烦恼。
1. 面向对象
Java 是一种面向对象的语言,它对对象中的类、对象、继承、封装、多态、接口、包等均有很好的支持。为了简单起见,Java 只支持类之间的单继承,但是可以使用接口来实现多继承。使用 Java 语言开发程序,需要采用面向对象的思想设计程序和编写代码。
2. 平台无关性
平台无关性的具体表现在于,Java 是“一次编写,到处运行(Write Once,Run any Where)”的语言,因此采用 Java 语言编写的程序具有很好的可移植性,而保证这一点的正是 Java 的虚拟机机制。在引入虚拟机之后,Java 语言在不同的平台上运行不需要重新编译。
Java 语言使用 Java 虚拟机机制屏蔽了具体平台的相关信息,使得 Java 语言编译的程序只需生成虚拟机上的目标代码,就可以在多种平台上不加修改地运行。
3. 简单性
Java 语言的语法与 C 语言和 C++ 语言很相近,使得很多程序员学起来很容易。对 Java 来说,它舍弃了很多 C++ 中难以理解的特性,如操作符的重载和多继承等,而且 Java 语言不使用指针,加入了垃圾回收机制,解决了程序员需要管理内存的问题,使编程变得更加简单。
4. 解释执行
Java 程序在 Java 平台运行时会被编译成字节码文件,然后可以在有 Java 环境的操作系统上运行。在运行文件时,Java 的解释器对这些字节码进行解释执行,执行过程中需要加入的类在连接阶段被载入到运行环境中。
5. 多线程
Java 语言是多线程的,这也是 Java 语言的一大特性,它必须由 Thread 类和它的子类来创建。Java 支持多个线程同时执行,并提供多线程之间的同步机制。任何一个线程都有自己的 run() 方法,要执行的方法就写在 run() 方法体内。
6. 分布式
Java 语言支持 Internet 应用的开发,在 Java 的基本应用编程接口中就有一个网络应用编程接口,它提供了网络应用编程的类库,包括 URL、URLConnection、Socket 等。Java 的 RIM 机制也是开发分布式应用的重要手段。
7. 健壮性
Java 的强类型机制、异常处理、垃圾回收机制等都是 Java 健壮性的重要保证。对指针的丢弃是 Java 的一大进步。另外,Java 的异常机制也是健壮性的一大体现。
8. 高性能
Java 的高性能主要是相对其他高级脚本语言来说的,随着 JIT(Just in Time)的发展,Java 的运行速度也越来越高。
9. 安全性
Java 通常被用在网络环境中,为此,Java 提供了一个安全机制以防止恶意代码的攻击。除了 Java 语言具有许多的安全特性以外,Java 还对通过网络下载的类增加一个安全防范机制,分配不同的名字空间以防替代本地的同名类,并包含安全管理机制。
Java 语言的众多特性使其在众多的编程语言中占有较大的市场份额,Java 语言对对象的支持和强大的 API 使得编程工作变得更加容易和快捷,大大降低了程序的开发成本。Java 的“一次编写,到处执行”正是它吸引众多商家和编程人员的一大优势。
Java三大版本
JAVA SE
它是JAVA的标准版,是整个JAVA的基础和核心,也是 JAVAEE和JAVAME技术的基础,主要用于开发桌面应用程序。学会后可以做一些简单的桌面应用 ,如:扫雷,连连看等。
JAVA ME
它是JAVA的微缩版,主要应用于嵌入式开发,比如手机程序的开发。目前来说就业范围 不是很广,在一些城市可能相对的不好找工作。
JAVA EE
也叫JAVA的企业版,它提供了企业级应用开发的完整解决方案,比如开发网站,还有企业的一些应用系统,是JAVA技术应用最广泛的领域。主要还是偏向于WEB的开发,而JAVA EE的基础就是JAVA SE。
JDK 和 JRE
JDK
Java 2 SDK (Development Kit)包含:JRE的超集,包含编译器和调试器等用于程序开发的文件。
JRE
Java Runtime Environment (JRE) 包含:Java虚拟机、库函数、运行Java应用程序和Applet所必须文件。
Java运行环境的三项主要功能:
- 加载代码:由class loader 完成
- 校验代码:由bytecode verififier 完成
- 执行代码:由 runtime interpreter完成
区别和联系
sdk(也就是jdk)是jre的超集,是在jre的基础上增加了编译器及其他一些开发工具。
jre就是java运行时环境,包括了jvm和其它一些java核心api,任何一台电脑,只有安装了jre才可以运行 java程序。
如果只是要运行JAVA程序,只需要JRE就可以。 JRE通常非常小,也包含了JVM.
如果要开发JAVA程序,就需要安装JDK。
具体关系可以参考下图:
初识JVM
JVM就是我们常说的java虚拟机,它是整个java实现跨平台的最核心的部分,所有的java程序会首先被编译为.class的类文件,这种类文件可以在虚拟机上执行,也就是说class并不直接与机器的操作系统相对应,而是经过虚拟机间接与操作系统交互,由虚拟机将程序解释给本地系统执行。
可以理解为是一个虚拟出来的计算机,具备着计算机的基本运算方式,它主要负责将java程序生成的字节码文件解释成具体系统平台上的机器指令。让具体平台如window运行这些Java程序。
- JVM:将字节码文件转成具体系统平台的机器指令
- JRE:JVM+Java语言的核心类库
- JDK:JRE+Java的开发工具
JAVA的跨平台实现的核心是不同平台使用不同的虚拟机,不同的操作系统有不同的虚拟机。Java 虚拟机机制屏蔽了底层运行平台的差别,实现了“一次编译,随处运行”。
这里就不过多介绍了,有兴趣可以学习下《深入理解Java虚拟机》,相信你会对JVM有更深刻的认识。