14917 字
75 分钟

针对 Java 的零基础编程入门指南

2026-01-13
浏览量 加载中...

针对 Java 的零基础编程入门指南#

本指南将帮助您从零开始,逐步掌握 Java 编程基础知识。

目录#


第一步:了解什么是 Java#

🎯 什么是编程?#

在开始学习 Java 之前,让我们先理解什么是”编程”。

编程就像是在和电脑”对话”——用一种电脑能听懂的语言,告诉电脑要做什么。

💡 通俗比喻

  • 编程 = 写菜谱(告诉厨师怎么做菜)
  • 程序员 = 写菜谱的人
  • 电脑 = 按照菜谱做菜的厨师
  • Java = 菜谱的语言(比如中文菜谱、英文菜谱)

为什么选择学编程?#

编程可以让你:

  • 🤖 自动化:让电脑帮你重复做枯燥的工作
  • 📱 开发应用:制作自己的手机应用、网站
  • 💡 解决问题:用逻辑思维解决实际问题
  • 🚀 职业发展:编程是当今最热门的技能之一

Java 是一种广泛使用的编程语言,以其”一次编写,到处运行”的特性而闻名。

Java vs 其他编程语言#

特性JavaPythonJavaScript
运行方式编译后运行在 JVM解释运行浏览器或 Node.js
类型系统强类型强类型(动态)弱类型
性能高(JIT 优化)中等中等
应用领域企业级应用、AndroidAI、数据分析、Web 开发前端开发、Node.js

为什么选择 Java?#

  • ✅ 跨平台:一次编写,到处运行
  • ✅ 强类型:减少运行时错误
  • ✅ 性能优秀:JIT 编译器优化
  • ✅ 生态丰富:大量的库和框架
  • ✅ 就业前景好:企业级应用开发首选
  • ✅ Android 开发:移动应用开发主流语言

🚨 常见误区#

在学习 Java 之前,先了解这些常见的误区,可以让你少走弯路:

误区真相
❌ “编程需要数学很好”💡 大部分编程只需要基础数学,逻辑思维更重要
❌ “我年纪大了学不会”💡 编程不分年龄,很多程序员都是半路出家
❌ “必须学完所有知识才能开始写代码”💡 边学边写,实践是最好的学习方式
❌ “Java 太难了,不适合新手”💡 Java 语法规范清晰,反而适合初学者建立正确的编程思维
❌ “看懂了就会了”💡 看懂 ≠ 会写,必须亲手敲代码才能真正掌握

🎓 学习心态#

保持正确的心态,学习效果会事半功倍:

  • 🌟 不要怕犯错:错误是学习的一部分,每个程序员都会犯错
  • 🌟 多动手:光看不练假把式,一定要亲手敲代码
  • 🌟 循序渐进:不要急于求成,打好基础最重要
  • 🌟 保持耐心:编程技能需要时间积累,给自己一点时间
  • 🌟 多问为什么:理解原理比记忆语法更重要

第二步:安装 Java#

📦 安装流程速览#

graph LR A[1. 下载 JDK<br/>选择适合你系统的版本] --> B[2. 安装 JDK<br/>双击安装包<br/>一路下一步] B --> C[3. 验证安装<br/>输入命令确认<br/>看到版本号] style A fill:#e1f5ff style B fill:#fff4e1 style C fill:#e8f5e9

💡 什么是 JDK?#

在安装之前,先了解一下几个重要概念:

术语全称作用通俗理解
JDKJava Development KitJava 开发工具包🛠️ 编程工具箱(包含编译器、运行环境等)
JREJava Runtime EnvironmentJava 运行环境🏃 运行程序所需的环境
JVMJava Virtual MachineJava 虚拟机🖥️ 让 Java 程序在不同系统上运行的”翻译官”

💡 简单来说:JDK = JRE + 开发工具。我们开发 Java 程序需要安装 JDK。

Windows 系统#

TIP

