首页 > 技术文章 > 认识Java

roud 2021-08-18 18:59 原文

1.历史

Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java开发平台。Java是一种面向对
象的编程语言,它的前身是詹姆斯·高斯林(James Gosling,人称java之父)等人于1990年代初开
发的一种编程语言,最初被命名为Oak。

Java历史中的一些时间节点:

  1. 1991年4月,由James Gosling博士领导的绿色计划(Green Project)开始启动,此计划的目的是开
    发一种能够在各种消费性电子产品(如机顶盒、冰箱、收音机等)上运行的程序架构。这个计划
    的产品就是Java语言的前身:Oak(橡树)。Oak当时在消费品市场上并不算成功,但随着1995年
    互联网潮流的兴起,Oak迅速找到了最适合自己发展的市场定位并蜕变成为Java语言。
  2. 1995年5月23日,Oak语言改名为Java,并且在SunWorld大会上正式发布Java 1.0版本。Java语言第
    一次提出了 “Write Once,Run Anywhere” 的口号。
  3. 1996年1月23日,JDK 1.0发布,Java语言有了 第一个正式版本 的运行环境。JDK 1.0提供了一个
    纯解释执行的Java虚拟机实现(Sun Classic VM)。JDK 1.0版本的代表技术包括:Java虚拟机、
    Applet、AWT等。
  4. 1996年4月,10个最主要的操作系统供应商申明将在其产品中嵌入Java技术。同年9月,已有大约
    8.3万个网页应用了Java技术来制作。在1996年5月底,Sun公司于美国旧金山举行了首届JavaOne
    大会,从此JavaOne成为全世界数百万Java语言开发者每年一度的技术盛会。
  5. 1997年2月19日,Sun公司发布了JDK 1.1,Java技术的一些最基础的支撑点(如JDBC等)都是在
    JDK 1.1版本中发布的,JDK 1.1版的技术代表有:JAR文件格式、JDBC、JavaBeans、RMI。Java语
    法也有了一定的发展,如内部类(Inner Class)和反射(Reflection)都是在这个时候出现的。
  6. 1999年4月8日,JDK 1.1在此期间一共发布了1.1.0~1.1.8九个版本。从1.1.4之后,每个JDK版本都
    有一个自己的名字(工程代号),分别为:JDK 1.1.4 - Sparkler(宝石)、JDK 1.1.5 - Pumpkin(南
    瓜)、JDK 1.1.6 - Abigail(阿比盖尔,女子名)、JDK 1.1.7 - Brutus(布鲁图,古罗马政治家和将
    军)和JDK 1.1.8 – Chelsea(切尔西,城市名)。
  7. 1998年12月4日,JDK迎来了一个里程碑式的版本JDK 1.2,工程代号为Playground(竞技场),
    Sun在这个版本中把Java技术体 系拆分为3个方向 ,分别是面向桌面应用开发的J2SE(Java 2
    Platform, Standard Edition)、面向企业级开发的J2EE(Java 2 Platform, Enterprise Edition)和
    面向手机等移动终端开发的J2ME(Java 2 Platform, Micro Edition)。
  8. 1999年3月和7月,分别有JDK 1.2.1和JDK 1.2.2两个小版本发布。
  9. 1999年4月27日, HotSpot 虚拟机发布,HotSpot最初由一家名为“Longview Technologies”的小公
    司开发,因为HotSpot的优异表现,这家公司在1997年被Sun公司收购了。HotSpot虚拟机发布时
    是作为JDK 1.2的附加程序提供的,后来它成为了JDK 1.3及之后所有版本的Sun JDK的默认虚拟
    机。
  10. 2000年5月8日,工程代号为Kestrel(美洲红隼)的JDK 1.3发布,JDK 1.3相对于JDK 1.2的改进主要
    表现在一些类库上(如数学运算和新的Timer API等)。JDK 1.3有1个修正版本JDK 1.3.1,工程代
    号为Ladybird(瓢虫),于2001年5月17日发布。自从JDK 1.3开始,Sun维持了一个习惯:大约每
    隔两年发布一个JDK的主版本,以动物命名,期间发布的各个修正版本则以昆虫作为工程名称。
  11. 2002年2月13日,JDK 1.4发布,工程代号为Merlin(灰背隼)。JDK 1.4是Java真正走向成熟的一个
    版本,Compaq、Fujitsu、SAS、Symbian、IBM等著名公司都有参与甚至实现自己独立的JDK 1.4。
  12. 2002年9月16日发布的工程代号为Grasshopper(蚱蜢)的JDK 1.4.1
  13. 2003年6月26日发布的工程代号为Mantis(螳螂)的JDK 1.4.2。
  14. 2004年9月30日, JDK 1.5 发布,工程代号Tiger(老虎)。从JDK 1.2以来,Java在语法层面上的
    变换一直很小,而JDK 1.5在Java语法易用性上做出了非常大的改进。例如,自动装箱、泛型、动
    态注解、枚举、可变长参数、遍历循环(foreach循环)等语法特性都是在JDK 1.5中加入的。在虚
    拟机和API层面上,这个版本改进了Java的内存模型(Java Memory Model,JMM)、提供了
    java.util.concurrent并发包等。
  15. 2006年12月11日,JDK 1.6发布,工程代号Mustang(野马)。在这个版本中,Sun终结了从JDK 1.2
    开始已经有8年历史的J2EE、J2SE、J2ME的命名方式,启用 Java SE 6、Java EE 6、Java ME 6 的
    命名方式。
  16. 2006年11月13日,在JavaOne大会上,Sun公司宣布最终会将 Java开源 ,并在随后的一年多时间
    内,陆续将JDK的各个部分在GPL v2(GNU General Public License v2)协议下公开了源码,并建立
    了OpenJDK组织对这些源码进行独立管理。除了极少量的产权代码(Encumbered Code,这部分
    代码大多是Sun本身也无权限进行开源处理的)外,OpenJDK几乎包括了Sun JDK的全部代码,
    OpenJDK的质量主管曾经表示,在JDK 1.7中,Sun JDK和OpenJDK除了代码文件头的版权注释之
    外,代码基本上完全一样,所以OpenJDK 7与Sun JDK 1.7本质上就是同一套代码库开发的产品。
  17. JDK 1.6发布以后,由于代码复杂性的增加、JDK开源、开发JavaFX、经济危机及Sun收购案等原
    因,Sun在JDK发展以外的事情上耗费了很多资源,JDK的更新没有再维持两年发布一个主版本的
    发展速度。JDK 1.6到目前为止一共发布了37个Update版本,最新的版本为Java SE 6 Update 37,
    于2012年10月16日发布。
  18. 2009年2月19日,工程代号为Dolphin(海豚)的JDK 1.7完成了其第一个里程碑版本。根据JDK 1.7
    的功能规划,一共设置了10个里程碑。最后一个里程碑版本原计划于2010年9月9日结束,但由于
    各种原因,JDK 1.7最终无法按计划完成。
  19. 2009年4月20日,Oracle公司宣布正式以 74亿美元 的价格收购Sun公司,Java商标从此正式归
    Oracle所有(Java语言本身并不属于哪间公司所有,它由JCP组织进行管理,尽管JCP主要是由Sun
    公司或者说Oracle公司所领导的)。由于此前Oracle公司已经收购了另外一家大型的中间件企业
    BEA公司,在完成对Sun公司的收购之后,Oracle公司分别从BEA和Sun中取得了目前三大商业虚拟
    机的其中两个:JRockit和HotSpot,Oracle公司宣布在未来1~2年的时间内,将把这两个优秀的虚
    拟机互相取长补短,最终合二为一。可以预见在不久的将来,Java虚拟机技术将会产生相当巨大
    的变化。
  20. 2011年7月28日,Oracle公司发布Java SE 1.7
  21. 2014年3月18日,Oracle公司发布 Java SE 1.8
  22. 2017年9月21日,Oracle公司发布Java9
  23. 2018年3月20日,Oracle公司发布Java10
  24. 2018年9月25日,Oracle公司发布Java11
  25. 2019年3月19日,Oracle公司发布Java12
  26. 2019年9月17日,Oracle公司发布Java13
  27. 2020年3月17日,Oracle公司发布Java14

