Featured image of post Java|0.什么是Java

Java|0.什么是Java

AI 辅助信息

  • 使用工具:Gemini 2.5 Pro

Ok我们又开始学习新的编程语言了,在掌握C++这一金典的面向对象的编程语言后,迁移到Java不是难事。

让我们从Java平台介绍说起吧。

设计基石:一次编译,到处运行

这是理解 Java 的首要切入点,也是其与 C++ 最根本的区别。

  1. C++ 的编译模型:源代码 (.cpp) 被编译器直接翻译成特定硬件和操作系统下的原生机器码(例如,Windows x86 或 Linux ARM64)。代码的移植需要重新编译。

  2. Python 的执行模型:通常被视为解释型语言,代码由解释器逐行执行(尽管内部有 .pyc 字节码作为优化)。

  3. Java 的混合模型:Java 源代码 (.java) 首先被 javac 编译器编译成一种平台中立的字节码 (Bytecode),并储存在 .class 文件中。这种字节码并非任何物理机器的原生指令,而是专门为 Java 虚拟机 (Java Virtual Machine, JVM) 设计的。

随后,在任何安装了 JVM 的平台上,JVM 都会加载这些 .class 文件,并由其内部的解释器或即时编译器 (Just-In-Time, JIT) 将字节码翻译成当前平台的原生机器码来执行。

核心优势:这种模型赋予了 Java 无与伦比的跨平台能力。开发者编译出的程序(通常打包为 .jar 文件)无需修改即可在 Windows、macOS、Linux 等多种操作系统上运行,这使其在企业级后端服务领域获得了巨大的成功。

面向对象编程:更严格的范式

相较于 C++,Java 是一门更纯粹的面向对象语言,它在语法层面强制贯彻了 OOP 的思想。

  1. 一切皆在类中:Java 不存在全局函数或全局变量。所有的代码,包括程序的入口 main 函数,都必须定义在类的内部。

  2. 单继承与多实现:为了规避 C++ 中著名的“菱形继承”问题所带来的复杂性,Java 规定一个类最多只能继承一个父类。然而,为了满足对多种行为进行抽象的需求,Java 引入了接口。一个类可以实现任意多个接口。

  3. 接口 (Interface):接口是 Java OOP 的核心概念之一。你可以将其理解为 C++ 中的纯虚基类。它只定义了一组方法签名(契约),而不包含任何具体实现。任何声明实现该接口的类,都必须提供这套契约中所有方法的具体实现。在大型项目中,接口是定义模块边界、实现依赖倒置和解耦的关键工具。

内存管理:自动垃圾回收 (GC)

这一点与 Python 的体验相似,是 Java 相对于 C++ 的一大便利。

开发者使用 new 关键字创建对象实例后,无需像在 C++ 中那样手动调用 delete 来释放内存。JVM 的垃圾回收器 (Garbage Collector, GC) 会在后台自动监控对象的生命周期,当一个对象不再被任何活动的引用指向时,GC 会自动回收其占用的内存。

核心优势:极大地降低了内存泄漏和野指针等顽固问题的风险,让开发者能更专注于业务逻辑的实现。

现代工程实践生态

构建与依赖管理:Maven & Gradle

这是现代 Java 开发的基石。它们是强大的项目构建和依赖管理工具,类似于 C++ 的 CMake 与 Python 的 pip + requirements.txt 的结合体。开发者只需在项目的配置文件(Maven 的 pom.xml 或 Gradle 的 build.gradle)中声明所需的第三方库(依赖),构建工具便会自动下载、管理和链接这些库。除了这两个主流工具,IntelliJ IDEA 自身也集成了一套构建系统IntelliJ,可用于管理项目。

集成开发环境 (IDE):IntelliJ IDEA

被公认为 Java 开发的业界标准。它与 Maven/Gradle 无缝集成,提供了卓越的代码提示、重构和调试功能。(注:自 2025.3 版本起,Ultimate 和 Community 版本已合并,通过许可证区分高级功能)。

核心应用框架:Spring & Spring Boot

对于 Web 开发,Spring Boot 是首选。顾名思义,它是Spring的Boot,用于快速配置Spring。它极大地简化了基于 Spring 框架的应用程序的创建和部署过程。鉴于你熟悉 FastAPI/Flask,你会发现 Spring Boot 的开发体验非常相似:通过简单的注解就能快速构建出功能完备的 RESTful API。其背后的核心思想,如依赖注入 (Dependency Injection, DI) 和面向切面编程 (AOP),是后续进阶的必经之路。

Java的不同版本

了解 Java 的版本迭代对于工程实践和技术选型至关重要。当前 Java 的版本发布策略非常清晰,主要分为两类:长期支持 (LTS) 版本功能版本

1. 发布模式:LTS 与功能版本

从 Java 9 开始,Oracle(Java 的主要管理者)采用了新的发布模式:

  • 功能版本 (Feature Release)每六个月发布一个新版本(每年三月和九月)。这些版本会引入新的语言特性、API 和性能改进,但支持周期很短,通常只到下一个版本发布为止。它们的目的是让新功能可以快速地被开发者使用和验证。
  • 长期支持版本 (Long-Term Support, LTS)每两年发布一个。LTS 版本是为企业生产环境设计的,会获得数年的安全更新和错误修复,稳定性有充分保障。

简单来说:LTS 版本是用于生产环境的“主力军”,而功能版本则是新功能的“先锋队”。


2. 主流的 LTS 版本介绍

