Java 基础
概述
Java 用途
Java 是用于开发应用程序的编程语言
Android 应用开发Java 是 Android 平台开发的主要语言之一 : 许多我们日常使用的手机 App 。 如 Spotify , Signal 等 、 都是使用 Java 构建的 , 。
企业级后端开发这是 Java 最重要的应用场景 : 凭借其稳定性 。 安全性和高并发处理能力 、 Java 成为企业级服务端开发的首选 , 大量的银行 。 金融交易系统 、 大型电商网站 、 如 Twitter ( 、 的后台都> 是由 Java 驱动的 ) 。
大数据处理Java 是许多大数据技术生态的核心语言 : 例如 Hadoop 和 Spark 等框架都是用 Java 编写的 , 广泛用于处理和分析海量数据 , 。
桌面应用程序Java 可以开发跨平台的桌面软件 : 著名的集成开发环境 。 IDE ( 如 IntelliJ IDEA 和 Eclipse 本身就是用 Java 开发的桌面应用 ) 。
游戏开发Java 也被用于游戏开发 : 最著名的例子就是风靡全球的沙盒游戏 , 我的世界 《 》 Minecraft ( ) 。
嵌入式系统与物联网 (IoT)得益于其跨平台和稳定性Java 还被应用于智能电视 , 车载系统 、 工业控制设备等嵌入式和物联网领域 、 。
Java 历史
🌱 起源: 从“ Oak” 到“ Java” (1991-1994)
Java 的故事始于 1991 年
- 最初目标
由詹姆斯·高斯林 : James Gosling ( 等人领导的团队 ) 旨在为下一代智能消费电子产品 , 如机顶盒 ( 交互式电视 、 开发一种新的编程语言 ) 。 - 命名
Oak “ ” Gosling 将这门新语言命名为 : Oak “ ” 橡树 ( ) 灵感来自他办公室窗外的一棵树 , 然而 。 由于硬件厂商接受度低 , 该项目在消费电子市场遭遇失败 , 。 - 关键转折
1994 年 : 互联网 , Web ( 开始兴起 ) 团队敏锐地意识到 。 Oak 语言所具备的安全性 , 网络移动性和跨平台特性 、 完美契合了互联网 , 网络即计算机 “ 的愿景 ” 。 - 正式更名
由于 : Oak “ 已被注册为商标 ” 团队选择了 , Java “ 作为新名字 ” 灵感来自印度尼西亚的爪哇咖啡 , 。
🚀 爆发: 互联网时代的宠儿 (1995-1999)
1995 年是 Java 历史上最重要的一年
- 正式发布
1995 年 5 月 23 日 : Sun Microsystems 在 SunWorld 大会上正式发布 Java 1.0 , 并提出了著名的口号 , Write Once, Run Anywhere “ (WORA) ” 即 , 一次编写 “ 到处运行 , ” 。 - 引爆互联网
Java 的跨平台特性解决了当时软件开发的最大痛点 : Netscape Navigator 浏览器迅速集成 Java 技术 。 使得 Java Applet , 小程序 ( 成为当时网页上实现动态交互的最热门技术 ) 。
随后的几年是 Java 标准化和壮大的关键期
- 1996年
JDK 1.0 正式发布 : 标志着 Java 进入主流开发视野 , 。 - 1997年
JDK 1.1 引入了 JDBC : 数据库连接 ( ) RMI 、 远程方法调用 ( 和内部类等特性 ) 完善了语言基础设施 , 。 - 1998年
JDK 1.2 是一个里程碑版本 : 它被重命名为 , Java 2 “ ” 并首次将 Java 平台划分为三个版本 , 这一战略奠定了 Java 随后二十年的发展格局 , : - J2SE (Java 2 Standard Edition)
面向桌面和工作站的通用开发 : 。 - J2EE (Java 2 Enterprise Edition)
面向服务器端企业级应用 : 包含 EJB , Servlet 、 JSP 等规范 、 。 - J2ME (Java 2 Micro Edition)
面向移动设备 : 如功能手机 ( 和嵌入式系统 ) 。
🏛️ 统治: 企业级开发的霸主 (2000-2009)
进入 21 世纪
- 企业首选
尽管早期的 EJB 因配置繁琐而备受诟病 : 但 Java 凭借其稳定性 , 安全性和庞大的类库 、 成为了银行 , 电信和电商等核心系统的首选语言 、 。 - 语法革命 (Java 5)
2004 年发布的 JDK 5.0 是一次巨大的升级 : 引入了泛型 , 注解 、 枚举 、 自动装箱等特性 、 极大地提升了代码的简洁性和类型安全 , 。 - 开源化 (Java 6)
2006 年 : Sun 公司宣布将 Java 技术作为免费软件对外发布 , 此举极大地推动了 Java 社区的繁荣 , 。 - 巨头更迭 (2009)
甲骨文公司 : Oracle ( 宣布收购 Sun 公司 ) Java 的归属权随之转入 Oracle 麾下 , 。
🏎️ 进化: 云原生时代的重生 (2010-至今)
在 Oracle 的推动下
- 里程碑式的 Java 8
2014 年发布的 Java 8 至今仍是影响最深远的版本之一 : 它引入的 Lambda 表达式和 Stream API 让 Java 拥有了函数式编程能力 。 彻底改变了开发者的编码方式15 , 。 - 模块化与新节奏 (Java 9)
2017 年发布的 Java 9 引入了模块化系统 : Project Jigsaw ( ) 并开启了 , 每6个月发布一个新版本 “ 每2年发布一个长期支持版本 , LTS ( ) 的新节奏25 ” 。 - 拥抱云原生 (Java 21)
2023 年发布的 JDK 21 标志着 Java 迈入了协程时代 : 核心特性虚拟线程 。 Virtual Threads ( 让开发者能够轻松创建百万级线程 ) 极大地提升了高并发场景下的性能 , 为云原生应用开发注入了强大动力5 , 。
Java 特点
⭐⭐ 核心优势
跨平台性 (Write Once, Run Anywhere)
这是 Java 最显著的特征Java 代码在编译后不会生成特定操作系统的机器码 。 而是生成一种中间代码——字节码 , 这些字节码可以在任何安装了 Java 虚拟机 的硬件设备上运行 。 JVM 负责将字节码解释或编译成对应平台的机器码 。 从而实现了 , 一次编写 “ 到处运行 , 的愿景 ” 极大地提升了软件的可移植性 , 。
面向对象 (OOP)
Java 是一门纯粹的面向对象编程语言它完全基于 。 类 “ 和 ” 对象 “ 的概念来组织代码 ” 并支持封装 , 继承 、 多态等核心特性 、 这种编程范式使得代码更易于理解 。 复用和维护 、 特别适合开发大型复杂系统 , 。
简单易学
Java 的语法设计去除了 C++ 中复杂且容易出错的特性例如指针 , 多重继承和 、 goto语句同时 。 它采用了自动垃圾回收机制来管理内存 , 减轻了程序员的负担 , 这使得 Java 语言相对简洁 。 对于初学者来说非常友好 , 。
⭐⭐ 稳健与安全
健壮性
Java 通过多种机制来保证程序的稳定运行 : :
- 强类型检查
在编译和运行时都会进行严格的类型检查 : 提前暴露错误 , 。 - 异常处理
提供了完善的 : try-catch-finally机制来捕获和处理运行时错误防止程序意外崩溃 , 。 - 自动内存管理
通过垃圾回收器自动回收不再使用的对象 : 有效避免了内存泄漏和悬空指针等问题 , 。
安全性
Java 被设计用于网络和分布式环境 : 其安全性是内置的 , :
- 沙箱机制
JVM 为代码提供了一个受限的运行环境 : 限制其对本地系统资源 , 如文件 ( 网络 、 的访问权限 ) 防止恶意代码破坏系统 , 。 - 字节码验证
在加载类文件时 : 会进行严格的校验 , 确保代码不会执行非法操作 , 。
⭐⭐ 高性能与并发
高性能
虽然早期 Java 因解释执行而性能受限但现代 JVM 引入了 即时编译 技术 , JIT 会将频繁执行的 。 热点代码 “ 编译成本地机器码 ” 使其运行性能接近 C/C++ 等编译型语言 , 。
多线程支持
Java 在语言层面原生支持多线程编程开发者可以方便地创建和管理多个线程 。 以实现并发执行任务 , 这对于开发高并发的服务器端应用和响应迅速的图形界面程序至关重要 。 。
⭐⭐ 生态与扩展
分布式
Java 从诞生之初就具备网络基因内置了丰富的网络库 , 如 ( java.net和java.rmi) 使得开发分布式应用 , 如 Web 服务 ( 远程调用 、 变得非常简单 ) 。
动态性
Java 能够在运行时动态地加载类获取类信息并调用方法 、 这一特性主要通过反射机制实现 , 它是许多框架 。 如 Spring ( 实现依赖注入 ) 面向切面编程等功能的基础 、 极大地增强了程序的灵活性 , 。
Java 运行机制
Java 的运行机制是其能够实现
简单来说
⭐⭐ 核心组件: JDK、 JRE 与 JVM
JDK (Java Development Kit)
是 Java 的开发工具包 : 包含了编译器 ( , javac)调试器等开发工具 、 开发者使用 JDK 将源代码编译成字节码 。 。
JRE (Java Runtime Environment)是 Java 的运行时环境 : 包含了 JVM 和核心类库 , 普通用户只需安装 JRE 即可运行 Java 程序 。 。
JVM (Java Virtual Machine)是 Java 虚拟机 : 是整个运行机制的核心 , 它是一个虚拟的计算机 。 负责加载字节码 , 并将其转换为特定平台的机器码来执行 , 。
⭐⭐ 阶段一: 编译( 从源码到字节码)
这是 Java 程序运行的第一步
- 输入
开发者编写的 : .java源代码文件。 - 工具
使用 JDK 中的 : javac编译器。 - 过程
: javac编译器对源代码进行语法分析语义分析和字节码生成 、 。 - 输出
生成与平台无关的 : .class字节码文件此时的字节码并不是任何特定硬件的机器码 。 而是一种 JVM 能够理解的中间指令集 , 。
⭐⭐ 阶段二: 加载( 类加载器的职责)
当你在命令行执行 java HelloWorld 时
- 加载
类加载器负责从文件系统或网络中找到 : HelloWorld.class文件并将其二进制字节流读入内存 , 。 - 链接
:
- 验证
确保字节码是合法且安全的 : 符合 JVM 规范 , 防止恶意代码破坏系统 , 。 - 准备
为类的静态变量分配内存 : 并设置其初始默认值 , 如 ( 0、 null) 。 - 解析
将常量池内的符号引用 : 如类名 ( 方法名 、 替换为直接引用 ) 内存地址 ( ) 。 - 初始化
执行类构造器 : <clinit>()方法为类的静态变量赋予代码中指定的初始值 , 并执行静态代码块 , 。
⭐⭐ 阶段三: 执行( 执行引擎的魔法)
类加载完成后main 方法中的字节码
混合执行模式
- 解释执行 (Interpreter)
- 方式
像同声传译一样 : 逐条读取字节码 , 将其翻译成当前平台的机器码并执行 , 。 - 优点
启动速度快 : 无需等待编译 , 。 - 缺点
运行效率较低 : 因为同一段代码每次执行都需要翻译 , 。 - 即时编译 (JIT - Just-In-Time Compiler)
- 方式
JVM 会监控程序运行 : 当发现某个方法或代码块被频繁调用 , 称为 ( 热点代码 “ ” 时 ) JIT 编译器会将其整个编译成本地机器码 , 并缓存起来 , 。 - 优点
后续调用该热点代码时 : 直接执行高效的机器码 , 运行速度极快 , 接近 C/C++ , 。 - 缺点
编译过程会消耗 CPU 和内存资源 : 且首次执行时有延迟 , 。
总结
Java 程序启动时 : 解释器优先执行 , 保证快速响应 , 在运行过程中 ; JIT 编译器不断优化热点代码 , 提升系统吞吐量 , 这种 。 解释器与编译器并存 “ 的策略 ” 是 Java 性能卓越的关键 , 。
⭐⭐ 内存管理: 自动垃圾回收
在整个执行过程中
JVM 的运行时数据区负责管理内存 , 其中最核心的机制之一是垃圾回收 。 JVM 会自动追踪对象的引用情况 。 当发现某些对象不再被任何引用指向时 , 垃圾回收器会自动回收其占用的内存 , 极大地减轻了开发者手动管理内存的负担和出错风险 , 。
安装运行
安装配置
JAVA 8 安装详解https://blog.csdn.net/suzengxin/article/details/115401549
运行程序
⭐⭐ 第一步: 开发程序
1 | public class Hello { |
⭐⭐ 第二步: 编译程序
1 | javac Hello.java |
⭐⭐ 第三步: 运行程序
1 | java Hello |
转义字符
| 转义字符 | 描述 |
|---|---|
\t |
制表符 |
\n |
换行符 |
\r |
回车 |
\" |
双引号 |
\' |
单引号 |
\\ |
反斜杠 |
代码注释
单行注释
1 | // 单行注释 |
多行注释
1 | /* |
文档注释
1 | /** |
⭐⭐ 生成 Java 文档
1 | javadoc -d D:\\javadoc -author -version Hello.java |
⭐⭐ 标准标签
| 标签名 | 用途说明 | 适用对象 |
|---|---|---|
@author |
指明类或接口的作者 | 包 |
@version |
指定类或接口的版本信息 | 包 |
@param |
描述方法或构造函数的参数名称和含义 | 方法 |
@return |
描述方法的返回值 | 方法 |
@throws |
描述方法可能抛出的异常 | 方法 |
@exception |
与 @throws 功能相同 |
方法 |
@see |
提供指向其他类 |
全局(类 |
@since |
指明该特性从哪个版本 |
全局 |
@deprecated |
标记该 API 已过时 |
全局 |
@serial |
用于序列化字段的文档说明 | 字段 (Field) |
@serialData |
描述通过 `writeObject` 或 `writeExternal` 写入的数据 | 方法 (通常为 writeObject) |
@serialField |
描述 `ObjectStreamField` 组件 | 字段 |
⭐⭐ 内联标签
这些标签用 {} 包裹
| 标签名 | 用途说明 |
|---|---|
{@link} |
内联插入一个指向其他类或成员的链接@see 但可嵌入文本 |
{@linkplain} |
与 {@link} 类似 |
{@value} |
显示静态字段 |
{@code} |
将文本显示为代码样式 |
{@literal} |
显示文本而不进行任何转义 |
{@inheritDoc} |
从直接父类或实现的接口中继承文档注释 |
{@docRoot} |
指明生成的文档根目录的路径 |
⭐⭐ 不常用标签
| 标签名 | 用途说明 |
|---|---|
@category |
(非标准 |
@index |
(Java 8+) 强制将标识符添加到索引中 |
@apiNote |
(Java 8+) 提供关于 API 使用的额外说明 |
@implSpec |
(Java 8+) 提供实现者需要遵守的规范说明 |
@implNote |
(Java 8+) 提供关于实现的非规范性说明 |
数据类型
在 Java 中
数据类型用于定义变量或常量可以存储的数据种类以及占用内存的大小 : Java 是强类型语言 。 每一个变量都必须先声明类型才能使用 , 。
变量变量是程序运行过程中值可以发生改变的数据存储单元 : 你可以把它想象成一个贴了标签的盒子 。 盒子的大小由数据类型决定 , 里面的内容 , 值 ( 可以根据需要更换 ) 。
常量常量是程序运行过程中值不能发生改变的数据 : 使用 。 final关键字修饰的变量一旦赋值 。 就不能再修改 , 。
类型描述
| 类型 | 关键字 | 字节/位数 | 取值范围 | 默认值 | 描述 |
|---|---|---|---|---|---|
| 整数型 | byte |
1字节 / 8位 | -128 到 127 | 0 | 最小的整数类型 |
short |
2字节 / 16位 | -32768 到 32767 | 0 | 较少使用 |
|
int |
4字节 / 32位 | -2³¹ 到 2³¹-1 | 0 | 最常用的整数类型 |
|
long |
8字节 / 64位 | -2⁶³ 到 2⁶³-1 | 0L | 用于存储非常大的数值 |
|
| 浮点型 | float |
4字节 / 32位 | 约 ±3.4028235E+38 | 0.0F | 单精度浮点数 |
double |
8字节 / 64位 | 约 ±1.7976931348623157E+308 | 0.0D | 双精度浮点数 |
|
| 字符型 | char |
2字节 (16位) | 0 到 65535 (\u0000 到 \uffff) | \u0000 | 使用单引号 '' 表示 |
| 布尔型 | boolean |
1 位 | 1 字节 | true (真) 或 false (假) | false | 常用于条件判断和循环控制 |
类型转换
⭐⭐ 自动类型转换( 隐式转换)
这是 Java 编译器自动完成的转换
转换规则
byte → short → int → long → float → double
char → int → long → float → double
1 | // 1. 赋值时的自动转换 |
⭐⭐ 强制类型转换( 显式转换)
这是程序员明确指示编译器进行的转换
精度丢失
数据溢出
1 |
|
二进制
计算机中的数据存储
各个进制之间相互转换
原码
运算符
Java运算符是用于对变量和值进行操作的符号
算术运算符
算术运算符用于执行基本的数学运算
| 运算符 | 名称 | 示例 | 描述 |
|---|---|---|---|
+ |
加法 | a + b |
相加两个操作数 |
- |
减法 | a - b |
从第一个操作数中减去第二个操作数 |
* |
乘法 | a * b |
相乘两个操作数 |
/ |
除法 | a / b |
分子除以分母 |
% |
取模 | ++a 或 a++ |
返回除法的余数 |
++ |
自增 | ++a 或 a++ |
操作数的值增加1 |
-- |
自减 | --a 或 a-- |
操作数的值减少1 |
⭐⭐ 示例代码
1 | public class ArithmeticOperators { |
关系运算符
关系运算符用于比较两个值
| 运算符 | 名称 | 示例 | 描述 |
|---|---|---|---|
== |
等于 | a == b |
检查两个操作数的值是否相等 |
!= |
不等于 | a != b |
检查两个操作数的值是否不相等 |
> |
大于 | a > b |
检查左操作数的值是否大于右操作数的值 |
< |
小于 | a < b |
检查左操作数的值是否小于右操作数的值 |
>= |
大于等于 | a >= b |
检查左操作数的值是否大于或等于右操作数的值 |
<= |
小于等于 | a <= b |
检查左操作数的值是否小于或等于右操作数的值 |
⭐⭐ 示例代码
1 | public class RelationalOperators { |
逻辑运算符
逻辑运算符用于组合多个布尔表达式
| 运算符 | 名称 | 示例 | 描述 |
|---|---|---|---|
&& |
短路与 | a && b |
如果两个操作数都为真 |
|| |
短路或 | a || b |
如果两个操作数有一个为真 |
& |
逻辑与 | a & b |
如果两个操作数都为真 |
| |
逻辑或 | a | b |
如果两个操作数有一个为真 |
^ |
逻辑异或 | a ^ b |
两个操作数一个为真一个为假 |
! |
非 |
!a |
如果操作数为真 |
⭐⭐ 示例代码
1 | // && |
位运算符
位运算符对整数类型的位进行操作
| 运算符 | 名称 | 示例 | 描述 |
|---|---|---|---|
& |
按位与 | a & b |
只有当两个对应的二进制位都为 1 时 |
| |
按位或 | a | b |
只要有一个对应的二进制位为 1 |
^ |
按位异或 | a ^ b |
当两个对应的二进制位不相同时 |
~ |
按位取反 | ~a |
当原二进制位为 0 时 |
<< |
左移 | a << 1 |
将a的二进制位向左移动1位 左移几位 |
>> |
右移 | a >> 1 |
将a的二进制位向右移动1位 右移几位 |
>>> |
无符号右移 | a >>> 1 |
将a的二进制位向右移动1位 处理的是二进制位的移动 |
⭐⭐ 示例代码
1 | // 在 Java 中 |
赋值运算符
赋值运算符用于给变量赋值
| 运算符 | 示例 | 等价于 |
|---|---|---|
= |
a = 5 |
简单赋值 |
+= |
a += 5 |
a = a + 5 |
-= |
a -= 5 |
a = a - 5 |
*= |
a *= 5 |
a = a * 5 |
/= |
a /= 5 |
a = a / 5 |
%= |
a %= 5 |
a = a % 5 |
&= |
a &= 5 |
a = a & 5 |
|= |
a |= 5 |
a = a | 5 |
^= |
a ^= 5 |
a = a ^ 5 |
<<= |
a <<= 5 |
a = a << 5 |
>>= |
a >>= 5 |
a = a >> 5 |
>>>= |
a >>>= 5 |
a = a >>> 5 |
⭐⭐ 示例代码
1 | public class AssignmentOperators { |
三元运算符
条件运算符是Java中唯一的三元运算符
语法条件表达式 ? 表达式1 : 表达式2
⭐⭐ 示例代码
1 | public class TernaryOperator { |
特殊运算符
1 | // 字符串连接运算符 (+) |
运算符优先级
当表达式包含多个运算符时
| 优先级 | 运算符 | 运行顺序 |
|---|---|---|
| 1 | `()` `[]` `.` |
从左到右 |
| 2 | `++` `--` `!` `~` `+` `-` `(type)` `new` |
从右到左 |
| 3 | `*` `/` `%` |
从左到右 |
| 4 | `+` `-` |
从左到右 |
| 5 | `<<` `>>` `>>>` |
从左到右 |
| 6 | `<` `<=` `>` `>=` `instanceof` |
从左到右 |
| 7 | `==` `!=` |
从左到右 |
| 8 | `&` |
从左到右 |
| 9 | `^` |
从左到右 |
| 10 | `|` |
从左到右 |
| 11 | `&&` |
从左到右 |
| 12 | `||` |
从左到右 |
| 13 | `? :` |
从右到左 |
| 14 | 赋值运算符 | 从右到左 |
⭐⭐ 示例代码
1 | int result = 10 + 5 * 2; // 先乘法后加法 |
控制结构
Java 的控制结构决定了代码的执行顺序和逻辑走向
顺序结构
这是最简单的结构
1 | // 特点 |
分支控制
⭐⭐ 单分支结构
// 基本语法
if (条件表达式) {
// 代码块( 当条件表达式为 true 时执行)
}
1.程序首先计算 条件表达式 的值。
2.如果结果为 true, 则执行大括号 {} 内的代码块。
3.如果结果为 false, 则跳过整个 if 结构, 执行紧跟在 if 后面的下一行代码。
4.如果代码块中只有一行语句, 大括号 {} 可以省略( 但强烈不建议省略, 为了代码可读性和避免错误) 。
1 | public static void main(String[] args) { |
⭐⭐ 双分支结构
// 基本语法
if (条件表达式) {
// 代码块1( 当条件为 true 时执行)
} else {
// 代码块2( 当条件为 false 时执行)
}
1.程序首先计算 条件表达式 的值。
2.如果结果为 true, 执行 代码块1。
3.如果结果为 false, 执行 代码块2。
4.执行完毕后, 执行紧跟在 if 后面的下一行代码。
1 | public static void main(String[] args) { |
⭐⭐ 多分支结构
// 基本语法
if (条件表达式1) {
// 代码块1
} else if (条件表达式2) {
// 代码块2
} else {
// 默认代码块( 以上条件都不满足时执行)
}
1.自上而下依次判断条件表达式。
2.一旦遇到某个 条件表达式 为 true, 就执行对应的代码块, 执行完毕后立即跳出整个结构, 不再判断后续的 else if。
3.如果所有的 if 和 else if 条件都不成立, 且存在 else 分支, 则执行 else 中的代码块。
4.else 分支如果没有要处理的代码块, 可以省略。
1 | public static void main(String[] args) { |
⭐⭐ 嵌套分支结构
// 基本语法
if (外层条件表达式) {
// 外层代码块
if (内层条件表达式) {
// 内层代码块 A
} else {
// 内层代码块 B
}
} else {
// 外层代码块
}
1.程序首先判断外层条件。 只有在外层条件成立的情况下, 才会去执行内部的内层条件判断。
2.内层的 if-else 完全属于外层 if 或 else 的代码块范围。
3.逻辑关系: 通常用于表达“ 并且” 的关系。 例如: “ 如果是男性 并且 年龄大于 18” -> 外层判断性别, 内层判断年龄。
4.嵌套分支结构其实就是将上述的单分支、 双分支或多分支结构互相“ 包裹” 起来, 形成里外两层或多层的判断逻辑。
5.理论上 Java 支持无限层嵌套, 但在实际开发中, 为了代码的可读性和维护性, 建议嵌套层次不要超过 3 层。
1 | public static void main(String[] args) { |
⭐⭐ 多值匹配结构
// 基本语法
switch (表达式) {
case 值1:
// 执行代码块1
break;
case 值2:
// 执行代码块2
break;
case 值3:
case 值4: // 多个case共用代码
// 执行代码块3或4
break;
default:
// 当所有case都不匹配时执行
}
1.表达式求值: switch 后面括号中的表达式只会被计算一次。
2.顺序匹配: 从上到下依次将表达式的值与 case 后面的值进行比较。 一旦找到匹配的 case, 程序会从该处开始执行代码。
3.case 的值必须是字面量或 final 常量, 不能是变量或表达式。
4.break 语句用于终止 switch 结构, 跳出整个代码块。
5.穿透现象: 如果省略 break, 程序不会停止, 而是会继续执行下一个 case 或 default 的代码, 直到遇到 break 或 switch 结束。
6.除非刻意利用穿透, 否则每个 case 后都应该写 break, 否则会导致逻辑错误。
7.default 分支: 当所有 case 都不匹配时执行。 它是可选的, 位置可以放在 switch 块的任何地方, 但为了代码可读性, 强烈建议放在末尾。
1 | public static void main(String[] args) { |
循环控制
⭐⭐ for 循环
// 基本语法
for (初始化语句; 循环条件; 迭代语句) {
// 循环体( 重复执行的代码)
}
1.初始化语句: 最先执行, 且只执行一次。 通常用于定义循环变量( 如 int i = 0) 。
2.循环条件: 必须是一个布尔表达式。 在每次循环开始前进行判断。
3.如果结果为 true, 则执行循环体。
4.如果结果为 false, 则终止循环, 跳出 for 结构。
5.循环体: 条件为 true 时执行的具体代码。
6.迭代语句: 在循环体执行完毕后执行, 通常用于更新循环变量( 如 i++) 。
7.流程顺序: 初始化 -> 判断条件 -> 执行循环体 -> 执行迭代语句 -> 再次判断条件……直到条件为 false。
1 | public static void main(String[] args) { |
⭐⭐ while 循环
// 基本语法
while (循环条件) {
// 循环体
// 迭代语句( 通常放在循环体末尾)
}
1.如果条件为 true, 则执行循环体中的代码。
2.如果条件为 false, 则直接跳过整个 while 循环, 执行循环后面的代码。
3.注意: 由于是先判断, 如果一开始条件就是 false, 循环体一次都不会执行。
1 | public static void main(String[] args) { |
⭐⭐ do-while 循环
// 基本语法
do {
// 循环体
// 迭代语句
} while (循环条件); // 注意这里的分号不能丢
1.先执行: 无论条件是否成立, 循环体至少会执行一次。
2.后判断: 执行完循环体后, 再判断 循环条件。
3.如果条件为 true, 则继续执行循环体。
4.如果条件为 false, 则终止循环。
1 | public static void main(String[] args) { |
⭐⭐ 循环嵌套
// 基本语法
for (初始化语句1; 循环条件1; 迭代语句1) {
// 外层循环体
for (初始化语句2; 循环条件2; 迭代语句2) {
// 内层循环体( 核心逻辑通常在这里)
}
}
1.循环嵌套可以是任意循环( for、 while、 do-while) 的互相组合。
2.最常见的是 for 循环嵌套 for 循环。
1 | public static void main(String[] args) { |
流程控制
⭐⭐ break 终止循环
1 | // 一旦执行 break |
⭐⭐ continue 跳过本次循环
1 | // 一旦执行 continue |
⭐⭐ return 结束方法
1 | // 无论 return 写在方法的哪个角落 |
第一阶段: 建立编程思想
Java 概述
如何快速学习Java技术
变量
数据类型
运算符
运算符介绍
控制结构
顺序
数组、 排序和查找
数组
面向对象编程(基础)
类与对象
面向对象编程(中级)
包
第二阶段: 提升编程能力
面向对象编程(高级)
类变量和类方法
枚举和注解
自定义类实现枚举
Exception
异常的概念
常用类
包装类
集合
- 集合框架体系
- Collection
- List
ArrayList: LinkedList、 Vector、 - Set
HashSet: LinkedHashSet、 TreeSet、
- List
- Map
HashMap: Hashtable、 LinkedHashMap、 TreeMap、 Properties、 - Collections
泛型
- 泛型语法
- 自定义泛型
泛型类: 泛型接口、 泛型方法、 - 泛型继承和通配符
线程基础
线程介绍
IO流
- 文件
概念: 常用操作、 - IO流原理及流的分类
- 节点流和处理流
- 输入流
- InputStream
FilelnputStream: BufferedInputStream、 ObjectlnputStream、 - Reader
FileReader: BufferedReader、 InputStreamReader、
- InputStream
- 输出流
- OutputStream
FileOutputStream: BufferedOutputStream、 ObjectOutputStream、 - Writer
FileWriter: BufferedWriter、 OutputStreamWriter、
- OutputStream
- Properties类
Java8新特性
Lambda
Java11 新特性
- 代码层面新特性
JShell: 类型推断、 集合增强API、 Stkeam 加强、 新增字符串处理方法、 Optional 加强、 InputStream增强API、 标准Java异步HTTP客户端、 - 其他新特性
简化的编译运行: 支持Unicode 10、 Epsilon垃圾收集器、 ZGC、 JFR、 支持Linux容器、 支持G1上的并行完全垃圾收集、 增加加密算法,代替RC4、 最新HTTPS安全协议TLS 1.3、 移除和废弃的内容、
第三阶段: 分析需求, 代码实现
网络编程
网络基础
反射
反射机制
Mysql基础
- MySQL安装和配置
- 数据库
创建: 查看、 删除数据库、 备份恢复数据库、 - 表
创建: 删除、 修改、 查询、 - Mysql数据类型
- CRUD
Insert: Update、 Delete、 Select、 - 函数
: 统计函数、 时间日期、 字符串函数、 数学函数、 流程控制、 - 内连接
- 外连接
- 约束
not null: primary key、 unique、 foreign key、 check、 自增长、 - 索引
主键索引: 唯一索引(UNIQUE)、 普通索引(INDEX)、 全文索引、 - 事务
JDBC和连接池
- JDBC概述
- JDBC快速入门
- JDBC API
PreparedStatement: DriverManager、 Statement、 ResultSet、 - JDBCUtils
- 事务
- 批处理
- 连接池
DataSource: DBCP、 C3P0、 Proxool、 BoneCP、 Druid、 - Apache-DBUtils
- DAO增删改查-BasicDao
正则表达式
- 快速入门
- 正则表达式基本语法
- 三个常用类
Pattern: Matcher、 PatternSyntaxException、 - 分组
捕获、 反向引用、 - 元字符
限定符: 选择匹配符、 分组组合和反向引用符、 特殊字符字符、 匹配符、 定位符、
学习资源
- 视频
- 韩顺平
零基础 30 天学会 Java: : https://www.bilibili.com/video/BV1fh411y7R8 - 宋红康
全网最全Java零基础入门教程: : https://www.bilibili.com/video/BV1Kb411W75N - JDK8新特性详解
: https://www.bilibili.com/video/BV1k64y1R7sA - Java 核心技术卷
: https://www.bilibili.com/video/BV18u411q7jv
- 韩顺平
- 文档
- 菜鸟教程 Java
: https://www.runoob.com/java/java-tutorial.html - 菜鸟教程 Java 8
: https://www.runoob.com/java/java8-new-features.html - 廖雪峰 Java 教程
: https://www.liaoxuefeng.com/wiki/1252599548343744 - Java API 中文文档
: https://www.matools.com/api/java8
- 菜鸟教程 Java
- 书籍
Head First Java《 》 Java 8 实战《 》 Java 从入门到精通《 》 Java 核心技术卷 I《 》 : https://pan.baidu.com/s/1G36MF1XrLhKMaBpNcfM61g?pwd=ep11
- 工具
- 在线编写运行
: https://c.runoob.com/compile/10/
- 在线编写运行
- 游戏
- Codegym
: https://codegym.cc/zh
- Codegym
- 练手项目
- 牛客题库
: https://www.nowcoder.com/intelligentTest - Java 实现简单计算器
: https://www.lanqiao.cn/courses/185 - Eclipse 实现 Java 编辑器
: https://www.lanqiao.cn/courses/287 - 一本糊涂账
: https://how2j.cn/module/104.html - Java 五子棋
: https://blog.csdn.net/cnlht/article/details/8176130 - Java 中国象棋
: https://blog.csdn.net/cnlht/article/details/8205733 - JAVA GUI 图书馆管理系统
: https://github.com/uboger/LibraryManager - JAVA 坦克大战小游戏
: https://github.com/wangzhengyi/TankWar - Swing 编写的俄罗斯方块
: https://github.com/HelloClyde/Tetris-Swing - 小小记账本
: https://github.com/xenv/SmallAccount
- 牛客题库