初识Java
JAVA发展简史
JAVA的诞生
JAVA为什么被发明
- 应用场景:最初的目标是为下一代智能设备(如电视机顶盒、家用电器等)开发一种先进的软件平台。
- 核心需求:不同厂商的设备使用不同的 CPU 架构(如 Motorola、Intel、MIPS 等)和操作系统。如果使用 C 或 C++ 这类传统语言,程序需要为每种硬件平台单独编译,导致开发和维护成本极高。因此,Java 被设计为一种与平台无关、跨体系结构的语言。
- 演变与成功:虽然最初的目标市场(智能家电)并未立即成功,但随着 1995 年互联网的兴起,Java 的平台无关性和网络能力使其成为开发 Web 应用(尤其是 Applet)的理想选择,从而迅速流行起来。
JAVA的发展史
诞生与早期阶段(1991–1995)
1991年,Sun Microsystems 为探索未来智能家电市场,启动了
Green Project,由James Gosling团队开发,最初命名为Oak(橡树)。然而,由于消费电子市场尚未成熟,Sun Microsystems 未能成功推广基于 Oak 的产品。1994 年,随着万维网(WWW)的兴起,团队意识到 Oak 的平台无关性和网络支持特性非常适合互联网。于是放弃嵌入式路线,将 Oak 重新定位为面向网络的编程语言,并更名为 Java(灵感来自印度尼西亚爪哇岛,象征 “热咖啡” 般的活力)。
1995 年 5 月,Sun 首次发布
JDK 1.0(预览版本),标志着 Java 作为一门通用编程语言的诞生。其核心理念:“Write Once, Run Anywhere”(一次编写,到处运行),依托 Java 虚拟机(JVM)实现跨平台执行。核心技术
- JVM(Java虚拟机):实现跨平台。
- Applet:Netscape Navigator 浏览器宣布支持 Java Applet,使 Java 成为早期 Web 动态内容的主流技术(后因安全漏洞,在 Java 9 中被标记为废弃,在 Java 11 中被彻底移除)。
标准化与爆发(1996–2006)
- 1996年:发布 JDK 1.0 首个生产级稳定版本,Java 正式走向大众市场。
- 1997年,JDK 1.1 引入 内部类、JDBC(数据库连接)。
- 1998年,J2SE 1.2 划分三大版本:J2SE(标准版,用于桌面和通用应用)、J2EE(企业版,集成 Servlet、JSP、EJB 等技术,成为企业级 Web 开发主流)、J2ME(微型版,面向手机、PDA 等资源受限设备,在功能机时代广泛应用)。
- 2004年,JDK 1.5(代号 Tiger)革命性更新:泛型、注解、自动装箱/拆箱、枚举、增强 for 循环、并发工具包
java.util.concurrent(由 Doug Lea 贡献,极大提升多线程编程效率)。- 2005年,JDK 1.6,Java各种版本被更名,取消其中的数字”2”:J2EE更名为Java EE,J2SE更名为Java SE,J2ME更名为Java ME。
- 2006年,Sun 公司宣布将 Java 开源,在 GPLv2 许可下发布大部分 Java 源代码,成立 OpenJDK(Open Java Development Kit)项目。这一举措极大促进了 Java 社区的发展,为后续 Oracle 接管后的生态延续奠定了基础。
现代Java(2010–至今)
- 2010 年:Oracle 收购 Sun Microsystems,接管 Java。
- 2011 年:JDK 1.7 发布,改进 switch 支持字符串、try-with-resources 等语法。
- 2014年,JDK 1.8,引入 Lambda 表达式、Stream API,推动函数式编程。该版本是当前最广泛使用的版本(LTS)。
- 2017年,Java 9 推出 模块化系统(JPMS),解决“JAR 地狱”问题。
- 2018年,Oracle 宣布从 Java 10 开始,每 6 个月(每年 3 月和 9 月)发布一个新版本。
- 2018年9月,Java 11(LTS),首个长期支持的 “现代 Java” 版本,移除 Java EE 和 CORBA 模块。
- 2021年9月,Java 17(LTS),带来 密封类(Sealed Classes)、模式匹配等特性,成为当前新项目推荐使用的 LTS 基线。
- 2023年9月,Java 21(LTS),正式发布 虚拟线程(Virtual Threads),并发性能提升。
- 2024年9月,Java 23,引入字符串模板(String Templates)、类模板(Class Templates 预览),改进虚拟线程与垃圾回收性能。
- 2025年3月,Java 24,计划正式引入外部函数与内存 API(FFM)、继续完善类模板、提升编译器与运行时性能。
JAVA各版本含义
在 Java 2 平台(1998年发布)时期,Java 被划分为三个主要技术体系,以适应不同应用场景:
J2EE(Java 2 Enterprise Edition)
面向
服务器端应用,主要用于构建 大规模、分布式、高可用、多层架构 的企业系统,如银行交易系统、电商平台、ERP、CRM 等。2005年更名为Java EE,2017年移交至 Eclipse 基金会,更名为Jakarta EE(因 Oracle 商标问题)。J2SE(Java 2 Standard Edition)
面向
桌面和个人计算机应用,提供 Java 的核心功能,是其他版本的基础。2005年更名为Java SE。J2ME(Java 2 Micro Edition)
面向
移动设备和消费类电子产品(如手机、PDA、机顶盒等),提供精简版的 Java 平台。2018年,Oracle 宣布 Java ME 8 为最后一个主要版本,后续不再重点发展。Note
JAVA的特点
跨平台
Java 的跨平台性体现在:字节码文件可以在任何安装了 Java 虚拟机(JVM)的设备上运行。JVM 内部的解释器会将字节码转换为对应平台的机器码并执行。因此实现了 “一次编写,到处运行” 的目标。
简单
Java 去掉了 C/C++ 中容易引发错误或增加复杂度的特性,使语言更简洁、安全,也更易于学习和使用。
- 移除了
#include、#define等复杂的预处理机制。- 不再支持
struct、union和typedef。- 去掉了指针操作。
- 取消了多重继承,避免继承体系过于复杂。
- 不再允许使用
goto。- 移除了操作符重载(Operator Overloading)。
- 不再支持全局变量。
- 摆脱了手动内存管理,交由垃圾回收机制(GC)自动处理。
安全
- 取消指针:Java 移除了功能强大但危险的指针,避免了随意访问内存带来的风险(如:破坏数据、干扰其他程序运行等问题)。
- 自动内存管理:通过垃圾回收器(GC)自动回收不再使用的对象,降低了内存泄漏的风险。
- 字节码加密:在字节码传输过程中采用公开密钥加密机制(PKC),增强了传输过程的安全性。
- 多层次安全机制:运行环境提供四级保障 ——
字节码校验器、类装载器、运行时内存布局、文件访问限制。- 强类型检查:作为强类型语言,Java 在编译阶段就会进行严格的类型检查,有助于减少运行时错误,提高代码的稳定性和安全性。
完全面向对象
- 统一的面向对象理念:Java 和 C++ 都支持面向对象的三大特性 ——
封装、继承和多态。- 区别于 C++ 的妥协:C++ 为了兼容大量的 C 语言代码,被称作“带类的 C”,在语法和设计上保留了不少非面向对象的特性,影响了其面向对象的彻底性。
- Java 的彻底性:Java 从一开始就被设计为纯粹的面向对象语言,语法简洁、规模更小,学习曲线更平滑。它在借鉴多种语言优点的同时,摒弃了 C++ 的复杂性和不足,从根本上解决了其固有缺陷。
健壮
- Java 在设计之初就强调程序的健壮性。它继承了 C/C++ 的优势,但去掉了那些容易导致错误和不稳定的特性,如:指针操作、手动内存管理(申请与释放)等。
- 同时,Java 提供了:自动垃圾回收机制、异常处理机制 和 强类型检查,进一步保障了程序的稳定性和可靠性。
多线程支持
- 内置多线程机制:Java 从语言层面就支持多线程,
Thread类和Runnable接口让开发者能够轻松创建和管理线程。- 丰富的并发类库:通过
java.util.concurrent包,Java 提供了线程池、并发集合、原子类、锁机制等工具,帮助开发者更高效、安全地处理多线程问题。- 平台独立性:Java 的多线程由虚拟机实现,屏蔽了底层操作系统的差异,从而在各平台上保持一致的运行行为。
这些特性使得 Java 特别适合构建高并发、大规模的分布式系统。
丰富的类库
- 标准库全面:Java 拥有庞大的标准库(Java API),涵盖 IO、网络、数据结构、多线程、GUI、加密、安全、正则表达式等各个方面。
- 第三方生态丰富:除了标准库,Java 拥有成熟的第三方类库和框架(如:Spring Boot、MyBatis、JUnit 等),进一步扩展了语言的能力。
JAVA跨平台原理
虚拟机(JVM)
- JVM(Java Virtual Machine)是一种规范,可通过软件或硬件实现,是一个用于执行 Java 字节码(bytecode)的虚拟计算机。
- JVM 定义了虚拟机的结构和运行机制,主要包括:类加载器(Class Loader)、字节码指令集(Instruction Set)、运行时数据区(Runtime Data Areas)、执行引擎(Execution Engine)。
- Java语言和虚拟机规范:Java虚拟机规范
虚拟机架构
类加载器(Class Loader)
- 负责在运行时将 Java 类(.class 文件)加载到 JVM 内存。
- JVM 通过 双亲委派机制(Parent Delegation Model) 加载类,保证核心类库优先加载,避免重复加载。
- 类加载过程包括:
加载(Loading)→链接(Linking:验证、准备、解析)→初始化(Initialization)。- 加载后的类信息会存放在
方法区(Method Area)中。指令集(Instruction Set)
- Java 程序首先被编译为字节码(Bytecode),字节码不是直接面向 CPU 的机器码,而是面向 JVM 的指令集。
- JVM 通过
解释执行或JIT 编译,将字节码翻译为底层 CPU 对应的机器码,最终由硬件执行。- Java字节码指令列表
运行时数据区(Runtime Data Areas)
- JVM 在程序执行时将数据划分到不同的内存区域,以提高访问效率。
堆(Heap):存放对象实例,由垃圾回收器(GC)管理,是所有线程共享的内存区域。方法区(Method Area):存放类的元数据(Class 信息)、常量池、静态变量以及 JIT 编译后的代码,也是线程共享的区域。Java 虚拟机栈(Java Stacks):每个线程独立,存储方法调用的栈帧,包括局部变量、操作数栈和返回地址。本地方法栈(Native Method Stack):每个线程独立,为执行native方法提供支持。程序计数器(PC Register):记录当前线程正在执行的字节码指令的位置。当线程被切换(如操作系统的线程调度)时,程序计数器会保存该线程的执行位置,线程恢复时可以从该位置继续执行。执行引擎(Execution Engine)
- 核心组件,负责执行字节码指令,将与平台无关的字节码转换为平台相关的执行操作。
解释器(Interpreter):逐条读取并解释字节码执行,启动快、实现简单,但执行速度较慢。即时编译器(JIT, Just-In-Time Compiler):将热点字节码(经常执行的部分)编译为本地机器码,提高执行效率。
JAVA语言的类型
计算机的高级编程语言类型一般为: 编译型和解释型,而Java语言是两种类型的结合。
编译阶段
- Java 源代码(
.java)先通过javac编译器编译为字节码文件(.class)。- 这个过程类似于传统的编译型语言(如 C/C++)——先编译再运行。
解释执行阶段
- 生成的
.class字节码不会直接由操作系统运行,而是由 Java 虚拟机(JVM)进行解释执行或即时编译执行(JIT)。- JVM 会将字节码逐条解释执行,也会将运行频繁的热点代码通过 JIT 编译为本地机器码,从而显著提升执行性能。
JAVA和C跨平台原理的比较
JAVA跨平台原理
- 一次编译,到处运行。同一份字节码可以在不同操作系统和硬件平台的 JVM 上运行,实现真正的跨平台。
- Java编译器的作用:编译,将 Java 源文件(
.java)编译为与平台无关的字节码文件(.class)。- Java虚拟机的作用:解释,在运行时解释或即时编译字节码,将其转换为当前平台可执行的机器码。
JAVA跨平台原理
C语言跨平台原理
- 多次编译,到处运行。每个平台都必须单独编译源代码,生成可执行文件,才能实现跨平台运行。
- 源代码需在不同操作系统或硬件平台上使用对应的编译器(如 Windows 的 MSVC、Linux 的 GCC、macOS 的 Clang)编译。编译结果是特定平台的二进制文件(如
.exe、.elf、.dylib),只能在对应平台运行。C语言多次编译
JAVA开发环境
JRE
- JRE是
Java Runtime Environment的缩写,是Java程序的运行环境,包含了:java虚拟机,java基础类库。- JRE是使用java语言编写的程序运行所需要的软件环境,是提供给想运行java程序的用户使用的。
JDK
- JDK是
Java Development Kit的缩写,是Java开发工具包,是程序员使用Java语言编写Java程序所需的开发工具包,是提供给程序员使用的。- JDK包含了JRE,同时还包含了编译Java源码的编译器javac,还包含了很多Java程序调试和分析的工具。
- 如果你需要运行Java程序,只需安装JRE就可以了。如果你需要编写Java程序,需要安装JDK。
- 总结:JDK包含了JRE,JRE包含JVM。
JDK
Windows 安装
macOS 安装
Linux 安装
环境变量配置
PATH(系统路径)
- 操作系统用来查找可执行文件(如
.exe、.sh、.bat)。- 配置 PATH 环境变量后,可在任意目录直接使用 Java 的编译和运行工具(如
java、javac)。- 系统会按照 PATH 指定的目录顺序查找命令对应的可执行程序。
CLASSPATH(Java 类路径)
- JVM 用于查找
.class文件和.jar包的路径。- 运行
java MyClass时,JVM 会按 CLASSPATH 指定的目录查找MyClass.class。- 一般无需手动配置,默认从当前目录查找字节码文件。
CLASSPATH 查找顺序
- 命令行指定的
-cp或-classpath路径(优先级最高)
- 使用
;(Windows)或:(Linux/macOS)分隔多个路径。- 可以包含目录或 JAR 包。
java -cp "路径1;路径2;..." MyClass
- 环境变量 CLASSPATH 指定的路径
- 如果命令行未指定,则 JVM 会使用 CLASSPATH 环境变量中的路径查找类文件。
export CLASSPATH=/usr/local/java/classes:/usr/local/java/lib/*
- 默认当前目录(
.)
- 如果命令行和环境变量都未指定,JVM 默认从当前工作目录查找类文件。
- ⚠️ 注意:如果 CLASSPATH 设置了其他路径但不包含
.,则当前目录不会自动搜索。此时,运行当前目录下的类文件会失败,JVM 会报ClassNotFoundException。- 为了确保当前目录的类能被正确加载,最好在 CLASSPATH 或命令行路径中包含
.。
PATH vs CLASSPATH 对比总结
属性 PATH CLASSPATH 用途 告诉操作系统在哪里查找可执行程序
(如java、javac)告诉 JVM 在运行时或编译时查找类文件
(.class)和 JAR 包作用对象 系统命令和可执行文件 Java 类文件和 JAR 包 影响范围 影响命令行能否直接执行 Java 工具 影响 java命令运行时的类加载路径;
影响javac编译时查找引用类路径默认值 无,需手动设置
(通常包含 JDKbin目录)如果不配置,默认使用当前目录( .)配置方式 环境变量,如: PATH=/usr/local/java/bin:$PATH环境变量,如: CLASSPATH=.:/path/to/libs/*命令行覆盖 可以通过命令行直接调用指定路径的工具,
不受 PATH 限制可以使用 -cp或-classpath参数临时指定,
优先级高于环境变量常见问题 PATH 未设置或设置错误 →
无法找到java或javac命令未包含当前目录或所需 JAR →
java报ClassNotFoundException
或javac报cannot find symbol
Hello World
Java 入门最经典的示例程序就是 Hello World,它演示了 Java 程序的基本结构和运行方式。
创建 Java 类
- 在 Java 中,程序由类组成。可以创建一个名为
Main.java的文件public class Main { public static void main(String[] args) { // 输出 "Hello, World!" 到控制台 System.out.print("Hello, World!"); } }代码解析
public class Main:定义一个公共类,类名必须和文件名相同。public static void main(String[] args):程序入口方法,JVM 执行程序时从这里开始。System.out.println("Hello, World!");:打印文本到控制台。编译与运行
假设你已经安装好 JDK 并配置了
PATH环境变量
- 打开终端或命令行,进入
Main.java文件所在目录。- 编译 Java 文件,编译成功后会生成
Main.class文件。javac Main.java
- 可以使用
javap -c Main来查看生成的字节码。
- 运行程序,控制台输出:
Hello, World!java Main![]()