推荐下载 JDK 17 或更高版本的 LTS(长期支持)版本,这是最稳定的版本,适合生产环境使用。安装后务必验证安装是否成功,可以通过输入 java -versionjavac -version 来确认。

  1. 下载 Java JDK

  2. 安装 Java

    • 双击下载的安装包
    • 按照提示完成安装
  3. 验证安装

    • 打开”命令提示符”(按 Win+R,输入cmd,回车)
    • 输入:java -version
    • 输入:javac -version
    • 如果显示版本号,说明安装成功
  4. 配置环境变量(如果需要)

    • 右键”此电脑” > “属性” > “高级系统设置” > “环境变量”
    • 在”系统变量”中添加:
      • JAVA_HOME:JDK 安装路径(如 C:\Program Files\Java\jdk-17
      • Path:添加 %JAVA_HOME%\bin

macOS 系统#

  1. 下载 Java JDK

  2. 安装 Java

    Terminal window
    # 使用 Homebrew 安装(推荐)
    brew install openjdk@17
    # 或双击下载的 .dmg 安装包
  3. 验证安装

    • 打开”终端”
    • 输入:java -version
    • 输入:javac -version

Linux 系统#

Terminal window
# Ubuntu/Debian
sudo apt update
sudo apt install openjdk-17-jdk
# CentOS/RHEL
sudo yum install java-17-openjdk-devel
# 验证安装
java -version
javac -version

第三步:安装代码编辑器#

推荐使用 VS Code(Visual Studio Code)或 IntelliJ IDEA

VS Code(轻量级,推荐初学者)#

  1. 下载 VS Code

  2. 安装 VS Code

    • 双击下载的安装包
    • 按照提示完成安装
  3. 安装 Java 扩展

    • 打开 VS Code
    • 点击左侧的”扩展”图标(四个方块)
    • 搜索”Extension Pack for Java”(由 Microsoft 发布)
    • 点击”安装”

IntelliJ IDEA(功能强大,推荐进阶)#

  1. 下载 IntelliJ IDEA

    • 访问 JetBrains 官网
    • 下载 Community 版本(免费)或 Ultimate 版本(付费)
  2. 安装 IntelliJ IDEA

    • 双击下载的安装包
    • 按照提示完成安装

第四步:学习 Java 基础语法#

🗺️ 语法学习路线图#

graph TD A[1️⃣ 变量<br/>存储数据] --> B[2️⃣ 数据类型<br/>数据的种类] B --> C[3️⃣ 函数<br/>封装功能] C --> D[4️⃣ 条件判断<br/>做决定] D --> E[5️⃣ 循环<br/>重复执行] E --> F[6️⃣ 字符串操作<br/>处理文字] style A fill:#e1f5ff style B fill:#fff4e1 style C fill:#e8f5e9 style D fill:#fce4ec style E fill:#f3e5f5 style F fill:#fff3e0

📚 为什么要学这些语法?#

想象你在写一封信:

  • 变量 = 信封上的名字(用来标记和存储信息)
  • 数据类型 = 信的内容类型(是文字、数字还是图片?)
  • 函数 = 信中的段落(把相关内容放在一起)
  • 条件判断 = 信中的”如果…就…”(根据情况做不同反应)
  • 循环 = 信中的”重复写…”(重复做同样的事情)
  • 字符串操作 = 修改和整理信中的文字

您只需要掌握以下基础知识就能开始编写实用的程序:

4.1 变量#

TIP

Java 的变量命名规则:只能包含字母、数字、下划线和美元符号($),不能以数字开头,不能使用 Java 的关键字(如 class、if、else 等)。变量名应该有意义,使用小驼峰命名法(如 userName、totalPrice)。

🎯 什么是变量?#

变量就像是一个”盒子”或”标签”,用来存储数据。

💡 生活比喻

  • 变量 = 一个贴了标签的盒子
  • 变量名 = 盒子上的标签(比如”姓名”、“年龄”)
  • 变量值 = 盒子里装的东西(比如”张三”、“25”)
graph LR A[变量名<br/>name] -->|标签| B[内容<br/>'张三'] style A fill:#e1f5ff style B fill:#fff4e1

📝 变量的命名规则#

给变量起名字也有一些规则:

规则示例说明
✅ 只能包含字母、数字、下划线和$userName, user_name, user123合法
❌ 不能以数字开头1name, 2user非法
❌ 不能是 Java 关键字class, public, static这些是保留字
✅ 使用有意义的名字age, userName, totalPrice推荐
❌ 使用无意义的名字a, b, x不推荐(除非是循环变量)
// 声明变量(需要指定类型)
String name = "张三";
int age = 25;
double price = 19.99;
boolean isValid = true;
// 使用 var 关键字(类型推断,Java 10+)
var greeting = "你好";
var count = 100;
// 打印变量的值
System.out.println(name); // 输出:张三
System.out.println(age); // 输出:25

4.2 数据类型#

🎯 什么是数据类型?#

数据类型就是告诉电脑这个变量要存储什么样的数据。

💡 生活比喻

  • 数据类型 = 盒子的类型(不同类型装不同东西)
  • int = 装整数的盒子(只能装 1, 2, 100…)
  • double = 装小数的盒子(可以装 3.14, 19.99…)
  • String = 装文字的盒子(可以装”你好”、“张三”…)
  • boolean = 装开关的盒子(只能装 true 或 false)
graph TD A[Java 数据类型] --> B[基本数据类型<br/>8种] A --> C[引用数据类型<br/>无数种] B --> D[数字类型] B --> E[字符类型] B --> F[布尔类型] C --> G[字符串] C --> H[数组] C --> I[类] style A fill:#e1f5ff style B fill:#fff4e1 style C fill:#e8f5e9 style D fill:#fce4ec style E fill:#f3e5f5 style F fill:#fff3e0 style G fill:#e8f5e9 style H fill:#e8f5e9 style I fill:#e8f5e9

📊 基本数据类型 vs 引用数据类型#

特性基本数据类型引用数据类型
存储内容实际的值对象的地址(引用)
存储位置栈(Stack)堆(Heap)
默认值0, false, \u0000null
大小固定大小不固定
示例int, double, booleanString, 数组, 类

基本数据类型:

// 整数类型
byte b = 127; // 8 位
short s = 32767; // 16 位
int i = 2147483647; // 32 位
long l = 9223372036854775807L; // 64 位(需要 L 后缀)
// 浮点类型
float f = 3.14f; // 32 位(需要 f 后缀)
double d = 3.14159; // 64 位
// 字符类型
char c = 'A'; // 单个字符
// 布尔类型
boolean flag = true;
boolean flag2 = false;

引用数据类型:

// 字符串(不可变)
String text = "Hello, World!";
String name = "张三";
// 数组
int[] numbers = {1, 2, 3, 4, 5};
String[] fruits = {"苹果", "香蕉", "橙子"};
// 类
String str = new String("Hello");

4.3 函数(方法)#

🎯 什么是函数?#

函数(在 Java 中也叫”方法”)就是一段可以重复使用的代码,用来完成特定的功能。

💡 生活比喻

  • 函数 = 一个”配方”或”说明书”
  • 函数名 = 配方的名字(比如”做蛋糕”、“煮咖啡”)
  • 参数 = 配方需要的材料(比如面粉、鸡蛋、糖)
  • 返回值 = 做好的成品(比如蛋糕、咖啡)
  • 调用函数 = 按照配方做东西
graph LR A[调用函数<br/>sayHello<br/>'张三'] --> B[输入参数<br/>'张三'] B --> C[执行函数体<br/>public static void<br/>sayHello<br/>System.out.println<br/>'你好, ' + name + '!'] C --> D[输出结果<br/>'你好, 张三!'] style A fill:#e1f5ff style B fill:#fff4e1 style C fill:#e8f5e9 style D fill:#fce4ec

📝 函数的组成部分#

public static int add(int a, int b) {
return a + b;
}
部分说明示例
修饰符访问权限和特性public static
返回类型函数返回的数据类型int(整数)
函数名函数的名字add
参数列表函数需要的输入(int a, int b)
函数体实际执行的代码{ return a + b; }

🎯 为什么要用函数?#

  • 🔄 复用:避免重复写相同的代码
  • 📦 封装:把复杂的功能包装起来,简化使用
  • 🔧 维护:修改函数内部,不影响调用它的地方
  • 📖 可读:给函数起个好名字,代码更易读
public class Main {
// 定义方法
public static void sayHello(String name) {
System.out.println("你好," + name + "!");
}
// 带返回值的方法
public static int add(int a, int b) {
return a + b;
}
// 主方法(程序入口)
public static void main(String[] args) {
sayHello("张三"); // 输出:你好,张三!
int result = add(10, 20);
System.out.println(result); // 输出:30
}
}

4.4 条件判断#

🎯 什么是条件判断?#

条件判断就是让程序”根据不同情况做不同决定”的能力。

💡 生活比喻

  • 条件判断 = 生活中的”如果…就…”
  • 例如:“如果下雨,就带伞;如果不下雨,就不带伞”
graph TD A[age >= 18?] -->|是| B[成年人] A -->|否| C[未成年人] style A fill:#e1f5ff style B fill:#e8f5e9 style C fill:#fff4e1

📋 常见应用场景#

场景条件判断示例
🎂 年龄判断是否成年if (age >= 18)
🎓 成绩评级分数等级if (score >= 90)
🔐 登录验证密码是否正确if (password.equals(input))
🛒 购物折扣金额是否达标if (total >= 100)
🌤️ 天气提醒是否下雨if (isRaining)
int age = 18;
// if-else 语句
if (age >= 18) {
System.out.println("成年人");
} else {
System.out.println("未成年人");
}
// if-else if-else 语句
int score = 85;
if (score >= 90) {
System.out.println("优秀");
} else if (score >= 80) {
System.out.println("良好");
} else if (score >= 60) {
System.out.println("及格");
} else {
System.out.println("不及格");
}
// 三元运算符
String status = age >= 18 ? "成年人" : "未成年人";
System.out.println(status);
// switch 语句
int day = 3;
switch (day) {
case 1:
System.out.println("星期一");
break;
case 2:
System.out.println("星期二");
break;
case 3:
System.out.println("星期三");
break;
default:
System.out.println("其他");
}

4.5 循环#

🎯 什么是循环?#

循环就是让程序”重复执行某段代码”的能力。

💡 生活比喻

  • 循环 = 重复做同一件事
  • 例如:“绕操场跑 5 圈”、“数 1 到 100”
graph LR A[i = 0] --> B[输出 0] B --> C[i = 1] C --> D[输出 1] D --> E[i = 2] E --> F[输出 2] F --> G[i = 3] G --> H[输出 3] H --> I[i = 4] I --> J[输出 4] J --> K[i = 5] K --> L[条件不满足<br/>结束循环] style L fill:#fff4e1 style J fill:#e8f5e9

🔄 三种循环的区别#

循环类型适用场景特点
for 循环知道循环次数最常用,结构清晰
while 循环不知道循环次数先判断,后执行
do-while 循环至少执行一次先执行,后判断

📋 常见应用场景#

场景循环示例
🔢 数数字数 1 到 100
📋 遍历数组处理列表中的每个元素
🎮 游戏循环每一帧都刷新画面
📊 数据处理处理数据库中的每条记录
🔁 重试机制失败后重试 N 次
// for 循环
for (int i = 0; i < 5; i++) {
System.out.println(i);
}
// 增强型 for 循环(遍历数组)
String[] fruits = {"苹果", "香蕉", "橙子"};
for (String fruit : fruits) {
System.out.println(fruit);
}
// while 循环
int count = 0;
while (count < 5) {
System.out.println(count);
count++;
}
// do-while 循环(至少执行一次)
int i = 0;
do {
System.out.println(i);
i++;
} while (i < 5);

4.6 字符串操作#

🎯 什么是字符串?#

字符串就是一串字符,也就是我们常说的”文字”。

💡 生活比喻

  • 字符串 = 一串珍珠项链
  • 每个字符 = 一颗珍珠
  • 字符串操作 = 对项链的整理(拼接、截取、替换等)
graph LR A[字符串操作] --> B[拼接<br/>'姓名' + name + ', 年龄' + age] B --> C[结果<br/>'姓名: 张三, 年龄: 25'] A --> D[大写<br/>'hello'.toUpperCase] D --> E[结果<br/>'HELLO'] A --> F[截取<br/>'Hello, World!'.substring0, 5] F --> G[结果<br/>'Hello'] style A fill:#e1f5ff style C fill:#e8f5e9 style E fill:#e8f5e9 style G fill:#e8f5e9

📝 常用字符串方法速查表#

方法作用示例结果
length()获取长度"Hello".length()5
toUpperCase()转大写"hello".toUpperCase()"HELLO"
toLowerCase()转小写"HELLO".toLowerCase()"hello"
substring()截取子串"Hello".substring(0, 3)"Hel"
contains()是否包含"Hello".contains("ell")true
replace()替换"Hello".replace("l", "L")"HeLLo"
split()分割"a,b,c".split(",")["a", "b", "c"]
trim()去除首尾空格" hello ".trim()"hello"

🎯 常见应用场景#

场景示例
👤 用户输入验证检查用户名长度、格式
📧 邮箱处理提取邮箱的用户名和域名
🔍 搜索功能检查文本是否包含关键词
📊 数据格式化将数据格式化为可读字符串
🌐 URL 处理解析和构建 URL 地址
String name = "张三";
int age = 25;
// 字符串拼接
String message = "姓名:" + name + ",年龄:" + age;
System.out.println(message); // 输出:姓名:张三,年龄:25
// 使用 String.format(推荐)
String message2 = String.format("姓名:%s,年龄:%d", name, age);
System.out.println(message2);
// 字符串方法
String text = "Hello, World!";
System.out.println(text.length()); // 13
System.out.println(text.toUpperCase()); // HELLO, WORLD!
System.out.println(text.toLowerCase()); // hello, world!
System.out.println(text.substring(0, 5)); // Hello
System.out.println(text.contains("World")); // true
System.out.println(text.replace("World", "Java")); // Hello, Java!

第五步:安装 Java 库#

🎯 什么是库(Library)?#

就是别人写好的、可以直接使用的代码集合。

💡 生活比喻

  • 库 = 工具箱或预制件
  • 使用库 = 不用自己造轮子,直接用现成的工具
  • Maven/Gradle = 库的”快递员”,帮你下载和管理库
graph TD A[使用库的好处] --> B[不使用库] A --> C[使用库] B --> D[自己写 HTTP 请求代码] D --> E[耗时, 容易出错] C --> F[导入 OkHttp 库] F --> G[直接调用, 简单可靠] G --> H[节省时间 + 提高质量 + 减少错误] style A fill:#e1f5ff style E fill:#fff4e1 style H fill:#e8f5e9

📦 常用的 Java 库#

库名用途类比
OkHttp发送 HTTP 请求📡 电话(和网络通信)
Gson处理 JSON 数据📝 翻译官(JSON ↔ Java 对象)
SLF4J日志记录📓 日记本(记录程序运行信息)
Apache Commons常用工具集🧰 万能工具箱(字符串、日期等)
JUnit单元测试✅ 质检员(检查代码是否正确)

Java 使用 MavenGradle 来管理依赖库。

5.1 使用 Maven#

Maven 是 Java 最流行的项目管理和构建工具。

创建 Maven 项目#

Terminal window
# 使用 Maven 创建项目
mvn archetype:generate -DgroupId=com.example -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
# 进入项目目录
cd my-app

添加依赖#

编辑 pom.xml 文件:

<dependencies>
<!-- HTTP 请求库 -->
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.12.0</version>
</dependency>
<!-- JSON 处理库 -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version>
</dependency>
</dependencies>

下载依赖#

Terminal window
# 下载依赖到本地仓库
mvn dependency:resolve
# 编译项目
mvn compile
# 运行项目
mvn exec:java -Dexec.mainClass="com.example.App"

5.2 使用 Gradle#

Gradle 是另一种流行的构建工具,语法更简洁。

创建 Gradle 项目#

Terminal window
# 创建目录
mkdir my-app
cd my-app
# 初始化 Gradle 项目
gradle init --type java-application

添加依赖#

编辑 build.gradle 文件:

dependencies {
// HTTP 请求库
implementation 'com.squareup.okhttp3:okhttp:4.12.0'
// JSON 处理库
implementation 'com.google.code.gson:gson:2.10.1'
}

下载依赖#

Terminal window
# 下载依赖
gradle build
# 运行项目
gradle run

第六步:编写第一个 Java 程序#

  1. 创建一个新的 Java 文件

    • 打开 VS Code
    • 点击”文件” > “新建文件”
    • 保存为HelloWorld.java
  2. 编写代码

public class HelloWorld {
public static void main(String[] args) {
// 我的第一个 Java 程序
System.out.println("Hello, World!");
System.out.println("你好,世界!");
// 定义变量
String name = "张三";
int age = 25;
// 打印变量
System.out.println("姓名:" + name);
System.out.println("年龄:" + age);
// 调用方法
greet("李四");
}
// 定义方法
public static void greet(String name) {
System.out.println("你好," + name + "!");
}
}
  1. 编译和运行程序
    • 打开命令行(终端)
    • 进入文件所在目录
    • 编译:javac HelloWorld.java
    • 运行:java HelloWorld

第七步:理解 HTTP 请求#

🎯 什么是 HTTP 请求?#

HTTP 请求就是您的程序向服务器发送”请求”,告诉服务器您需要什么服务。

💡 生活比喻

  • HTTP 请求 = 点外卖
  • 你的程序 = 点餐的顾客
  • 服务器 = 餐厅
  • HTTP 请求 = 点餐单(告诉餐厅你要什么)
  • HTTP 响应 = 外卖(餐厅送来的食物)
graph LR A[你的程序<br/>顾客] -->|请求| B[服务器<br/>餐厅] B -->|响应| A style A fill:#e1f5ff style B fill:#e8f5e9

📋 HTTP 请求的组成#

就像点餐单需要包含餐厅信息一样,HTTP 请求也有固定的格式:

部分作用点餐类比
请求方法要做什么动作点餐、取消、修改
请求路径要访问的资源菜品名称
请求头额外的信息你的地址、电话
请求体实际的数据菜品的特殊要求

HTTP 请求的组成#

POST /api/chat HTTP/1.1
Host: api.example.com
Content-Type: application/json
Authorization: Bearer sk-xxxxx
{
"message": "你好"
}

解释:

  • POST:请求方法(GET、POST、PUT、DELETE 等)
  • /api/chat:请求的路径
  • Host:服务器地址
  • Content-Type:内容类型(表示发送的是 JSON 数据)
  • Authorization:认证信息(API Key)
  • {...}:请求体(实际发送的数据)

使用 Java 发送 HTTP 请求#

方法 1:使用内置的 HttpURLConnection#

import java.io.*;
import java.net.*;
public class HttpExample {
public static void main(String[] args) {
try {
URL url = new URL("https://api.example.com/api/chat");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
// 设置请求方法
conn.setRequestMethod("POST");
// 设置请求头
conn.setRequestProperty("Content-Type", "application/json");
conn.setRequestProperty("Authorization", "Bearer sk-xxxxx");
// 启用输出
conn.setDoOutput(true);
// 发送请求体
String jsonInputString = "{\"message\": \"你好\"}";
try (OutputStream os = conn.getOutputStream()) {
byte[] input = jsonInputString.getBytes("utf-8");
os.write(input, 0, input.length);
}
// 读取响应
try (BufferedReader br = new BufferedReader(
new InputStreamReader(conn.getInputStream(), "utf-8"))) {
StringBuilder response = new StringBuilder();
String responseLine;
while ((responseLine = br.readLine()) != null) {
response.append(responseLine.trim());
}
System.out.println(response.toString());
}
} catch (Exception e) {
System.err.println("请求失败:" + e.getMessage());
}
}
}

方法 2:使用 OkHttp(推荐)#

import okhttp3.*;
import java.io.IOException;
public class OkHttpExample {
public static void main(String[] args) {
OkHttpClient client = new OkHttpClient();
// 创建 JSON 请求体
MediaType JSON = MediaType.get("application/json; charset=utf-8");
String json = "{\"message\": \"你好\"}";
RequestBody body = RequestBody.create(json, JSON);
// 创建请求
Request request = new Request.Builder()
.url("https://api.example.com/api/chat")
.post(body)
.addHeader("Content-Type", "application/json")
.addHeader("Authorization", "Bearer sk-xxxxx")
.build();
// 发送请求
try (Response response = client.newCall(request).execute()) {
if (response.isSuccessful()) {
System.out.println(response.body().string());
} else {
System.err.println("请求失败:" + response.code());
}
} catch (IOException e) {
System.err.println("请求失败:" + e.getMessage());
}
}
}

第八步:理解 JSON 格式#

🎯 什么是 JSON?#

JSON(JavaScript Object Notation)是一种数据格式,就像一个”表格”或”清单”,用来组织信息。

💡 生活比喻

  • JSON = 一个结构化的表格或清单
  • 键(Key)= 表格的列名(姓名、年龄、城市)
  • 值(Value)= 表格中的数据(张三、25、北京)
graph TD A[JSON 结构] --> B["name: 张三<br/>键: 值"] A --> C["age: 25<br/>键: 值"] A --> D["city: 北京<br/>键: 值"] A --> E["hobbies: 数组"] E --> F["读书<br/>数组元素"] E --> G["游泳<br/>数组元素"] E --> H["编程<br/>数组元素"] style A fill:#e1f5ff style B fill:#fff4e1 style C fill:#fff4e1 style D fill:#fff4e1 style E fill:#e8f5e9 style F fill:#fce4ec style G fill:#fce4ec style H fill:#fce4ec

📊 JSON vs 其他格式#

格式优点缺点适用场景
JSON轻量、易读、跨语言不支持注释API 数据交换
XML结构严谨、支持注释冗长、复杂配置文件
CSV简单、Excel 可读不支持嵌套表格数据
YAML简洁、易读缩进敏感配置文件

🔧 为什么选择 JSON?#

  • 轻量:文件小,传输快
  • 易读:人类可读,调试方便
  • 跨语言:所有编程语言都支持
  • 结构化:支持嵌套,表达能力强
  • 标准:Web API 的标准格式

JSON 示例#

{
"name": "张三",
"age": 25,
"city": "北京",
"hobbies": ["读书", "游泳", "编程"],
"address": {
"street": "长安街",
"number": 1
}
}

在 Java 中使用 JSON#

使用 Gson 库#

import com.google.gson.*;
public class JsonExample {
public static void main(String[] args) {
Gson gson = new Gson();
// 将 Java 对象转换为 JSON 字符串
Person person = new Person("张三", 25);
String jsonString = gson.toJson(person);
System.out.println(jsonString);
// 输出:{"name":"张三","age":25}
// 将 JSON 字符串转换为 Java 对象
String json = "{\"name\":\"张三\",\"age\":25}";
Person person2 = gson.fromJson(json, Person.class);
System.out.println(person2.getName()); // 输出:张三
}
}
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// Getter 方法
public String getName() {
return name;
}
public int getAge() {
return age;
}
}

