4714 字
24 min
0

初识Java

Java 的前身诞生于 1991 年,由 Sun Microsystems 公司 的 James Gosling、Mike Sheridan 和 Patrick Naughton 主导的 “Green” 项目。

JAVA发展简史

JAVA的诞生

  1. Java 的起源可追溯到 1991 年,由 Sun Microsystems 公司的 James Gosling、Mike Sheridan 和 Patrick Naughton 主导的 “Green” 项目。
  2. 该项目旨在为电视机顶盒开发一门嵌入式编程语言,最初命名为 Oak(取自加州的一棵橡树)。但由于商标冲突,后来更名为 Java ,灵感源自咖啡的名称。
  3. Java 之父:Java 之父

JAVA为什么被发明

  1. 应用场景:最初的目标是为下一代智能设备(如电视机顶盒、家用电器等)开发一种先进的软件平台。
  2. 核心需求不同厂商的设备使用不同的 CPU 架构(如 Motorola、Intel、MIPS 等)和操作系统。如果使用 C 或 C++ 这类传统语言,程序需要为每种硬件平台单独编译,导致开发和维护成本极高。因此,Java 被设计为一种与平台无关、跨体系结构的语言
  3. 演变与成功:虽然最初的目标市场(智能家电)并未立即成功,但随着 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 被划分为三个主要技术体系,以适应不同应用场景:

  1. J2EE(Java 2 Enterprise Edition)

    面向服务器端应用,主要用于构建 大规模、分布式、高可用、多层架构 的企业系统,如银行交易系统、电商平台、ERP、CRM 等。2005年更名为Java EE,2017年移交至 Eclipse 基金会,更名为 Jakarta EE(因 Oracle 商标问题)。

  2. J2SE(Java 2 Standard Edition)

    面向桌面和个人计算机应用,提供 Java 的核心功能,是其他版本的基础。2005年更名为 Java SE

  3. J2ME(Java 2 Micro Edition)

    面向移动设备和消费类电子产品(如手机、PDA、机顶盒等),提供精简版的 Java 平台。2018年,Oracle 宣布 Java ME 8 为最后一个主要版本,后续不再重点发展。

Note
1759041053653 (1)

JAVA的特点

跨平台

Java 的跨平台性体现在:字节码文件可以在任何安装了 Java 虚拟机(JVM)的设备上运行。JVM 内部的解释器会将字节码转换为对应平台的机器码并执行。因此实现了 “一次编写,到处运行” 的目标。

简单

Java 去掉了 C/C++ 中容易引发错误或增加复杂度的特性,使语言更简洁、安全,也更易于学习和使用。

  • 移除了 #include#define 等复杂的预处理机制。
  • 不再支持 structuniontypedef
  • 去掉了指针操作。
  • 取消了多重继承,避免继承体系过于复杂。
  • 不再允许使用 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)

  1. JVM(Java Virtual Machine)是一种规范,可通过软件或硬件实现,是一个用于执行 Java 字节码(bytecode)的虚拟计算机。
  2. JVM 定义了虚拟机的结构和运行机制,主要包括:类加载器(Class Loader)、字节码指令集(Instruction Set)、运行时数据区(Runtime Data Areas)、执行引擎(Execution Engine)。
  3. Java语言和虚拟机规范:Java虚拟机规范
虚拟机架构

1759041192529

