1.历史
Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java开发平台。Java是一种面向对
象的编程语言,它的前身是詹姆斯·高斯林(James Gosling,人称java之父)等人于1990年代初开
发的一种编程语言,最初被命名为Oak。
Java历史中的一些时间节点:
- 1991年4月,由James Gosling博士领导的绿色计划(Green Project)开始启动,此计划的目的是开
发一种能够在各种消费性电子产品(如机顶盒、冰箱、收音机等)上运行的程序架构。这个计划
的产品就是Java语言的前身:Oak(橡树)。Oak当时在消费品市场上并不算成功,但随着1995年
互联网潮流的兴起,Oak迅速找到了最适合自己发展的市场定位并蜕变成为Java语言。 - 1995年5月23日,Oak语言改名为Java,并且在SunWorld大会上正式发布Java 1.0版本。Java语言第
一次提出了 “Write Once,Run Anywhere” 的口号。 - 1996年1月23日,JDK 1.0发布,Java语言有了 第一个正式版本 的运行环境。JDK 1.0提供了一个
纯解释执行的Java虚拟机实现(Sun Classic VM)。JDK 1.0版本的代表技术包括:Java虚拟机、
Applet、AWT等。 - 1996年4月,10个最主要的操作系统供应商申明将在其产品中嵌入Java技术。同年9月,已有大约
8.3万个网页应用了Java技术来制作。在1996年5月底,Sun公司于美国旧金山举行了首届JavaOne
大会,从此JavaOne成为全世界数百万Java语言开发者每年一度的技术盛会。 - 1997年2月19日,Sun公司发布了JDK 1.1,Java技术的一些最基础的支撑点(如JDBC等)都是在
JDK 1.1版本中发布的,JDK 1.1版的技术代表有:JAR文件格式、JDBC、JavaBeans、RMI。Java语
法也有了一定的发展,如内部类(Inner Class)和反射(Reflection)都是在这个时候出现的。 - 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(切尔西,城市名)。 - 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)。 - 1999年3月和7月,分别有JDK 1.2.1和JDK 1.2.2两个小版本发布。
- 1999年4月27日, HotSpot 虚拟机发布,HotSpot最初由一家名为“Longview Technologies”的小公
司开发,因为HotSpot的优异表现,这家公司在1997年被Sun公司收购了。HotSpot虚拟机发布时
是作为JDK 1.2的附加程序提供的,后来它成为了JDK 1.3及之后所有版本的Sun JDK的默认虚拟
机。 - 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的主版本,以动物命名,期间发布的各个修正版本则以昆虫作为工程名称。 - 2002年2月13日,JDK 1.4发布,工程代号为Merlin(灰背隼)。JDK 1.4是Java真正走向成熟的一个
版本,Compaq、Fujitsu、SAS、Symbian、IBM等著名公司都有参与甚至实现自己独立的JDK 1.4。 - 2002年9月16日发布的工程代号为Grasshopper(蚱蜢)的JDK 1.4.1
- 2003年6月26日发布的工程代号为Mantis(螳螂)的JDK 1.4.2。
- 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并发包等。 - 2006年12月11日,JDK 1.6发布,工程代号Mustang(野马)。在这个版本中,Sun终结了从JDK 1.2
开始已经有8年历史的J2EE、J2SE、J2ME的命名方式,启用 Java SE 6、Java EE 6、Java ME 6 的
命名方式。 - 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本质上就是同一套代码库开发的产品。 - JDK 1.6发布以后,由于代码复杂性的增加、JDK开源、开发JavaFX、经济危机及Sun收购案等原
因,Sun在JDK发展以外的事情上耗费了很多资源,JDK的更新没有再维持两年发布一个主版本的
发展速度。JDK 1.6到目前为止一共发布了37个Update版本,最新的版本为Java SE 6 Update 37,
于2012年10月16日发布。 - 2009年2月19日,工程代号为Dolphin(海豚)的JDK 1.7完成了其第一个里程碑版本。根据JDK 1.7
的功能规划,一共设置了10个里程碑。最后一个里程碑版本原计划于2010年9月9日结束,但由于
各种原因,JDK 1.7最终无法按计划完成。 - 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虚拟机技术将会产生相当巨大
的变化。 - 2011年7月28日,Oracle公司发布Java SE 1.7
- 2014年3月18日,Oracle公司发布 Java SE 1.8
- 2017年9月21日,Oracle公司发布Java9
- 2018年3月20日,Oracle公司发布Java10
- 2018年9月25日,Oracle公司发布Java11
- 2019年3月19日,Oracle公司发布Java12
- 2019年9月17日,Oracle公司发布Java13
- 2020年3月17日,Oracle公司发布Java14
目前开发中使用的JDK,仍是以JDK8为主要的选择版本。
2.平台
1998年12月4日,Sun公司在发布的JDK1.2版本中,将Java技术体系拆分为3个方向(平台):
- J2SE (Java 2 Platform, Standard Edition),面向桌面应用开发
- J2EE (Java 2 Platform, Enterprise Edition),面向企业级开发
- 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规范所给出的内存管理结构如下:
我们将来编写好的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内存中:
一个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
这个包下的类都是一些常用工具类,可以帮我们在代码中完成一些辅助的功能,例如表示日期、使
用集合存储数据、使用工具类操作数组等