第九步:异常处理基础#

WARNING

异常处理是编写健壮 Java 程序的关键。特别是处理文件操作、网络请求、用户输入等可能失败的操作时,必须添加异常处理。不要忽略异常,至少要记录错误信息。Java 的异常处理机制比其他语言更严格,强制处理检查型异常。

🎯 什么是异常?#

异常就是程序运行时遇到的”意外情况”或”错误”。

💡 生活比喻

  • 异常 = 生活中的意外(比如突然下雨、堵车)
  • 异常处理 = 应对意外的预案(带伞、改路线)
  • 没有异常处理 = 遇到意外就崩溃(淋湿、迟到)
  • 有异常处理 = 遇到意外能优雅处理(打伞、换路)
graph LR A[正常执行] -->|如果出错| B[捕获错误] B --> C[处理错误] C --> D[程序不会崩溃<br/>优雅地继续运行] style A fill:#e1f5ff style B fill:#fff4e1 style C fill:#e8f5e9 style D fill:#e8f5e9

🚨 常见的异常类型#

异常类型原因生活类比解决方法
NullPointerException对象为 null使用空盒子检查是否为 null
ArrayIndexOutOfBoundsException数组索引越界找第 11 个苹果(只有 10 个)检查索引范围
ArithmeticException算术错误(除以零)除以零检查除数
NumberFormatException数字格式错误把”abc”当数字验证输入格式
FileNotFoundException文件不存在找不到文件检查文件路径