类加载器(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跨平台原理

  1. 一次编译,到处运行。同一份字节码可以在不同操作系统和硬件平台的 JVM 上运行,实现真正的跨平台。
  2. Java编译器的作用:编译,将 Java 源文件(.java)编译为与平台无关的字节码文件(.class)。
  3. Java虚拟机的作用:解释,在运行时解释或即时编译字节码,将其转换为当前平台可执行的机器码。
JAVA跨平台原理

1759041667007

C语言跨平台原理

  1. 多次编译,到处运行。每个平台都必须单独编译源代码,生成可执行文件,才能实现跨平台运行。
  2. 源代码需在不同操作系统或硬件平台上使用对应的编译器(如 Windows 的 MSVC、Linux 的 GCC、macOS 的 Clang)编译。编译结果是特定平台的二进制文件(如 .exe.elf.dylib),只能在对应平台运行。
C语言多次编译
1756349483519 (1)

JAVA开发环境

JRE

  1. JRE是Java Runtime Environment的缩写,是Java程序的运行环境,包含了:java虚拟机,java基础类库。
  2. JRE是使用java语言编写的程序运行所需要的软件环境,是提供给想运行java程序的用户使用的。

JDK

  1. JDK是Java Development Kit的缩写,是Java开发工具包,是程序员使用Java语言编写Java程序所需的开发工具包,是提供给程序员使用的。
  2. JDK包含了JRE,同时还包含了编译Java源码的编译器javac,还包含了很多Java程序调试和分析的工具。
  3. 如果你需要运行Java程序,只需安装JRE就可以了。如果你需要编写Java程序,需要安装JDK。
  4. 总结:JDK包含了JRE,JRE包含JVM
JDK

1756349483549

Windows 安装

超详细JDK下载与安装步骤

macOS 安装

使用 Homebrew 安装 OpenJDK 并配置环境变量

Linux 安装

Linux系统中JDK的安装与卸载流程详解

环境变量配置

PATH(系统路径)

  • 操作系统用来查找可执行文件(如 .exe.sh.bat)。
  • 配置 PATH 环境变量后,可在任意目录直接使用 Java 的编译和运行工具(如 javajavac)。
  • 系统会按照 PATH 指定的目录顺序查找命令对应的可执行程序。

CLASSPATH(Java 类路径)

  • JVM 用于查找 .class 文件和 .jar 包的路径。
  • 运行 java MyClass 时,JVM 会按 CLASSPATH 指定的目录查找 MyClass.class
  • 一般无需手动配置,默认从当前目录查找字节码文件

CLASSPATH 查找顺序
  1. 命令行指定的 -cp-classpath 路径(优先级最高)
    • 使用 ;(Windows)或 :(Linux/macOS)分隔多个路径。
    • 可以包含目录或 JAR 包。
java -cp "路径1;路径2;..." MyClass
  1. 环境变量 CLASSPATH 指定的路径
    • 如果命令行未指定,则 JVM 会使用 CLASSPATH 环境变量中的路径查找类文件。
export CLASSPATH=/usr/local/java/classes:/usr/local/java/lib/*
  1. 默认当前目录(.
    • 如果命令行和环境变量都未指定,JVM 默认从当前工作目录查找类文件。
    • ⚠️ 注意:如果 CLASSPATH 设置了其他路径但不包含 .,则当前目录不会自动搜索。此时,运行当前目录下的类文件会失败,JVM 会报 ClassNotFoundException
    • 为了确保当前目录的类能被正确加载,最好在 CLASSPATH 或命令行路径中包含 .

PATH vs CLASSPATH 对比总结

属性PATHCLASSPATH
用途告诉操作系统在哪里查找可执行程序
(如 javajavac
告诉 JVM 在运行时或编译时查找类文件
(.class)和 JAR 包
作用对象系统命令和可执行文件Java 类文件和 JAR 包
影响范围影响命令行能否直接执行 Java 工具影响 java 命令运行时的类加载路径;
影响 javac 编译时查找引用类路径
默认值无,需手动设置
(通常包含 JDK bin 目录)
如果不配置,默认使用当前目录(.
配置方式环境变量,如:
PATH=/usr/local/java/bin:$PATH
环境变量,如:
CLASSPATH=.:/path/to/libs/*
命令行覆盖可以通过命令行直接调用指定路径的工具,
不受 PATH 限制
可以使用 -cp-classpath 参数临时指定,
优先级高于环境变量
常见问题PATH 未设置或设置错误 →
无法找到 javajavac 命令
未包含当前目录或所需 JAR →
javaClassNotFoundException
javaccannot find symbol

Hello World

Java 入门最经典的示例程序就是 Hello World,它演示了 Java 程序的基本结构和运行方式。

  1. 创建 Java 类

    • 在 Java 中,程序由类组成。可以创建一个名为 Main.java 的文件
    public class Main {
        public static void main(String[] args) {
            // 输出 "Hello, World!" 到控制台
            System.out.print("Hello, World!");
        }
    }
  2. 代码解析

    • public class Main:定义一个公共类,类名必须和文件名相同。
    • public static void main(String[] args):程序入口方法,JVM 执行程序时从这里开始。
    • System.out.println("Hello, World!");:打印文本到控制台。
  3. 编译与运行

    假设你已经安装好 JDK 并配置了 PATH 环境变量

    • 打开终端或命令行,进入 Main.java 文件所在目录。
    • 编译 Java 文件,编译成功后会生成 Main.class 文件。
    javac Main.java
    • 可以使用javap -c Main来查看生成的字节码。

    1757919251933 (1)

    • 运行程序,控制台输出:Hello, World!
    java Main
    1758434403673

相关文章

评论区