阶段:入门篇 | 建议时长:4 天 | 前置:无
学习目标
- 独立完成 JDK 17 安装与环境变量配置,会用
java -version、javac -version验证。 - 手写
HelloWorld并分别用命令行(javac/java)和 IDEA 运行成功,能说清编译运行过程。 - 掌握 8 种基本类型、类型转换、运算符、流程控制、方法重载与可变参数,能独立写出 50 行以内的小程序。
- 熟练使用 IDEA 断点调试(Step Over/Into、查看变量)与常用快捷键。
- 能口头解释「Java 只有值传递」并举例验证。
核心知识点
JDK 安装与版本选择
- 三者关系:JDK(开发工具包)⊇ JRE(运行环境)⊇ JVM(虚拟机)。开发装 JDK,只运行装 JRE。
- 常用 LTS 版本:8(老项目存量最大)、17(当前主流,入门推荐)、21(虚拟线程)、25(最新 LTS,2025.9 发布;新项目选型)。
- 17 相比 8 的明显变化:模块化(JPMS)、
var局部变量类型推断、Switch 表达式、文本块、record、更强的 G1 GC。 - 安装后配置
JAVA_HOME,并把%JAVA_HOME%\bin(Windows)或$JAVA_HOME/bin(macOS/Linux)加入PATH。
第一个程序与编译运行原理
public class Hello {
public static void main(String[] args) {
System.out.println("Hello, Java!");
}
}
javac Hello.java编译出 字节码文件 Hello.class;java Hello由 JVM 加载执行(Java 11+ 可直接java Hello.java单文件运行)。- 核心机制:一次编译,到处运行——源码编译成与平台无关的
.class,不同平台的 JVM 负责解释/JIT 编译执行。 main方法签名固定:public static void main(String[] args),是程序入口。
IDEA 安装与调试
- 社区版(Community)免费够用;新建 Project 时选择 JDK 17。
- 断点调试:行号左侧点击下断点 → Debug 运行;F8(Step Over)单步跳过、F7(Step Into)进入方法、Shift+F8 跳出、F9 放行到下一断点;调试窗口可实时查看/修改变量值。
- 快捷键(Windows/macOS):
psvm+Tab 生成 main、sout+Tab 生成输出;Alt+Enter 快速修复;Ctrl+D 复制行;Ctrl+Y 删除行;Ctrl+Alt+L 格式化;Shift+F6 重命名。
变量与 8 种基本类型
| 类型 | 字节 | 范围/说明 | 默认值 |
|---|---|---|---|
| byte | 1 | -128 ~ 127 | 0 |
| short | 2 | -32768 ~ 32767 | 0 |
| int | 4 | 约 ±21 亿 | 0 |
| long | 8 | 需加后缀 L | 0L |
| float | 4 | 单精度,需加 f | 0.0f |
| double | 8 | 双精度,浮点默认类型 | 0.0d |
| char | 2 | 单个字符,0 ~ 65535 | ‘\u0000’ |
| boolean | - | true/false(JVM 层面实现决定大小) | false |
- 类型转换:小→大自动提升(byte/short/char 参与运算先转 int),大→小强制转换
(int) 3.9截断小数。 - 整数字面量默认 int,浮点默认 double;
long x = 10000000000L;不加 L 会编译错误。 float/double存在精度丢失,金额计算禁止用它们(见文件 2 的 BigDecimal)。
运算符
- 算术:
+ - * / %;整数相除结果仍是整数(5 / 2 == 2)。 - 自增:
i++先用后加,++i先加后用。 - 逻辑:
&&、||短路——a && b中 a 为 false 则 b 不执行;&、|不短路(位运算)。 - 三元:
条件 ? 值1 : 值2;优先级不确定时加括号。
String 简介与 Scanner
String是引用类型、不可变对象,字符串字面量存在常量池中;==比较地址,equals()比较内容(详见文件 2)。- 常用方法:
length()、charAt()、substring()、indexOf()、equals()、split()。
Scanner sc = new Scanner(System.in);
int n = sc.nextInt(); // 读整数
String line = sc.nextLine(); // 读一行字符串
- 坑:
nextInt()后接nextLine()会读到换行符,需要先额外调用一次nextLine()清空缓冲。
流程控制
if / else if / else:条件必须是 boolean。switch:可作用的类型——byte、short、char、int 及其包装类、枚举、String(Java 7+),不支持 long/float/double/boolean;Java 14+ 箭头表达式case 1 -> ...不用写 break。for、while、do-while、增强 for(for (int x : arr))。break跳出本层循环,continue跳过本次;带标签outer:可跳出多层(少用)。
方法、重载与可变参数
static int add(int a, int b) { return a + b; } // 重载:参数列表不同
static double add(double a, double b) { return a + b; } // 与返回值类型无关
static int sum(int... nums) { // 可变参数本质是数组
int s = 0;
for (int n : nums) s += n;
return s;
}
- 重载(overload):同一个类中方法名相同、参数列表不同;仅返回值不同不算重载。
- 可变参数必须是参数列表的最后一个。
Java 只有值传递
面试官想听:你能区分「传值的拷贝」和「传引用的拷贝」,并用一个反例证明引用本身不会被改变。
- Java 中永远传递的是实参的拷贝:基本类型拷贝「值」,引用类型拷贝「引用(地址)」。
- 方法内通过引用修改对象内容会影响原对象;但让引用指向新对象不影响原引用:
static void change(int x) { x = 100; } // 无效
static void fill(int[] arr) { arr[0] = 100; } // 有效:改的是对象内容
static void reassign(int[] arr) { arr = new int[]{9}; } // 无效:改的是引用副本
数组与 Arrays 工具类
- 声明与初始化:
int[] a = new int[3];、int[] b = {1, 2, 3};;长度固定a.length,越界抛ArrayIndexOutOfBoundsException。 - 二维数组:
int[][] m = new int[3][4];,本质是「数组的数组」,第二维长度可不同。 Arrays常用方法:toString()打印、sort()排序、fill()填充、copyOf()复制、equals()比较、binarySearch()二分查找(需有序)。
动手实践
任务 1:九九乘法表
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= i; j++) {
System.out.printf("%d*%d=%-4d", j, i, i * j);
}
System.out.println();
}
- 验收标准:输出标准下三角 45 行乘法口诀;列对齐(用
%-4d);改写成while版本结果一致。
任务 2:猜数字游戏
- 要求:程序随机生成 1~100 的整数(
new Random().nextInt(100) + 1),用户循环输入猜测,提示「大了/小了」,猜中后输出总次数并退出。 - 验收标准:用
while(true)+break实现;输入非法(非数字)不崩溃(用InputMismatchException或先读字符串再解析);能统计并输出猜测次数。
任务 3:数组冒泡排序 + 最大值
for (int i = 0; i < arr.length - 1; i++) {
boolean swapped = false;
for (int j = 0; j < arr.length - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
int t = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = t;
swapped = true;
}
}
if (!swapped) break; // 一趟无交换说明已有序,提前结束
}
- 验收标准:对
{5, 2, 8, 1, 9}输出排序结果与最大值 9;加上提前退出的优化;最后用Arrays.sort(arr)对照验证自己的排序结果一致。
任务 4:IDEA 调试练习
- 验收标准:在任务 3 的内层循环处打断点,Debug 运行,用 Step Over 观察每轮
i、j、swapped的值变化,并截图记录一次「修改 Debug 窗口中的变量值后程序行为改变」。
高频面试题
Q:JDK、JRE、JVM 三者是什么关系?⭐
- JVM 是执行字节码的虚拟机,是「跨平台」的关键。
- JRE = JVM + Java 核心类库,只够运行程序。
- JDK = JRE + 编译器 javac、调试器 jdb 等开发工具,开发必须装 JDK。
- 一句话:JDK ⊃ JRE ⊃ JVM。
Q:Java 是值传递还是引用传递?⭐
- 只有值传递。基本类型传「值的副本」,方法内修改不影响原变量。
- 引用类型传「引用(地址)的副本」,方法内通过该引用可以修改对象内容,但重新赋值(指向新对象)不影响原引用。
- 反例:
reassign(int[] arr)中arr = new int[]{9}后调用方数组不变,证明不是引用传递。
Q:switch 支持哪些类型?
- byte、short、char、int 及其包装类(Byte/Short/Character/Integer)、枚举(Java 5+)、String(Java 7+)。
- 不支持 long、float、double、boolean;case 必须是编译期常量且不重复。
- Java 14+ 的箭头语法
case x ->无需 break、不穿透。
Q:& 和 && 的区别?
&&短路:左边为 false 时右边不计算,效率高且能防 NPE(如s != null && s.length() > 0)。&是位运算符也可用于 boolean,但不短路,两边都会计算。
Q:char 类型能存一个汉字吗?
- 能。char 占 2 字节(UTF-16 code unit),汉字大多落在基本多文种平面(BMP),如
'中'可直接赋给 char。 - 生僻字(如 emoji 或增补平面字符)需两个 char(代理对),
String.length()返回的是 code unit 数而不是字符个数。
Q:为什么 float 和 double 不能直接比较相等?
- 二进制浮点无法精确表示很多十进制小数(如 0.1),运算后存在累积误差。
- 比较应使用差值阈值,金额计算应使用 BigDecimal(字符串构造)。
Q:编译型语言和解释型语言,Java 算哪种?
- 混合型:javac 先把源码编译成字节码(.class),再由 JVM 逐条解释执行,热点代码由 JIT 编译成本地机器码。
- 由此获得「一次编译,到处运行」,JIT 又保证了接近原生的执行速度。
推荐资料
| 资料 | 说明 | 链接 |
|---|---|---|
| 廖雪峰 Java 快速入门 | 入门主线精读,配环境到基础语法全覆盖 | https://liaoxuefeng.com/books/java/quick-start/index.html |
| 慕课网《Java入门第一季》 | 免费视频,适合完全零基础跟练 | https://www.imooc.com/learn/85 |
| pdai 语言基础 | 语法要点体系化梳理,可当速查表 | https://pdai.tech/md/java/basic/java-basic-lan-basic.html |
| JavaGuide 基础面试题 | 学完本章开始刷基础面试题第一部分 | https://javaguide.cn/java/basis/java-basic-questions-01.html |
| Java 8 中文 API 速查 | 查 String/Arrays/Scanner 等类的方法 | https://www.matools.com/api/java8 |