目前开发中使用的JDK,仍是以JDK8为主要的选择版本。

2.平台

1998年12月4日,Sun公司在发布的JDK1.2版本中,将Java技术体系拆分为3个方向(平台):

  1. J2SE (Java 2 Platform, Standard Edition),面向桌面应用开发
  2. J2EE (Java 2 Platform, Enterprise Edition),面向企业级开发
  3. J2ME (Java 2 Platform, Micro Edition),面向手机等移动终端开发

2006年12月11日,Sun公司在发布的JDK 1.6版本中,启用Java SE、Java EE、Java ME的命名方式
2017年9月,oracle宣布将JavaEE所有权转交给Eclipse基金会
2018年3月,Eclipse基金会宣布将JavaEE更名为JakartaEE ,Jakarta(雅加达)是一座城市的名字
2019年9月,Jakarta EE 8 完全开源
2020年6月,Jakarta EE 9 发布

3.相关名词

SDK (software development kit),软件开发包,主要包含函数库或者工具等
JDK (java development kit),java程序开发工具包,面向java程序的开发者
JRE (java runtime enviroment),java程序运行环境,面向java程序的使用者
API (application program interface),应用程序编程接口
API Documentation,API说明文档,描述API中的类、方法等使用的方式

4.JDK环境配置说明