9.1 try-catch 语句#

// 捕获特定异常
try {
int result = 10 / 0;
System.out.println(result);
} catch (ArithmeticException e) {
System.err.println("错误:不能除以零!");
System.err.println("异常信息:" + e.getMessage());
}
// 捕获多个异常
try {
int[] numbers = {1, 2, 3};
System.out.println(numbers[10]); // 数组索引越界
} catch (ArrayIndexOutOfBoundsException e) {
System.err.println("错误:数组索引越界!");
} catch (Exception e) {
System.err.println("其他错误:" + e.getMessage());
}

9.2 finally 块#

finally 块中的代码无论是否发生异常都会执行:

try {
// 可能会出错的代码
FileReader file = new FileReader("data.txt");
// 读取文件...
} catch (FileNotFoundException e) {
System.err.println("文件不存在:" + e.getMessage());
} finally {
System.out.println("finally 块总是会执行");
}

9.3 抛出异常#

// 使用 throws 声明方法可能抛出异常
public static void readFile(String filename) throws IOException {
FileReader file = new FileReader(filename);
// 读取文件...
}
// 使用 throw 手动抛出异常
public static int divide(int a, int b) {
if (b == 0) {
throw new ArithmeticException("不能除以零");
}
return a / b;
}

9.4 实际应用:处理 HTTP 请求错误#

import okhttp3.*;
import java.io.IOException;
public class HttpWithErrorHandling {
public static void main(String[] args) {
OkHttpClient client = new OkHttpClient();
try {
Request request = new Request.Builder()
.url("https://api.example.com/data")
.build();
Response response = client.newCall(request).execute();
if (!response.isSuccessful()) {
throw new IOException("HTTP 错误:" + response.code());
}
String responseData = response.body().string();
System.out.println(responseData);
} catch (IOException e) {
System.err.println("请求失败:" + e.getMessage());
}
}
}

第十步:调试技巧#

🎯 什么是调试?#

调试就是找出和修复代码错误的过程。

💡 生活比喻

  • 调试 = 找东西或修东西
  • Bug = 丢失的物品或坏掉的零件
  • 调试过程 = 一步步排查,找到问题并修复
graph LR A[发现问题<br/>程序报错<br/>功能异常] --> B[分析原因<br/>阅读错误<br/>查看代码] B --> C[定位位置<br/>使用工具<br/>打印日志] C --> D[修复<br/>验证修复<br/>重新运行] style A fill:#e1f5ff style B fill:#fff4e1 style C fill:#e8f5e9 style D fill:#e8f5e9

🔍 调试的三种方法#

方法难度适用场景类比
打印日志⭐ 简单快速定位问题在关键位置放标记
断点调试⭐⭐ 中等复杂逻辑问题暂停程序,一步步看
单元测试⭐⭐⭐ 困难长期维护自动化检查

10.1 使用 System.out.println#

最简单的调试方法:

public class DebugExample {
public static void main(String[] args) {
int a = 10;
int b = 20;
System.out.println("输入:a=" + a + ", b=" + b); // 调试输出
int result = calculate(a, b);
System.out.println("结果:" + result); // 调试输出
}
public static int calculate(int a, int b) {
System.out.println("计算中..."); // 调试输出
return a + b;
}
}

10.2 常见错误类型#

错误类型说明示例
NullPointerException空指针异常对象为 null 时调用方法
ArrayIndexOutOfBoundsException数组索引越界访问不存在的数组索引
ArithmeticException算术异常除以零
NumberFormatException数字格式错误将字符串转换为数字时失败
ClassCastException类型转换异常将对象转换为不兼容的类型

10.3 VS Code 调试功能#

VS Code 提供了强大的调试功能:

  1. 设置断点:在代码行号左侧点击,出现红点
  2. 启动调试:按 F5 或点击调试按钮
  3. 单步执行:使用 F10(单步跳过)或 F11(单步进入)
  4. 查看变量:在调试面板中查看变量的值

10.4 阅读错误信息#

错误信息通常包含:

Exception in thread "main" java.lang.ArithmeticException: / by zero
at Main.main(Main.java:5)
  • 第 1 行:异常类型和描述
  • 第 2 行:出错的位置(类名、方法名、文件名、行号)

10.5 调试技巧#

  1. 缩小范围:注释掉部分代码,确定错误位置
  2. 打印中间结果:在关键位置打印变量值
  3. 检查空指针:使用 if (object != null) 检查
  4. 使用 IDE 的调试器:设置断点,逐步执行

第十一步:代码规范#

TIP

良好的代码规范可以让代码更易读、易维护,也能减少错误。Java 有官方代码风格指南(Java Code Conventions),建议遵循。可以使用 IDE 的自动格式化功能和代码检查工具(如 Checkstyle)保持代码质量。

良好的代码规范可以让代码更易读、易维护。

11.1 命名规范#

类型规范示例
类名大驼峰(PascalCase)User, ProductManager
方法名小驼峰(camelCase)getUser(), calculateTotal()
变量名小驼峰(camelCase)userName, totalPrice
常量名大写字母和下划线MAX_SIZE, API_KEY
包名小写字母com.example.myapp

11.2 注释规范#

// 单行注释:解释这行代码的作用
String name = "张三";
/**
* 多行注释:
* 用于解释复杂的功能或逻辑
*
* @param name 用户名
* @return 问候语
*/
public static String greet(String name) {
return "你好," + name + "!";
}
// JavaDoc 注释(用于生成文档)
/**
* 计算两个数的和
*
* @param a 第一个数
* @param b 第二个数
* @return 两个数的和
* @throws ArithmeticException 如果发生算术错误
*/
public static int add(int a, int b) throws ArithmeticException {
return a + b;
}

11.3 代码格式化#

使用 IDE 的自动格式化功能:

  • VS CodeShift + Alt + F
  • IntelliJ IDEACtrl + Alt + L

11.4 使用 Checkstyle#

Checkstyle 是一个 Java 代码检查工具:

pom.xml
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-checkstyle-plugin</artifactId>
<version>3.3.0</version>
</plugin>

运行检查:

Terminal window
mvn checkstyle:check

第十二步:面向对象基础#

[!IMPORTANT] 重要 面向对象编程是 Java 的核心特性,掌握面向对象思想是成为 Java 开发者的必备技能。理解类、对象、继承、封装和多态这些概念,能帮助你编写更清晰、更易维护的代码。不要跳过这一步!

🎯 什么是面向对象?#

面向对象(Object-Oriented Programming,OOP)是一种编程思想,把现实世界的事物抽象成”对象”。

💡 生活比喻

  • 面向对象 = 用”积木”搭建东西
  • 类 = 积木的图纸(定义积木的样子)
  • 对象 = 按图纸做出来的积木(实际的东西)
  • 属性 = 积木的特征(颜色、大小)
  • 方法 = 积木的功能(可以做什么)
graph LR A[现实世界] --> B[抽象] B --> C[类] C --> D[创建] D --> E[对象] E --> F["狗狗 → Dog 类 → new Dog → 旺财"] E --> G["猫咪 → Cat 类 → new Cat → 咪咪"] E --> H["人 → Person 类 → new Person → 张三"] style A fill:#e1f5ff style B fill:#fff4e1 style C fill:#e8f5e9 style D fill:#fce4ec style E fill:#f3e5f5

🎯 面向对象的三大特性#

特性说明生活类比
封装隐藏内部细节,只暴露必要的接口手机(你不知道内部电路,只会用按键)
继承子类继承父类的属性和方法儿子继承父亲的特征
多态同一个方法在不同对象上有不同表现同样的”吃饭”动作,人和狗的方式不同

12.1 类和对象#

// 定义类
public class Person {
// 属性(字段)
private String name;
private int age;
// 构造方法
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// Getter 方法
public String getName() {
return name;
}
public int getAge() {
return age;
}
// Setter 方法
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
// 方法
public void introduce() {
System.out.println("我是 " + name + ",今年 " + age + " 岁");
}
}
// 使用类
public class Main {
public static void main(String[] args) {
// 创建对象
Person person = new Person("张三", 25);
// 调用方法
person.introduce(); // 输出:我是 张三,今年 25 岁
// 访问属性
System.out.println(person.getName()); // 输出:张三
}
}

12.2 继承#