对于工程实践,你主要需要关注以下几个 LTS 版本。

Java 8 (LTS, 2014年3月)

这是一个里程碑式的版本,至今仍在大量老项目中广泛使用。

  • 核心特性
    • Lambda 表达式:引入了函数式编程风格,极大地简化了匿名内部类的写法。
    • Stream API:提供了一套强大的 API,可以用声明式的方式处理集合数据。
    • Optional:用于优雅地处理可能为 null 的值,避免 NullPointerException
    • 新的日期和时间 API (java.time)。
  • 现状:虽然功能上已显老旧,但由于其庞大的生态和存量项目,你工作中仍然很可能遇到它。

Java 11 (LTS, 2018年9月)

这是新发布模式下的第一个 LTS 版本,也是许多项目从 Java 8 升级后的选择。

  • 核心特性
    • 局部变量类型推断 (var):可以使用 var 关键字来声明局部变量,由编译器自动推断类型(类似于 C++ 的 auto)。
    • 标准化的 HTTP Client API:提供了一个现代化的、支持 HTTP/2 和异步操作的客户端。
    • String 类增强:增加了一些实用的新方法,如 isBlank(), lines(), strip()
  • 现状:一个成熟、稳定的版本,很多公司的中间代项目在使用。

Java 17 (LTS, 2021年9月)

这个版本带来了很多语法糖和 JVM 改进,让代码更简洁、更安全。

  • 核心特性
    • Records (记录类):用一行代码就能创建不可变的数据载体类,自动生成构造函数、equals()hashCode() 等方法。
    • Sealed Classes (密封类):可以限制一个类能被哪些类继承或实现,增强了代码的封装性和安全性。
    • Pattern Matching for instanceof:在类型检查的同时完成变量声明和转换,减少了冗余代码。
  • 现状:一个非常推荐的现代化 LTS 版本,许多新项目基于它开发。

Java 21 (LTS, 2023年9月)

这是当前最新的 LTS 版本,带来了革命性的性能提升和强大的新特性。

  • 核心特性
    • 虚拟线程 (Virtual Threads):这是 Project Loom 的核心成果。它极大地简化了高并发应用的编写,可以用传统的“一个请求一个线程”的同步风格代码,达到异步编程的高吞吐量,是对并发模型的一次巨大革新。
    • 序列化集合 (Sequenced Collections):为集合框架引入了统一的接口,可以方便地获取第一个、最后一个元素,或者逆序遍历。
    • Record Patterns 和 Pattern Matching for switch:进一步增强了模式匹配能力,让处理复杂数据结构的代码更加直观和安全。
  • 现状强烈推荐所有新项目使用此版本。它的虚拟线程特性对于构建高性能后端服务尤其重要。

Java 25 (LTS, 预计2025年9月)

这是下一个即将到来的 LTS 版本,它将固化从 Java 22 到 25 的所有新功能。

不止 Oracle 一家

当你下载 JDK 时,会发现有来自 Oracle、Eclipse、Amazon、Microsoft 等多家提供商的版本。理解它们的区别对于技术选型至关重要。核心在于,绝大多数发行版都共享同一个“心脏”——OpenJDK 项目。

OpenJDK 是 Java SE 平台的官方开源参考实现。各大厂商获取其源代码后,进行编译、测试,并可能加入自己的补丁或工具,最终形成各自的发行版。它们都通过了 TCK (Technology Compatibility Kit) 测试,以确保完全符合 Java 规范,因此你的代码在这些发行版之间是完全兼容的。

它们的主要区别在于:许可协议、支持周期、更新频率和性能特性。

发行版提供商核心特点许可与费用推荐场景
Oracle JDKOracle官方“原厂”版本。包含 Oracle 认为重要的所有功能。Java 17+ 采用"NFTC"协议,生产环境免费,但有一定限制。历史版本许可复杂。个人学习、开发。企业使用需仔细评估其许可协议。
Adoptium TemurinEclipse Foundation完全免费、开源、社区驱动。由 IBM、Red Hat 等大厂支持,经过严格的 TCK 测试,质量极高。GPLv2 with Classpath Exception (完全免费)。强烈推荐。个人开发、企业生产环境的绝佳选择,是事实上的社区标准。
Amazon CorrettoAmazon完全免费,由亚马逊提供长期支持 (LTS)。在 AWS 内部大规模使用,经过生产环境严苛考验。GPLv2 with Classpath Exception (完全免费)。强烈推荐。尤其适合部署在 AWS 上的应用,也适用于任何其他环境。
Microsoft Build of OpenJDKMicrosoft完全免费,由微软提供长期支持 (LTS)。微软内部 Azure 等服务使用此版本。GPLv2 with Classpath Exception (完全免费)。个人开发、企业生产环境,尤其适合与微软技术栈(如 Azure、VS Code)集成的场景。
Azul Zulu / CoreAzul Systems免费的 OpenJDK 构建。提供最广泛的平台和版本支持,更新及时。GPLv2 with Classpath Exception (完全免费)。需要在非常见平台(如 32 位系统、老版本 macOS)上运行 Java 的场景。
Azul Platform PrimeAzul Systems高性能商业版。包含 C4 无暂停垃圾回收器和 Cloud Native Compiler,性能极强。商业收费。对低延迟、高吞吐量有极致要求的金融、电商等领域。
本文采用 CC BY 4.0 许可协议,转载请注明出处。
使用 Hugo 构建
主题 StackJimmy 设计