JAVA_HOME:指定JDK的安装目录。例如,JAVA_HOME=C:\Program Files\Java\jdk1.8.0_74。

PATH:指定命令的搜索路径,把JDK中java命令所在目录配置到原有的PATH中,可以配置到PATH的最前面。例如,PATH=%JAVA_HOME%\bin;...;...;....; 这里也可以不引用JAVA_HOME的变量值。

CLASSPATH:为类加载器指明路径。指定将来要运行加载的class文件所在位置,这个路径将来可能随时变换,可以先配置为当前路径,将来使用的时候再具体配置即可。例如,CLASSPATH=.

5.java的特点

我们平时所说的“java”,其实是一个综合的描述,它包含了一系列的很多东西。

它是一门编程语言
包含基本的语法、特性、思想等
它是开发环境
开发java程序时,需要一些的java开发工具
它是应用环境
开发好的java程序要运行,需要它提供一些的运行环境
它是部署环境
将来在其他平台下开发出的java程序,都需要它提供一个最基础的部署环境

也就是说,只有是进行和java相关的一系列相关活动,就必须要先安装一个JDK,以保证这些最基
础的环境、工具、语言支持等。

java语言的优点:

更纯粹的面向对象编程,加速开发的过程。
一次编写/编译,到处运行,代码可以跨平台
多线程的支持
代码中没有指针管理、内存管理,使得编程人员可以更加专注于系统的业务功能的开发
字节码的验证机制,保证代码的安全性
开源及强大的生态环境,社区活跃,第三方类库选择丰富

6.JVM

JVM是Java Virtual Machine(Java虚拟机)的缩写,它是一个虚构出来的计算机规范结构,是通过
在实际的计算机上仿真模拟各种计算机功能来实现的

JVM是java中最核心的一个东西,它在计算机的内存中,虚拟并提供了java代码可以在其中运行的基础环
境。
在JDK7中对JVM规范所给出的内存管理结构如下:
image
我们将来编写好的java代码,编译成了class文件,这些class文件就需要加载到JVM中,再进行运行

7.垃圾回收器

在java语言中,编程人员不需要在代码中控制内存的开辟和释放。
java代码中,开辟要使用的内存空间,使用new关键字即可完成。
使用完之后,对内存的释放,在JVM中,由垃圾回收器(Garbage Collection,GC)来完成。
不同类型的GC,在JVM中,会根据不同的算法,对不同的内存区域内标记为垃圾的空间,进行回收释
放。在这个过程中,是不需要编程人员干预的,它自己会主动的完成。
在代码中,我们也可以调用JavaSE-API提供的方法,通知GC现在去进行垃圾回收的工作:

java.lang.System.gc();
java.lang.Runtime.gc();

注意,虽然可以主动通知,但是最后GC并不一定会真的的立刻执行,因为这个垃圾回收的过程什么时候执行,最终还是要根据GC的具体算法和当前内存的使用情况来确定的

8.字节码验证

编写好的java代码,编译成class文件(字节码)后,再被JVM加载到内存中的时候,是需要做字节
码验证的

编写并编译好的java代码,加载到JVM内存中:
image

一个class文件被加载到JVM内存之后,首先要经过字节码验证,主要包含:
检查当前class文件的版本和JVM的版本是否兼容
检查当前代码是会破坏系统的完整性
检查当前代码是否有栈溢出的情况
检查当前代码中的参数类型是否正确
检查当前代码中的类型转换操作是否正确

9.常用的命令

javac
编译命令
java
运行命令
javadoc
生成API文档命令
javap
反解析命令,可以解析出class字节码文件的内容
jar
打包命令

10.常用的包

在程序中,要区分一些东西,一般会采用【命名空间】的设计方式
在java中,package其实就是类的命名空间,用来唯一标识这个类的,同时也把类似功能的类组织
到一个包中

JavaSE-API中常用的包有:
java.lang
最常用的一个包,里面的类可以在我们的程序中直接使用,不需要import导入
java.awt、javax.swing、java.awt.event
这三个包属于同一类型的,它们包下面的类都是用来做图形化界面的(GUI)
注意:javax开头的包,是sun公司后面又扩展进来的包,刚开始是没有的
java.io
这个包下的类主要用于输入输出流的操作。也就是读数据/写数据
java.net
这个包下的类主要用于网络编程。例如把计算机A和计算机B之间建立网络连接,然后进行信息传
输。
java.util
这个包下的类都是一些常用工具类,可以帮我们在代码中完成一些辅助的功能,例如表示日期、使
用集合存储数据、使用工具类操作数组等

推荐阅读