// 父类
public class Animal {
protected String name;
public Animal(String name) {
this.name = name;
}
public void eat() {
System.out.println(name + " 在吃东西");
}
}
// 子类
public class Dog extends Animal {
private String breed;
public Dog(String name, String breed) {
super(name);
this.breed = breed;
}
// 重写父类方法
@Override
public void eat() {
System.out.println(name + "(" + breed + ")在吃狗粮");
}
// 新增方法
public void bark() {
System.out.println(name + " 在汪汪叫");
}
}
// 使用继承
public class Main {
public static void main(String[] args) {
Dog dog = new Dog("旺财", "拉布拉多");
dog.eat(); // 输出:旺财(拉布拉多)在吃狗粮
dog.bark(); // 输出:旺财 在汪汪叫
}
}

12.3 接口#

// 定义接口
public interface Flyable {
void fly();
}
// 实现接口
public class Bird implements Flyable {
private String name;
public Bird(String name) {
this.name = name;
}
@Override
public void fly() {
System.out.println(name + " 在飞翔");
}
}
// 使用接口
public class Main {
public static void main(String[] args) {
Bird bird = new Bird("小鸟");
bird.fly(); // 输出:小鸟 在飞翔
}
}

第十三步:实战练习#

通过实际练习来巩固所学知识。

练习 1:计算器#

编写一个简单的计算器,支持加减乘除:

public class Calculator {
/**
* 简单计算器
*
* @param a 第一个数字
* @param b 第二个数字
* @param operator 运算符(+、-、*、/)
* @return 计算结果
*/
public static double calculate(double a, double b, char operator) {
switch (operator) {
case '+':
return a + b;
case '-':
return a - b;
case '*':
return a * b;
case '/':
if (b == 0) {
throw new ArithmeticException("不能除以零");
}
return a / b;
default:
throw new IllegalArgumentException("不支持的运算符:" + operator);
}
}
public static void main(String[] args) {
// 测试
System.out.println(calculate(10, 5, '+')); // 输出:15.0
System.out.println(calculate(10, 5, '/')); // 输出:2.0
try {
System.out.println(calculate(10, 0, '/'));
} catch (ArithmeticException e) {
System.err.println(e.getMessage()); // 输出:不能除以零
}
}
}

练习 2:学生成绩管理#

创建一个学生成绩管理系统:

import java.util.HashMap;
import java.util.Map;
public class StudentManager {
private Map<String, Map<String, Integer>> students;
public StudentManager() {
students = new HashMap<>();
// 添加初始数据
addStudent("张三", Map.of("语文", 85, "数学", 90, "英语", 88));
addStudent("李四", Map.of("语文", 78, "数学", 95, "英语", 82));
addStudent("王五", Map.of("语文", 92, "数学", 88, "英语", 90));
}
public void addStudent(String name, Map<String, Integer> scores) {
students.put(name, scores);
}
public double calculateAverage(Map<String, Integer> scores) {
return scores.values().stream()
.mapToInt(Integer::intValue)
.average()
.orElse(0.0);
}
public String getStudentInfo(String name) {
if (students.containsKey(name)) {
Map<String, Integer> scores = students.get(name);
double average = calculateAverage(scores);
return String.format("%s 的成绩:%s,平均分:%.2f",
name, scores, average);
} else {
return "错误:找不到学生 " + name;
}
}
public static void main(String[] args) {
StudentManager manager = new StudentManager();
System.out.println(manager.getStudentInfo("张三"));
System.out.println(manager.getStudentInfo("赵六"));
}
}

练习 3:简单的 API 调用#

调用公开的 API 获取数据:

import okhttp3.*;
import java.io.IOException;
public class WeatherAPI {
private static final String API_KEY = "your-api-key";
private static final String BASE_URL = "https://api.openweathermap.org/data/2.5/weather";
public static String getWeather(String city) {
OkHttpClient client = new OkHttpClient();
String url = String.format("%s?q=%s&appid=%s&units=metric&lang=zh_cn",
BASE_URL, city, API_KEY);
Request request = new Request.Builder()
.url(url)
.build();
try (Response response = client.newCall(request).execute()) {
if (response.isSuccessful()) {
return response.body().string();
} else {
return "获取天气失败:HTTP " + response.code();
}
} catch (IOException e) {
return "获取天气失败:" + e.getMessage();
}
}
public static void main(String[] args) {
String weather = getWeather("北京");
System.out.println(weather);
}
}

练习 4:JSON 数据处理#

处理 JSON 格式的数据:

import com.google.gson.*;
public class JsonParser {
public static void parseUserData(String jsonString) {
try {
JsonObject data = JsonParser.parseString(jsonString).getAsJsonObject();
if (data.get("status").getAsString().equals("success")) {
JsonObject result = data.getAsJsonObject("data");
JsonArray users = result.getAsJsonArray("users");
System.out.println("共有 " + result.get("total").getAsInt() + " 个用户:");
for (JsonElement user : users) {
JsonObject userObj = user.getAsJsonObject();
int id = userObj.get("id").getAsInt();
String name = userObj.get("name").getAsString();
String email = userObj.get("email").getAsString();
System.out.printf(" - ID: %d, 姓名: %s, 邮箱: %s%n", id, name, email);
}
} else {
System.out.println("API 返回失败");
}
} catch (JsonSyntaxException e) {
System.err.println("JSON 格式错误:" + e.getMessage());
} catch (Exception e) {
System.err.println("解析失败:" + e.getMessage());
}
}
public static void main(String[] args) {
String apiResponse = """
{
"status": "success",
"data": {
"users": [
{"id": 1, "name": "张三", "email": "zhangsan@example.com"},
{"id": 2, "name": "李四", "email": "lisi@example.com"},
{"id": 3, "name": "王五", "email": "wangwu@example.com"}
],
"total": 3
}
}
""";
parseUserData(apiResponse);
}
}

第十四步:文件操作基础#

WARNING

文件操作是编程中非常常用的功能,但也容易出错。务必使用 try-with-resources 语句来自动关闭文件资源,防止资源泄漏。在读取或写入文件时,务必添加异常处理,防止程序因文件不存在或权限问题而崩溃。

文件操作是编程中非常常用的功能,比如读取配置文件、保存数据等。

14.1 读取文件#

import java.io.*;
import java.nio.file.*;
public class FileReadExample {
public static void main(String[] args) {
// 方法 1:使用 BufferedReader(推荐)
try (BufferedReader reader = Files.newBufferedReader(Paths.get("data.txt"))) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
System.err.println("读取文件失败:" + e.getMessage());
}
// 方法 2:一次性读取所有内容
try {
String content = Files.readString(Paths.get("data.txt"));
System.out.println(content);
} catch (IOException e) {
System.err.println("读取文件失败:" + e.getMessage());
}
}
}

14.2 写入文件#

import java.io.*;
import java.nio.file.*;
import java.util.List;
public class FileWriteExample {
public static void main(String[] args) {
// 写入文本
try {
Files.writeString(Paths.get("output.txt"), "Hello, World!\n你好,世界!");
System.out.println("文件写入成功");
} catch (IOException e) {
System.err.println("写入文件失败:" + e.getMessage());
}
// 追加内容
try {
Files.writeString(Paths.get("output.txt"), "\n这是追加的内容",
StandardOpenOption.APPEND);
} catch (IOException e) {
System.err.println("追加内容失败:" + e.getMessage());
}
// 写入多行
List<String> lines = List.of("第一行", "第二行", "第三行");
try {
Files.write(Paths.get("output.txt"), lines);
} catch (IOException e) {
System.err.println("写入文件失败:" + e.getMessage());
}
}
}

14.3 JSON 文件操作#

import com.google.gson.*;
import java.io.*;
import java.nio.file.*;
public class JsonFileExample {
public static void main(String[] args) {
// 写入 JSON 文件
Person person = new Person("张三", 25);
Gson gson = new GsonBuilder().setPrettyPrinting().create();
try {
String json = gson.toJson(person);
Files.writeString(Paths.get("person.json"), json);
System.out.println("JSON 文件写入成功");
} catch (IOException e) {
System.err.println("写入 JSON 文件失败:" + e.getMessage());
}
// 读取 JSON 文件
try {
String json = Files.readString(Paths.get("person.json"));
Person person2 = gson.fromJson(json, Person.class);
System.out.println("姓名:" + person2.getName());
System.out.println("年龄:" + person2.getAge());
} catch (IOException e) {
System.err.println("读取 JSON 文件失败:" + e.getMessage());
}
}
}
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}

14.4 实战:保存 API 响应#

import okhttp3.*;
import java.io.IOException;
import java.nio.file.*;
public class SaveApiResponse {
public static void fetchAndSaveData(String url, String filename) {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url(url)
.build();
try (Response response = client.newCall(request).execute()) {
if (response.isSuccessful()) {
String responseData = response.body().string();
Files.writeString(Paths.get(filename), responseData);
System.out.println("数据已保存到 " + filename);
} else {
System.err.println("请求失败:HTTP " + response.code());
}
} catch (IOException e) {
System.err.println("操作失败:" + e.getMessage());
}
}
public static void main(String[] args) {
fetchAndSaveData("https://api.example.com/data", "response.json");
}
}

第十五步:集合框架#

🎯 什么是集合?#

集合就是用来存储多个数据的容器。

