1. Java学习Day02核心内容复盘
今天是我系统学习Java的第二天,主要攻克了环境配置、基础语法和第一个实战程序。作为过来人,我特别理解新手在入门阶段容易踩的坑,这里把关键知识点和避坑指南整理成九宫格记忆法:
1.1 开发环境搭建实录
JDK安装后必须配置的三个环境变量:
- JAVA_HOME:指向JDK安装目录(如C:\Program Files\Java\jdk-17)
- Path:追加%JAVA_HOME%\bin
- CLASSPATH:现代Java版本通常可不配置
验证安装时我遇到了经典报错:
bash复制'javac' 不是内部或外部命令
这是Path配置未生效的典型表现,解决方案:
- 检查JAVA_HOME路径是否包含空格或中文
- 管理员权限重启CMD
- 用
echo %PATH%确认bin目录已加入
1.2 基础语法核心四象限
数据类型矩阵:
| 类型 | 范围 | 默认值 | 内存占用 |
|---|---|---|---|
| byte | -128~127 | 0 | 1字节 |
| short | -32768~32767 | 0 | 2字节 |
| int | -2^31~(2^31-1) | 0 | 4字节 |
| long | -2^63~(2^63-1) | 0L | 8字节 |
| float | IEEE754 | 0.0f | 4字节 |
| double | IEEE754 | 0.0d | 8字节 |
| char | \u0000~\uffff | '\u0000' | 2字节 |
| boolean | true/false | false | 未定义 |
运算符优先级口诀:
单目乘除位关系,逻辑三目后赋值
(单目运算符 > 算术 > 位 > 关系 > 逻辑 > 三目 > 赋值)
1.3 第一个Java程序深度解析
HelloWorld.java的六个必知细节:
java复制public class HelloWorld { // 1.类名必须与文件名一致
public static void main(String[] args) { // 2.main是JVM入口方法
System.out.println( // 3.System是final类
"Hello\u0020World!"); // 4.\u0020是Unicode空格
} // 5.缩进推荐4个空格
} // 6.大括号换行是Oracle规范
编译执行时的两个隐藏知识点:
bash复制javac -encoding UTF-8 HelloWorld.java # 指定编码防止中文乱码
java -Dfile.encoding=UTF-8 HelloWorld # 运行时同样需指定编码
1.4 数组操作的三大陷阱
初始化方式对比:
java复制int[] arr1 = new int[3]; // 元素默认0
int[] arr2 = {1,2,3}; // 静态初始化
int[] arr3 = new int[]{1,2,3}; // 匿名数组
越界异常预防方案:
java复制// 传统写法
for(int i=0; i<arr.length; i++)
// 增强for循环(避免下标操作)
for(int num : arr)
// Java8+写法
Arrays.stream(arr).forEach(...)
多维数组内存模型:
Java实际只有一维数组,所谓多维数组是"数组的数组"。例如:
java复制int[][] matrix = new int[2][3];
在内存中先创建长度为2的数组,每个元素再指向长度为3的数组。
1.5 流程控制的五个优化技巧
- switch新语法(Java12+):
java复制String result = switch(day) {
case "MON" -> "周一";
case "TUE" -> "周二";
default -> {
yield "未知"; // yield返回值
}
};
- 避免浮点数相等比较:
java复制// 错误写法
if (x == 0.1)
// 正确写法
if (Math.abs(x - 0.1) < 1e-6)
- 带标签的break:
java复制outer:
for(int i=0; i<10; i++) {
for(int j=0; j<10; j++) {
if(i*j > 50) break outer;
}
}
1.6 异常处理最佳实践
异常分类图谱:
code复制Throwable
├── Error(系统错误,不应捕获)
│ ├── OutOfMemoryError
│ └── StackOverflowError
└── Exception
├── RuntimeException(未检异常)
│ ├── NullPointerException
│ └── ArrayIndexOutOfBoundsException
└── 非RuntimeException(已检异常)
├── IOException
└── SQLException
防御性编程示例:
java复制try {
Files.readString(Paths.get("config.ini"));
} catch (NoSuchFileException e) {
createDefaultConfig();
} catch (IOException e) {
logger.error("文件读取失败", e);
throw new AppException("CONFIG_READ_ERROR");
} finally {
releaseResources(); // 永远执行
}
1.7 内存管理两大核心
JVM内存模型简化版:
code复制┌─────────────┐
│ Method │ 类信息、常量池
├─────────────┤
│ Heap │ 对象实例
├─────────────┤
│ Stack │ 局部变量、方法调用
├─────────────┤
│ PC/Native │ 线程私有
└─────────────┘
OutOfMemoryError排查步骤:
jps -l查看Java进程IDjmap -heap <pid>查看堆内存分配jstat -gcutil <pid> 1000 5监控GC情况- 使用MAT分析heap dump
1.8 编码规范七大铁律
- 类名大驼峰:
OrderService - 方法/变量小驼峰:
getOrderById - 常量全大写:
MAX_RETRY_COUNT - 包名全小写:
com.example.util - 缩进4空格(不用Tab)
- 行宽不超过120字符
- 注释规范:
- 类注释用
/** */ - 方法注释用
/* */ - 行注释用
//
- 类注释用
1.9 明日学习路线规划
根据认知曲线设计的明日计划:
-
早间(精力充沛期):
- 面向对象三大特性
- 类与对象内存模型
-
午后(实践黄金期):
- 实现图书管理系统核心类
- 编写单元测试
-
晚间(复习沉淀期):
- 整理UML类图
- 写技术博客复盘
特别提醒:遇到找不到符号错误时,优先检查:
- 类文件是否已编译
- import语句是否正确
- 类路径是否包含所需jar包
