# 01-Java环境搭建
## JDK安装
### JDK版本选择
LTS(长期支持)版本:
- **Java 8(LTS)**:2014年发布,企业广泛使用
- **Java 11(LTS)**:2018年发布,模块化系统
- **Java 17(LTS)**:2021年发布,密封类、记录类
学习环境:Java 17,生产环境:Java 11或Java 17。
### Java 17核心特性
**密封类(Sealed Classes):**
```java
// 限制继承范围
public sealed class Shape permits Circle, Rectangle {}
public final class Circle extends Shape {}
public non-sealed class Rectangle extends Shape {}
```
**记录类(Records):**
```java
// 不可变数据类
public record Point(int x, int y) {}
```
### 安装JDK
**Linux(Ubuntu/Debian):**
```bash
# 安装OpenJDK 17
sudo apt update
sudo apt install openjdk-17-jdk
# 验证安装
java -version
javac -version
```
**macOS:**
```bash
# 使用Homebrew
brew install openjdk@17
# 配置环境变量
echo 'export PATH="/opt/homebrew/opt/openjdk@17/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc
```
**Windows:**
1. 下载Oracle JDK或OpenJDK
2. 安装并配置JAVA_HOME环境变量
3. 添加%JAVA_HOME%\bin到PATH
### 环境变量配置
```bash
# Linux/macOS (~/.bashrc 或 ~/.zshrc)
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib
# 验证
echo $JAVA_HOME
java -version
```
## 开发工具
### IntelliJ IDEA
JetBrains出品,社区版免费。
**特性:**
- 智能代码补全
- 重构功能
- 内置调试器和性能分析
- 集成Maven/Gradle
- Git版本控制
**快捷键(macOS/Windows):**
- `Cmd/Ctrl + N`:快速查找类
- `Cmd/Ctrl + Shift + N`:快速查找文件
- `Cmd/Ctrl + Alt + L`:格式化代码
- `Cmd/Ctrl + /`:注释/取消注释
- `Shift + F10/F9`:运行/调试
### Eclipse
开源Java IDE,功能完整。
**特性:**
- 免费开源
- 插件生态丰富
- 资源占用较小
### VS Code
轻量级编辑器,通过插件支持Java。
**必装插件:**
- Extension Pack for Java
- Debugger for Java
- Maven for Java
## 构建工具
### Maven
基于XML的项目管理工具,依赖管理自动化。
**pom.xml示例:**
```xml
4.0.0
com.example
my-app
1.0-SNAPSHOT
17
17
UTF-8
org.junit.jupiter
junit-jupiter
5.9.0
test
```
**常用命令:**
```bash
mvn clean # 清理
mvn compile # 编译
mvn test # 测试
mvn package # 打包
mvn install # 安装到本地仓库
mvn clean package # 组合命令
```
### Gradle
基于Groovy/Kotlin的现代构建工具,配置更简洁。
**build.gradle示例:**
```groovy
plugins {
id 'java'
}
group = 'com.example'
version = '1.0-SNAPSHOT'
repositories {
mavenCentral()
}
dependencies {
testImplementation 'org.junit.jupiter:junit-jupiter:5.9.0'
}
java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
}
}
```
**常用命令:**
```bash
gradle clean # 清理
gradle build # 构建
gradle test # 测试
gradle run # 运行
./gradlew build # 使用wrapper
```
## Hello World
### 基本程序结构
```java
// HelloWorld.java
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
```
### 编译和运行
```bash
# 编译
javac HelloWorld.java
# 运行
java HelloWorld
# 输出
Hello, World!
```
### 带包的程序
```java
// src/main/java/com/example/App.java
package com.example;
public class App {
public static void main(String[] args) {
System.out.println("Hello from package!");
}
}
```
```bash
# 编译(在项目根目录)
javac -d out src/main/java/com/example/App.java
# 运行
java -cp out com.example.App
```
## 调试工具
### jdb(命令行调试器)
```bash
# 编译时加调试信息
javac -g HelloWorld.java
# 启动调试
jdb HelloWorld
# 常用命令
stop in HelloWorld.main # 设置断点
run # 运行
print variable # 打印变量
step # 单步执行
next # 下一行
cont # 继续执行
quit # 退出
```
### IntelliJ IDEA调试
- F8:单步跳过
- F7:单步进入
- Shift + F8:单步跳出
- F9:继续执行
- Cmd/Ctrl + F8:切换断点
- Alt + F9:运行到光标
## 常用工具
### jshell(Java 9+)
交互式Java REPL,快速验证代码。
```bash
# 启动
jshell
# 使用
jshell> int x = 10;
jshell> System.out.println(x * 2);
20
jshell> /exit
```
### jconsole/jvisualvm
JVM监控和性能分析工具。
```bash
# 启动jconsole
jconsole
# 启动jvisualvm
jvisualvm
```
**监控内容:**
- 堆内存使用
- 线程状态
- CPU占用
- GC活动
## 编码规范
### 命名约定
```java
// 类名:大驼峰
public class StudentInfo {}
// 方法/变量:小驼峰
public void calculateSum() {}
private int studentAge;
// 常量:全大写+下划线
public static final int MAX_SIZE = 100;
// 包名:全小写
package com.example.myapp;
// 接口:大驼峰(可选I前缀)
public interface Runnable {}
public interface IService {}
```
### 代码风格
```java
// 缩进:4空格
if (condition) {
statement;
}
// 大括号:K&R风格
public void method() {
// ...
}
// 一行一条语句
int a = 1;
int b = 2;
```
## 项目结构
### Maven标准结构
```
my-app/
├── pom.xml
├── src/
│ ├── main/
│ │ ├── java/ # Java源代码
│ │ │ └── com/example/
│ │ └── resources/ # 资源文件
│ └── test/
│ ├── java/ # 测试代码
│ └── resources/ # 测试资源
└── target/ # 编译输出
```
### Gradle标准结构
```
my-app/
├── build.gradle
├── settings.gradle
├── src/
│ ├── main/
│ │ ├── java/
│ │ └── resources/
│ └── test/
│ ├── java/
│ └── resources/
└── build/ # 编译输出
```
## Java 17完整特性列表
### 语言特性
**1. 密封类(Sealed Classes - JEP 409)**
- 限制类的继承层次
- 编译期完整性检查
- switch穷尽性分析
**2. 记录类(Records - JEP 395)**
- 不可变数据载体
- 自动生成样板代码
- 模式匹配支持
**3. 模式匹配(Pattern Matching - JEP 406)**
- instanceof自动转型
- switch表达式扩展
- 减少类型转换代码
**4. 文本块(Text Blocks - JEP 378)**
- 多行字符串字面量
- 保留格式和缩进
- 简化JSON/SQL/HTML编写
### API增强
**Stream增强:**
```java
// toList()快捷方法
List list = stream.toList();
// mapMulti替代flatMap(性能更好)
stream.mapMulti((item, consumer) -> {
consumer.accept(item);
consumer.accept(item * 2);
});
```
**RandomGenerator统一API:**
```java
import java.util.random.*;
RandomGenerator rng = RandomGenerator.of("L128X256MixRandom");
int value = rng.nextInt(100);
```
**Foreign Function & Memory API(孵化):**
- 替代JNI调用本地代码
- 直接内存访问
- 更安全的本地互操作
### JVM改进
**ZGC和Shenandoah GC正式版:**
- 低延迟垃圾收集器
- 适合大堆内存场景
**强封装JDK内部:**
```bash
# 访问内部API需要显式声明
java --add-opens java.base/java.lang=ALL-UNNAMED App
```
**性能优化:**
- 向量API(孵化):SIMD支持
- 增强伪随机数生成器
- macOS ARM64支持
### 从Java 11到17的演进
| 版本 | 关键特性 |
|------|---------|
| Java 12 | switch表达式(Preview) |
| Java 13 | 文本块(Preview) |
| Java 14 | instanceof模式(Preview)、Records(Preview)、NPE增强 |
| Java 15 | 密封类(Preview)、文本块(正式) |
| Java 16 | instanceof模式(正式)、Records(正式)、Stream.toList() |
| Java 17 | 密封类(正式)、模式匹配增强、LTS版本 |
**升级建议:**
- 从Java 8升级:需要处理模块化、弃用API
- 从Java 11升级:主要是新特性,兼容性好
- 新项目直接用Java 17