💡 生活比喻

  • 集合 = 各种容器
  • List = 购物清单(有序、可重复)
  • Set = 名字册(无序、不重复)
  • Map = 电话簿(键值对)
graph TD A[Java 集合框架] --> B[List<br/>列表<br/>有序可重复] A --> C[Set<br/>集合<br/>无序不重复] A --> D[Map<br/>映射<br/>键值对存储] B --> E[ArrayList] B --> F[LinkedList] C --> G[HashSet] C --> H[TreeSet] D --> I[HashMap] D --> J[TreeMap] style A fill:#e1f5ff style B fill:#fff4e1 style C fill:#e8f5e9 style D fill:#fce4ec style E fill:#fff3e0 style F fill:#fff3e0 style G fill:#fff3e0 style H fill:#fff3e0 style I fill:#fff3e0 style J fill:#fff3e0

📋 三种集合的区别#

集合类型特点允许重复有序生活类比
List列表✅ 是✅ 是购物清单
Set集合❌ 否❌ 否名字册
Map映射键不重复⚠️ 视实现电话簿

🎯 什么时候用哪个集合?#

场景推荐集合原因
存储有序数据,需要按索引访问ArrayList性能好,支持随机访问
频繁在头部/尾部插入删除LinkedList插入删除快
存储不重复的数据HashSet自动去重
需要排序的数据TreeSet自动排序
键值对存储HashMap查找快
需要按键排序TreeMap自动按键排序

15.1 List(列表)#

import java.util.*;
public class ListExample {
public static void main(String[] args) {
// ArrayList(动态数组)
List<String> fruits = new ArrayList<>();
fruits.add("苹果");
fruits.add("香蕉");
fruits.add("橙子");
System.out.println(fruits); // [苹果, 香蕉, 橙子]
System.out.println(fruits.get(0)); // 苹果
System.out.println(fruits.size()); // 3
// 遍历列表
for (String fruit : fruits) {
System.out.println(fruit);
}
// LinkedList(链表)
List<Integer> numbers = new LinkedList<>();
numbers.add(1);
numbers.add(2);
numbers.add(3);
// 常用操作
fruits.remove(0); // 删除第一个元素
fruits.contains("香蕉"); // true
fruits.isEmpty(); // false
}
}

15.2 Map(映射)#

import java.util.*;
public class MapExample {
public static void main(String[] args) {
// HashMap(哈希表)
Map<String, Integer> scores = new HashMap<>();
scores.put("张三", 85);
scores.put("李四", 90);
scores.put("王五", 88);
System.out.println(scores); // {张三=85, 李四=90, 王五=88}
System.out.println(scores.get("张三")); // 85
System.out.println(scores.containsKey("李四")); // true
// 遍历 Map
for (Map.Entry<String, Integer> entry : scores.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
// TreeMap(有序映射)
Map<String, Integer> sortedScores = new TreeMap<>(scores);
System.out.println(sortedScores); // 按键排序
}
}

15.3 Set(集合)#

import java.util.*;
public class SetExample {
public static void main(String[] args) {
// HashSet(不重复元素)
Set<String> uniqueNames = new HashSet<>();
uniqueNames.add("张三");
uniqueNames.add("李四");
uniqueNames.add("张三"); // 重复元素不会被添加
System.out.println(uniqueNames); // [张三, 李四]
System.out.println(uniqueNames.size()); // 2
// TreeSet(有序集合)
Set<Integer> numbers = new TreeSet<>();
numbers.add(5);
numbers.add(2);
numbers.add(8);
numbers.add(1);
System.out.println(numbers); // [1, 2, 5, 8](自动排序)
}
}

15.4 Stream API(流式处理)#

import java.util.*;
import java.util.stream.*;
public class StreamExample {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
// 过滤偶数
List<Integer> evens = numbers.stream()
.filter(n -> n % 2 == 0)
.collect(Collectors.toList());
System.out.println(evens); // [2, 4, 6, 8, 10]
// 映射(转换)
List<Integer> squared = numbers.stream()
.map(n -> n * n)
.collect(Collectors.toList());
System.out.println(squared); // [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
// 求和
int sum = numbers.stream()
.reduce(0, Integer::sum);
System.out.println(sum); // 55
// 查找最大值
Optional<Integer> max = numbers.stream()
.max(Integer::compare);
System.out.println(max.orElse(0)); // 10
}
}

第十六步:Java 特性与技巧#

Java 有很多强大的特性和技巧,可以让代码更简洁高效。

16.1 Lambda 表达式#

import java.util.*;
import java.util.function.*;
public class LambdaExample {
public static void main(String[] args) {
// 传统方式
List<String> names = Arrays.asList("张三", "李四", "王五");
Collections.sort(names, new Comparator<String>() {
@Override
public int compare(String a, String b) {
return a.compareTo(b);
}
});
// 使用 Lambda 表达式
List<String> names2 = Arrays.asList("张三", "李四", "王五");
Collections.sort(names2, (a, b) -> a.compareTo(b));
// 更简洁的方式(方法引用)
Collections.sort(names2, String::compareTo);
// Lambda 表达式作为参数
Runnable runnable = () -> System.out.println("Hello, Lambda!");
runnable.run();
// Predicate(谓词)
Predicate<Integer> isEven = n -> n % 2 == 0;
System.out.println(isEven.test(4)); // true
System.out.println(isEven.test(3)); // false
}
}

16.2 Optional 类#

Optional 类用于避免 NullPointerException

import java.util.*;
public class OptionalExample {
public static void main(String[] args) {
// 创建 Optional
Optional<String> optional1 = Optional.of("Hello");
Optional<String> optional2 = Optional.empty();
Optional<String> optional3 = Optional.ofNullable(null);
// 检查值是否存在
if (optional1.isPresent()) {
System.out.println(optional1.get()); // Hello
}
// 提供默认值
System.out.println(optional2.orElse("默认值")); // 默认值
// 链式操作
String result = optional1
.map(String::toUpperCase)
.orElse("默认值");
System.out.println(result); // HELLO
}
}

16.3 日期时间 API(Java 8+)#

import java.time.*;
import java.time.format.*;
public class DateTimeExample {
public static void main(String[] args) {
// 获取当前日期和时间
LocalDate today = LocalDate.now();
LocalTime now = LocalTime.now();
LocalDateTime current = LocalDateTime.now();
System.out.println(today); // 2024-01-13
System.out.println(now); // 14:30:00
System.out.println(current); // 2024-01-13T14:30:00
// 创建特定日期
LocalDate birthday = LocalDate.of(2000, 1, 1);
System.out.println(birthday); // 2000-01-01
// 日期计算
LocalDate nextWeek = today.plusWeeks(1);
LocalDate nextMonth = today.plusMonths(1);
// 日期格式化
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String formatted = current.format(formatter);
System.out.println(formatted); // 2024-01-13 14:30:00
// 解析日期
LocalDate parsed = LocalDate.parse("2024-01-13");
System.out.println(parsed); // 2024-01-13
}
}

16.4 枚举(Enum)#

public enum Day {
MONDAY("星期一", 1),
TUESDAY("星期二", 2),
WEDNESDAY("星期三", 3),
THURSDAY("星期四", 4),
FRIDAY("星期五", 5),
SATURDAY("星期六", 6),
SUNDAY("星期日", 7);
private final String chineseName;
private final int dayNumber;
Day(String chineseName, int dayNumber) {
this.chineseName = chineseName;
this.dayNumber = dayNumber;
}
public String getChineseName() {
return chineseName;
}
public int getDayNumber() {
return dayNumber;
}
}
// 使用枚举
public class EnumExample {
public static void main(String[] args) {
Day today = Day.MONDAY;
System.out.println(today.getChineseName()); // 星期一
System.out.println(today.getDayNumber()); // 1
// 遍历所有枚举值
for (Day day : Day.values()) {
System.out.println(day.getChineseName());
}
}
}

16.5 记录类(Record,Java 14+)#

记录类是用于创建不可变数据类的简洁方式:

// 定义记录类
public record Person(String name, int age) {}
// 使用记录类
public class RecordExample {
public static void main(String[] args) {
Person person = new Person("张三", 25);
System.out.println(person.name()); // 张三
System.out.println(person.age()); // 25
System.out.println(person); // Person[name=张三, age=25]
// 记录类自动实现了 equals(), hashCode(), toString()
Person person2 = new Person("张三", 25);
System.out.println(person.equals(person2)); // true
}
}

第十七步:Maven 包管理#

Maven 是 Java 最流行的项目管理和构建工具。

17.1 项目结构#

标准的 Maven 项目结构:

my-project/
├── pom.xml
└── src/
├── main/
│ ├── java/
│ │ └── com/example/
│ │ └── App.java
│ └── resources/
└── test/
├── java/
└── resources/

17.2 pom.xml 配置#

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0">
<modelVersion>4.0.0</modelVersion>
<!-- 项目信息 -->
<groupId>com.example</groupId>
<artifactId>my-project</artifactId>
<version>1.0.0</version>
<packaging>jar</packaging>
<!-- 属性 -->
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<!-- 依赖 -->
<dependencies>
<!-- HTTP 请求库 -->
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.12.0</version>
</dependency>
<!-- JSON 处理库 -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version>
</dependency>
<!-- 测试框架 -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.10.0</version>
<scope>test</scope>
</dependency>
</dependencies>
<!-- 构建 -->
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version>
<configuration>
<source>17</source>
<target>17</target>
</configuration>
</plugin>
</plugins>
</build>
</project>

