一、Java 发展史
Java 最初由 Sun 公司的'Green'项目组开发,用于智能家电设备,最初名为 Oak。因商标问题,1995 年更名为'Java'(灵感源于印尼爪哇岛的咖啡)。
| 发行版本 | 发行时间 | 发行的各版本及其特征 |
|---|---|---|
| Java | 1995 年 | Java 语言诞生 |
| Java 1.0 | 1996 年 | 首个正式版本,包含基础类库和 Applet 支持 |
| Java 1.1 | 1997 年 | 引入内部类(Inner Class)、Java Beans、JDBC(数据库连接)和反射 API |
| Java 1.2 | 1998 年 | JDK 1.2 发布,更名为 Java 2,分为三个平台:J2SE(标准版)、J2EE(企业版)、J2ME(微型版) |
| Java 1.3 | 2000 年 | 引入 HotSpot JVM、JNDI(Java 命名与目录接口) |
| Java 1.4 | 2002 年 | 新增正则表达式、断言(Assert)、NIO(非阻塞 I/O)和日志 API |
| Java 5.0 | 2004 年 | 引入泛型、注解、枚举等革命性特性,为强调版本重要性,Sun 将内部版本号 1.5 公开命名为 5.0,此后版本号逐渐简化 |
| Java 6.0 | 2006 年 | Sun 将产品线更名为 Java SE/EE/ME,终结'J2'前缀,并宣布开源(OpenJDK) |
| 2009 年 | Oracle 以 74 亿美元收购财务困境的 Sun 公司,Java 正式归属 Oracle | |
| Java 7.0 | 2011 年 | Oracle 首个大版本,支持菱形语法、多异常捕获,但因收购过渡期特性较少 |
| Java 8.0 | 2014 年 | 继 JDK 5 后最大更新,引入 Lambda 表达式、Stream API、新日期时间库。LTS(长期支持)版本 |
| Java 9.0 | 2017 年 | 发布周期改为每半年发布一次版本,每三年推出 LTS(长期支持)版本 |
| Java 10.0 | 2018 年 | 废弃'1.x'格式,直接使用主版本号(如 JDK 10 而非 JDK 1.10)Java EE 移交 Eclipse 基金会,重命名为 Jakarta EE(如包名从 javax.改为 jakarta.) |
| Java 11.0 | 2018 年 | 新增 HTTP 客户端 API、局部变量类型推断(var)并移除部分过时功能。LTS(长期支持)版本 |
| … | … | |
| Java21.0 | 2023 年 | 被视为继 Java 8 后的新一代主流版本,生态支持(如框架适配率)快速提升。LTS(长期支持)版本 |
二、Java 技术体系平台
1、JavaSE
- JavaSE 的全称是 Java Platform Standard Edition(Java 平台标准版)
- 面向桌面级应用(如 Windows 下的应用程序),提供完整的 Java 核心 API,是其他平台(JavaEE、JavaME)的基础
- JavaSE 和 JDK 的关系
- JavaSE(规范):定义接口、抽象类、具体类以及 JVM 的行为和约束(定义语言和 API 应该是什么样)
- 例:JavaSE 规范要求必须有一个 ArrayList 类,它实现 List 接口,支持动态扩容
- JDK(实现):提供这些接口和类的具体代码实现(按照规则实现并提供开发工具和运行环境)
- 例 1:OracleJDK 的 ArrayList 源码中,具体实现了扩容机制(如默认扩容 1.5 倍)
- 例 2:OpenJDK 的 ArrayList 可能实现相同的逻辑,但代码细节可能有细微差异(如注释、内部优化)
- JavaSE(规范):定义接口、抽象类、具体类以及 JVM 的行为和约束(定义语言和 API 应该是什么样)
- 历史名称:早期称为 J2SE(JDK 6 之前)
2、JavaEE
- JavaEE 的全称是 Java Platform Enterprise Edition(Java 平台企业版)
- 在 Java SE 基础上扩展了大量企业级 API(如 Servlet、JSP、EJB),提供分布式计算、事务管理、安全性等企业级功能
- JavaEE 接口由官方规范定义,具体实现由应用服务器(Tomcat、WildFly)或第三方库(Hibernate、ActiveMQ)提供
- 自 JDK 10 起由 Oracle 移交 Eclipse 基金会管理,更名为 Jakarta EE
- 历史名称:曾用名 J2EE(JDK 6 之前)
3、JavaME
- JavaME 的全称是 Java Platform Micro Edition(Java 平台微型版)
- 针对移动终端(手机、PDA 等)的轻量级平台,精简了 Java SE 的 API 并加入移动设备支持
- 随着 Android 和 iOS 的普及,JavaME 的使用逐渐减少
- 历史名称:曾用名 J2ME
4、三者关系
- JavaSE 是基础:JavaEE 和 JavaME 均基于 JavaSE 的核心功能构建
- JavaEE 是扩展:在 JavaSE 基础上增加企业级服务规范(如 Servlet、JPA、EJB)
- JavaME 是精简:仅保留 JavaSE 部分功能,并添加针对微型设备的特性
三、Java 程序运行机制及运行过程
1、Java 的跨平台性
Java 虚拟机机制屏蔽了底层运行平台的差别,实现了'一次编译,到处运行'。
2、Java 虚拟机(核心机制)
- JVM 是一个虚拟的计算机,具有指令集并使用不同的存储区域。负责执行指令,管理数据、内存、寄存器,包含在 JDK 中
- 对于不同的平台,有不同的虚拟机
- Java 虚拟机机制屏蔽了底层运行平台的差别,实现了'一次编译,到处运行'
四、Java 语言环境搭建
1、JDK(Java 开发工具包)
- 定义:JDK 是用于开发 Java 应用程序的完整工具包,包含编译、调试、文档生成等开发工具以及运行环境
- 组成部分:
- JRE:JDK 中内置了 JRE(包含核心类库),确保开发时可以直接运行程序
- 开发工具:如编译器 javac(将 Java 源代码编译为字节码)、调试器 jdb、文档工具 javadoc 等
- JDK 特有的工具类库:如:tools.jar,支持编译器(javac)、调试器(jdb)等工具的运行(位于 JDK 的 lib 目录下)
- 用途:开发者必须安装 JDK,才能编写、编译和调试 Java 程序
2、JRE(Java 运行时环境)
- 定义:JRE 是运行已编译 Java 程序所需的最小环境,无需开发功能
- 组成部分:
- JVM(Java 虚拟机):负责执行字节码,实现跨平台特性
- *JRE 中的核心类库:以 java.包的形式存在,例如 rt.jar、resource.jar 下 java.lang、java.util 等(位于 JRE 的 lib 目录下,并由 BootstrapClassLoader 自动加载)
- *JRE 中的扩展类库:以 javax.包的形式组织,例如 javax.sql 等(JRE 的 lib/ext 目录下,由 ExtensionClassLoader 加载)
- 用途:普通用户只需安装 JRE 即可运行 Java 程序(如.jar 或.class 文件),无需开发工具
3、环境变量及作用
3.1、JAVA_HOME
- 该环境变量的值是 Java 的安装路径,一些 Java 版本的软件和工具需要用到该变量
例如,当 Windows 平台上 JDK 的安装目录为'C:\java\jdk8'时,设置如下所示
JAVA_HOME=C:\java\jdk8
3.2、CLASSPATH
- 该环境变量用于指明 Java 字节码文件(.class 文件)的位置
- 默认情况下,如果未设置 CLASSPATH,Java 启动 JVM 后,会在当前目录下寻找字节码文件,一旦设置了 CLASSPATH,JVM 会在指定目录下查找字节码文件
- '.'表示当前目录,因为设置 CLASSPATH 会覆盖 JVM 的默认操作(查找当前目录),所以这里需要加上'.'
- dt.jar 是 Java 开发工具包(JDK)中用于为 IDE 提供 Swing/AWT 组件的设计时元数据(如属性、事件描述),支持通过拖拽和图形化界面进行可视化开发的核心类库文件
- tools.jar 的作用:包含编译工具(如 javac)所需的类库
- Java5 之前,若用户未显式配置 CLASSPATH 环境变量 JVM 不会在当前目录查询.class 文件,所以需要配置 CLASSPATH
- 但从 Java 5(2004 年发布)开始,默认情况,无需显式配置 CLASSPATH,JVM 会自动搜索当前目录和核心类库
环境变量 CLASSPATH 的值一般为一个以分号';'作为分隔符的路径列表,设置如下
CLASSPATH=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;
3.3、PATH
- 该环境变量指定一个路径列表,用于搜索可执行文件
- 不建议在 PATH 环境变量中添加当前目录'.'的主要原因:
- 如果当前目录'.'被加入 PATH,当用户进入公共可写目录/tmp 时,攻击者可能在该目录下放置与系统命令同名的恶意程序
- 例如:黑客在/tmp目录下创建名为 ls 的木马文件,当用户(尤其是 root 用户)执行 ls 命令时,会优先执行当前目录下的恶意程序而非系统标准的/bin/ls,导致权限泄露或数据被破坏
这样可以在命令行中直接使用 java 和 javac 命令,而不需要指定完整路径,否则就会出现以下错误:
执行一个可执行文件时,如果该文件不能在当前路径下找到,则依次寻找 PATH 中的每一个路径,直至找到。例如:
PATH=.;%JAVA_HOME%\bin;


