Ok我们又开始学习新的编程语言了,在掌握C++这一金典的面向对象的编程语言后,迁移到Java不是难事。
让我们从Java平台介绍说起吧。
设计基石:一次编译,到处运行
这是理解 Java 的首要切入点,也是其与 C++ 最根本的区别。
C++ 的编译模型:源代码 (.cpp) 被编译器直接翻译成特定硬件和操作系统下的原生机器码(例如,Windows x86 或 Linux ARM64)。代码的移植需要重新编译。
Python 的执行模型:通常被视为解释型语言,代码由解释器逐行执行(尽管内部有 .pyc 字节码作为优化)。
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 的思想。
一切皆在类中:Java 不存在全局函数或全局变量。所有的代码,包括程序的入口 main 函数,都必须定义在类的内部。
单继承与多实现:为了规避 C++ 中著名的“菱形继承”问题所带来的复杂性,Java 规定一个类最多只能继承一个父类。然而,为了满足对多种行为进行抽象的需求,Java 引入了接口。一个类可以实现任意多个接口。
接口 (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()。
- 局部变量类型推断 (var):可以使用
- 现状:一个成熟、稳定的版本,很多公司的中间代项目在使用。
Java 17 (LTS, 2021年9月)
这个版本带来了很多语法糖和 JVM 改进,让代码更简洁、更安全。
- 核心特性:
- Records (记录类):用一行代码就能创建不可变的数据载体类,自动生成构造函数、
equals()、hashCode()等方法。 - Sealed Classes (密封类):可以限制一个类能被哪些类继承或实现,增强了代码的封装性和安全性。
- Pattern Matching for
instanceof:在类型检查的同时完成变量声明和转换,减少了冗余代码。
- Records (记录类):用一行代码就能创建不可变的数据载体类,自动生成构造函数、
- 现状:一个非常推荐的现代化 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 JDK | Oracle | 官方“原厂”版本。包含 Oracle 认为重要的所有功能。 | Java 17+ 采用"NFTC"协议,生产环境免费,但有一定限制。历史版本许可复杂。 | 个人学习、开发。企业使用需仔细评估其许可协议。 |
| Adoptium Temurin | Eclipse Foundation | 完全免费、开源、社区驱动。由 IBM、Red Hat 等大厂支持,经过严格的 TCK 测试,质量极高。 | GPLv2 with Classpath Exception (完全免费)。 | 强烈推荐。个人开发、企业生产环境的绝佳选择,是事实上的社区标准。 |
| Amazon Corretto | Amazon | 完全免费,由亚马逊提供长期支持 (LTS)。在 AWS 内部大规模使用,经过生产环境严苛考验。 | GPLv2 with Classpath Exception (完全免费)。 | 强烈推荐。尤其适合部署在 AWS 上的应用,也适用于任何其他环境。 |
| Microsoft Build of OpenJDK | Microsoft | 完全免费,由微软提供长期支持 (LTS)。微软内部 Azure 等服务使用此版本。 | GPLv2 with Classpath Exception (完全免费)。 | 个人开发、企业生产环境,尤其适合与微软技术栈(如 Azure、VS Code)集成的场景。 |
| Azul Zulu / Core | Azul Systems | 免费的 OpenJDK 构建。提供最广泛的平台和版本支持,更新及时。 | GPLv2 with Classpath Exception (完全免费)。 | 需要在非常见平台(如 32 位系统、老版本 macOS)上运行 Java 的场景。 |
| Azul Platform Prime | Azul Systems | 高性能商业版。包含 C4 无暂停垃圾回收器和 Cloud Native Compiler,性能极强。 | 商业收费。 | 对低延迟、高吞吐量有极致要求的金融、电商等领域。 |