17.3 常用 Maven 命令#

Terminal window
# 创建项目
mvn archetype:generate -DgroupId=com.example -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart
# 编译项目
mvn compile
# 运行测试
mvn test
# 打包项目
mvn package
# 清理项目
mvn clean
# 安装到本地仓库
mvn install
# 跳过测试
mvn package -DskipTests
# 查看依赖树
mvn dependency:tree
# 运行主类
mvn exec:java -Dexec.mainClass="com.example.App"

17.4 常用依赖#

<!-- HTTP 请求 -->
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.12.0</version>
</dependency>
<!-- JSON 处理 -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version>
</dependency>
<!-- 日志 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>2.0.9</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.4.11</version>
</dependency>
<!-- Apache Commons 工具 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.14.0</version>
</dependency>

第十八步:学习路径建议#

TIP

学习编程是一个循序渐进的过程,不要急于求成。建议按照本指南的顺序学习,每学完一个章节都要动手练习,巩固所学知识。遇到问题不要怕,多查阅文档和搜索解决方案。Java 的学习曲线相对较陡,但掌握基础后会有很大收获。

🗺️ 完整学习路线图#

graph TD A[Java 学习路线] --> B[第一阶段<br/>基础入门<br/>2-3 周] A --> C[第二阶段<br/>核心概念<br/>2-3 周] A --> D[第三阶段<br/>进阶实践<br/>3-4 周] A --> E[第四阶段<br/>深入学习<br/>持续] B --> B1[环境搭建] B --> B2[基础语法<br/>变量, 数据类型, 函数] B --> B3[控制流<br/>条件判断, 循环] B --> B4[数组和字符串] C --> C1[面向对象<br/>类, 对象, 继承] C --> C2[集合框架<br/>List, Map, Set] C --> C3[异常处理] C --> C4[文件操作] D --> D1[HTTP 请求] D --> D2[JSON 处理] D --> D3[Lambda 表达式] D --> D4[Stream API] D --> D5[实战项目] E --> E1[多线程] E --> E2[设计模式] E --> E3[框架学习<br/>Spring Boot] E --> E4[项目实战] style A fill:#e1f5ff style B fill:#c8e6c9 style C fill:#fff9c4 style D fill:#ffccbc style E fill:#f8bbd0 style B1 fill:#e8f5e9 style B2 fill:#e8f5e9 style B3 fill:#e8f5e9 style B4 fill:#e8f5e9 style C1 fill:#fffde7 style C2 fill:#fffde7 style C3 fill:#fffde7 style C4 fill:#fffde7 style D1 fill:#fbe9e7 style D2 fill:#fbe9e7 style D3 fill:#fbe9e7 style D4 fill:#fbe9e7 style D5 fill:#fbe9e7 style E1 fill:#fce4ec style E2 fill:#fce4ec style E3 fill:#fce4ec style E4 fill:#fce4ec

📅 每日学习建议#

时间段学习内容时长
🌅 早上学习新概念(看书/看视频)1 小时
☀️ 下午动手写代码(练习/项目)1-2 小时
🌙 晚上复习总结(笔记/博客)30 分钟

如果您是零基础,建议按照以下顺序学习:

第一周:环境搭建和基础语法#

  • 安装 Java JDK
  • 安装 VS Code 或 IntelliJ IDEA
  • 学习变量和数据类型
  • 学习控制流(条件判断、循环)
  • 学习数组

第二周:面向对象和集合#

  • 学习类和对象
  • 学习继承和多态
  • 学习接口
  • 学习集合框架(List、Map、Set)

第三周:实践练习#

  • 编写第一个 Java 程序
  • 练习文件操作
  • 练习 HTTP 请求
  • 练习 JSON 处理
  • 完成实战练习

第十九步:学习资源推荐#

免费学习资源#

  1. Oracle Java 官方教程

  2. Java 编程思想

    • 经典书籍,适合深入学习
  3. 菜鸟教程

  4. B 站视频教程

    • 搜索”Java 零基础入门”
    • 推荐 UP 主:尚硅谷、黑马程序员

练习平台#

  1. LeetCode(刷题)

  2. 牛客网

  3. Codecademy

在线 IDE#

  1. Replit

  2. JDoodle


第二十步:常见问题#

NOTE

以下是学习过程中常见的问题和解答。如果您有其他问题,可以在技术社区搜索或提问,通常都能找到答案。记住,遇到问题是学习过程中的正常现象,不要放弃!Java 的学习曲线相对较陡,但一旦掌握基础,后续学习会越来越轻松。

Q1: 我完全不懂编程,能学会吗?#

A: 当然可以!Java 的语法清晰规范,适合初学者学习编程思维。只要按照本指南的步骤,每天花 1-2 小时学习,2-3 周就能掌握基础知识。

Q2: 学习编程需要多久?#

A:

  • 基础语法:2-3 周
  • 能够进行网络请求:3-4 周
  • 独立开发应用:2-4 个月

Q3: Java 和 Python 有什么区别?#

A:

  • 语法:Python 更简洁,Java 更严谨
  • 类型:Java 是强类型,Python 是动态类型
  • 性能:Java 性能更好(JIT 优化)
  • 应用:Java 更适合企业级应用,Python 更适合数据分析和 AI

Q4: 遇到问题怎么办?#

A:

  1. 先尝试自己搜索(Google、百度)
  2. 查看官方文档
  3. 在技术社区提问(CSDN、知乎、Stack Overflow)
  4. 加入 Java 学习群

Q5: 必须学会编程才能使用 API 吗?#

A: 不一定!很多 API 都提供了 cURL 命令示例,您可以直接在命令行中使用。但如果想开发实际应用,学习编程是必要的。

Q6: Java 适合用来做什么?#

A: Java 的应用领域非常广泛:

  • 企业级应用:使用 Spring Boot 等框架
  • Android 开发:移动应用开发
  • 大数据处理:使用 Hadoop、Spark
  • 后端开发:Web 服务器和 API
  • 桌面应用:使用 JavaFX

第二十一步:小贴士#

TIP

编程是一个需要持续学习和实践的过程。保持耐心和毅力,每天进步一点点,长期积累会有很大收获。遇到困难时,不要放弃,多尝试不同的解决方法。Java 的学习曲线相对较陡,但一旦掌握基础,后续学习会越来越轻松。

💡 学习建议#

  • 📚 多动手:编程是实践性很强的技能,多写代码才能掌握
  • 🔄 多练习:遇到问题不要怕,多尝试不同的解决方案
  • 💬 多交流:加入学习群,和其他学习者交流经验
  • 🎯 定目标:设定小目标,逐步完成,建立信心
  • 📝 做笔记:记录重要的知识点和遇到的问题
  • 🔍 多搜索:遇到问题先自己搜索,培养解决问题的能力
  • 🌟 保持好奇心:多问”为什么”,理解原理比记忆语法更重要

⚠️ 注意事项#

  • 不要急于求成,循序渐进地学习
  • 遇到错误不要慌,仔细查看错误信息
  • 养成良好的代码习惯(注释、命名、格式化)
  • 使用 IDE 的自动格式化和检查功能
  • 理解面向对象概念,这是 Java 的核心
  • 不要死记硬背,理解概念更重要
  • 不要害怕犯错,错误是学习的一部分

🎯 小白专属建议#

📖 如何快速入门?#

  1. 先跑通一个程序:不要纠结细节,先让代码跑起来
  2. 边学边做:学完一个概念就马上练习
  3. 从简单开始:先做简单的练习,再逐步增加难度
  4. 多看别人的代码:学习优秀的代码风格和思路

🚀 遇到困难怎么办?#

困难解决方法
看不懂代码逐行分析,画流程图
程序报错复制错误信息搜索,查看错误行号
不知道怎么写先用中文描述逻辑,再翻译成代码
概念不理解找生活中的类比,多看不同解释
进度慢了放慢节奏,巩固基础,不要急躁

💪 如何保持学习动力?#

  • 🎯 设定明确的目标(比如”本周学会写一个计算器”)
  • 📊 记录学习进度(每天学了什么,完成了什么)
  • 🏆 给自己小奖励(完成一个目标就奖励自己)
  • 👥 找学习伙伴(互相监督,一起进步)
  • 📝 写学习笔记或博客(分享知识,加深理解)

🌟 学习小技巧#

技巧说明
费曼学习法尝试用简单的语言给别人讲清楚概念
番茄工作法学习 25 分钟,休息 5 分钟
间隔重复定期复习旧知识,避免遗忘
项目驱动做一个小项目,在实践中学习
教是最好的学把学到的知识分享给别人

第二十二步:下一步#

完成本指南的学习后,您可以:

  1. 🎯 完成教程中的实践练习,巩固所学知识
  2. 💻 尝试开发自己的第一个 Java 应用
  3. 📚 继续深入学习 Java 的高级特性(泛型、反射、并发等)
  4. 🌐 学习 Spring Boot 等 Web 框架
  5. 🚀 开始使用各种 API 构建实际应用

📚 推荐进阶学习资源#

资源类型适合人群
《Java 编程思想》书籍想深入理解 Java
《Effective Java》书籍想写出高质量代码
Spring Boot 官方文档文档想开发 Web 应用
LeetCode 刷题练习想提升算法能力
GitHub 开源项目实践想学习项目经验

🌟 学习 Java 的好处#

完成 Java 学习后,你将获得:

  • 编程思维:学会用逻辑思维解决问题
  • 就业机会:Java 开发岗位需求量大
  • 跨领域能力:可以开发 Android 应用、Web 应用、大数据处理等
  • 持续成长:编程技能可以不断提升,越老越值钱
  • 创造能力:可以把想法变成实际的产品

🎉 恭喜你!#

如果你已经读到这里,恭喜你已经迈出了学习 Java 的第一步!👏

🌈 给你的鼓励#

“编程不是天才的专利,而是普通人通过努力可以掌握的技能。”

“每一个程序员都是从”Hello World”开始的,你并不孤单。”

“学习编程就像爬山,开始可能很累,但越往上走,风景越美。”

💪 你已经学会了:#

  • ✅ Java 的基本概念和安装
  • ✅ 变量、数据类型、函数
  • ✅ 条件判断、循环
  • ✅ 面向对象基础
  • ✅ 集合框架
  • ✅ HTTP 请求和 JSON 处理
  • ✅ 异常处理和调试技巧

🚀 接下来的路还很长,但不要害怕:#

  • 🌟 每一行代码都是进步
  • 🌟 每一个错误都是学习的机会
  • 🌟 每一个项目都是成长的见证

📞 需要帮助?#

记住,你不是一个人在战斗:

  • 💬 加入 Java 学习群,和其他学习者交流
  • 🔍 遇到问题就搜索,互联网是最好的老师
  • 📖 多看官方文档和优秀教程
  • 🤝 不要害怕提问,没有人会嘲笑初学者

最后,送给你一句话:

“种一棵树最好的时间是十年前,其次是现在。”

开始学习 Java 的最好时间就是现在!💪

祝你在编程的道路上越走越远,成为一名优秀的程序员! 🎊🎉


第二十三步:进阶主题学习路径#

本指南涵盖了 Java 的基础知识,但要成为一名优秀的 Java 开发者,还需要掌握以下进阶主题。这些主题将在后续的教程中详细讲解。

🎯 进阶主题清单#

序号主题学习资源
1泛型Java 官方教程 - 泛型
廖雪峰 - 泛型
2反射Java 官方教程 - 反射
菜鸟教程 - 反射
3注解Java 官方教程 - 注解
廖雪峰 - 注解
4多线程并发Java 官方教程 - 并发
廖雪峰 - 多线程
5网络编程Java 官方教程 - 网络
菜鸟教程 - 网络编程
6数据库操作(JDBC)Java 官方教程 - JDBC
菜鸟教程 - JDBC
7设计模式设计模式教程
菜鸟教程 - 设计模式
8JVM 原理深入理解 JVM
JVM 官方文档
9Spring 框架基础Spring 官方文档
Spring Boot 官方文档

📚 主题说明#

1. 泛型#

泛型是 Java 5 引入的重要特性,允许在编译时进行类型检查,提高代码的类型安全性和可读性。

学习要点:

  • 泛型类和泛型方法
  • 类型参数和类型通配符(?)
  • 泛型限定(extends, super)
  • 类型擦除机制

实际应用:

  • 集合框架的类型安全使用
  • 工具类的泛型设计
  • API 接口的泛型参数

推荐资源:

2. 反射#

反射是 Java 的动态特性,允许程序在运行时检查和修改类、方法、字段等信息。

学习要点:

  • Class 对象的获取
  • 反射获取构造器、方法、字段
  • 动态调用方法和访问字段
  • 反射的性能考虑

实际应用:

  • 框架开发(Spring、MyBatis 等)
  • 注解处理器
  • 动态代理
  • 序列化和反序列化

推荐资源:

3. 注解#

注解是 Java 5 引入的元数据机制,用于在代码中添加信息,可以被编译器或运行时环境读取。

学习要点:

  • 内置注解(@Override, @Deprecated 等)
  • 自定义注解
  • 元注解(@Target, @Retention 等)
  • 注解处理器

实际应用:

  • 框架配置(@Component, @Service 等)
  • 代码生成(Lombok)
  • 单元测试(@Test)
  • 文档生成(JavaDoc)

推荐资源:

4. 多线程并发#

多线程和并发编程是 Java 的重要特性,用于提高程序性能和响应速度。

学习要点:

  • 线程的创建和管理
  • 线程同步(synchronized, Lock)
  • 线程通信(wait, notify)
  • 并发工具类(Executor, Future, CountDownLatch 等)
  • 线程池

实际应用:

  • 提高程序性能
  • 异步任务处理
  • 高并发系统开发
  • 后台任务调度

推荐资源:

5. 网络编程#

网络编程让 Java 程序能够通过网络进行通信,是开发分布式应用的基础。

学习要点:

  • Socket 编程
  • TCP 和 UDP 协议
  • HTTP 客户端和服务器
  • NIO(非阻塞 I/O)

实际应用:

  • 开发网络应用
  • 实现即时通讯
  • 分布式系统开发
  • 微服务通信

推荐资源:

6. 数据库操作(JDBC)#

JDBC(Java Database Connectivity)是 Java 访问数据库的标准 API。

学习要点:

  • JDBC 驱动和连接
  • Statement 和 PreparedStatement
  • ResultSet 处理
  • 事务管理
  • 连接池(Druid, HikariCP)

实际应用:

  • 数据持久化
  • 数据库操作
  • 企业级应用开发
  • 数据分析和报表

推荐资源:

7. 设计模式#

设计模式是解决常见软件设计问题的最佳实践,是编写高质量代码的重要工具。

学习要点:

  • 创建型模式(单例、工厂、建造者等)
  • 结构型模式(适配器、装饰器、代理等)
  • 行为型模式(观察者、策略、模板方法等)
  • 设计原则(SOLID)

实际应用:

  • 提高代码质量
  • 增强代码可维护性
  • 解决复杂设计问题
  • 与他人协作开发

推荐资源:

8. JVM 原理#

理解 JVM(Java 虚拟机)的工作原理有助于编写更高效、更稳定的 Java 程序。

学习要点:

  • JVM 内存模型(堆、栈、方法区等)
  • 垃圾回收机制
  • 类加载机制
  • 性能调优

实际应用:

  • 内存泄漏排查
  • 性能优化
  • 系统稳定性提升
  • 故障诊断

推荐资源:

  • 《深入理解 Java 虚拟机》
  • JVM 官方文档
  • 《Java 性能优化权威指南》

9. Spring 框架基础#

Spring 是 Java 企业级开发的事实标准,掌握 Spring 是成为 Java 后端开发工程师的必备技能。

学习要点:

  • IOC(控制反转)和 DI(依赖注入)
  • AOP(面向切面编程)
  • Spring MVC
  • Spring Boot 快速开发
  • Spring Data 数据访问

实际应用:

  • 企业级应用开发
  • Web 应用开发
  • 微服务架构
  • RESTful API 开发

推荐资源:

📝 学习建议#

  1. 循序渐进:按顺序学习每个主题,不要急于求成
  2. 理论结合实践:每个主题都要动手编写代码练习
  3. 阅读官方文档:官方文档是最权威的学习资源
  4. 参考优秀教程:结合廖雪峰、菜鸟教程等优质教程学习
  5. 记录学习笔记:整理关键知识点和代码示例
  6. 做项目实践:将学到的知识应用到实际项目中

🎯 下一步行动#

完成本指南后,建议按照以下顺序学习进阶主题:

  1. 第一优先级:泛型、反射、注解
  2. 第二优先级:多线程并发、网络编程
  3. 第三优先级:数据库操作、设计模式
  4. 第四优先级:JVM 原理、Spring 框架基础

每个主题预计学习时间:1-3 周

💡 学习路线图#

graph TD A[Java 进阶学习] --> B[第一阶段<br/>类型系统增强<br/>2-3 周] A --> C[第二阶段<br/>并发与网络<br/>3-4 周] A --> D[第三阶段<br/>数据与设计<br/>3-4 周] A --> E[第四阶段<br/>框架与性能<br/>持续] B --> B1[泛型] B --> B2[反射] B --> B3[注解] C --> C1[多线程并发] C --> C2[网络编程] D --> D1[数据库操作] D --> D2[设计模式] E --> E1[JVM 原理] E --> E2[Spring 框架] style A fill:#e1f5ff style B fill:#c8e6c9 style C fill:#fff9c4 style D fill:#ffccbc style E fill:#f8bbd0 style B1 fill:#e8f5e9 style B2 fill:#e8f5e9 style B3 fill:#e8f5e9 style C1 fill:#fffde7 style C2 fill:#fffde7 style D1 fill:#fbe9e7 style D2 fill:#fbe9e7 style E1 fill:#fce4ec style E2 fill:#fce4ec

祝您学习顺利!🎉

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

针对 Java 的零基础编程入门指南
https://blog.mizhoubaobei.top/posts/java/beginner-guide-to-java/
作者
祁筱欣
发布于
2026-01-13
许可协议
CC BY 4.0

评论区

目录