基本类型与引用类型
理解 Java 中基本类型与引用类型之间的根本区别
基本类型与引用类型 是 CoddyKit 上的免费 Java Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Java Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Java Academy 课程共包含 4 节课。
基本类型与引用类型
Java 有两大基本数据类型类别:基本类型和引用类型。理解两者的区别对于编写正确且高效的 Java 代码至关重要。
八种基本类型
Java 恰好有八种基本类型:
byte(8 位整数)short(16 位整数)int(32 位整数)long(64 位整数)float(32 位小数)double(64 位小数)char(16 位 Unicode 字符)boolean(真/假)
基本类型直接在内存中保存值,不产生对象开销。
int age = 25;
double price = 19.99;
boolean active = true;
char grade = 'A';
long population = 8_000_000_000L;
System.out.println(age); // 25
System.out.println(price); // 19.99
System.out.println(active); // true引用类型
引用类型存储一个指向堆中对象的内存地址(引用)。它包括:
- 类(例如
String、Scanner) - 数组(例如
int[]) - 接口
- 枚举和记录
变量并不保存对象本身,而是保存指向对象的指针。
String name = "Alice"; // reference to a String object
int[] scores = {90, 85, 92}; // reference to an array object
// name holds a reference, not the characters directly
System.out.println(name.length()); // 5
System.out.println(scores.length); // 3栈内存与堆内存
基本类型变量存储在栈上。栈是速度快、生命周期短,并与方法调用相关联的内存。
引用类型对象存储在堆上。堆是容量更大、生命周期更长,并由垃圾回收机制管理的内存。引用(地址)本身存储在栈上。
// Stack: holds the int value directly
int x = 42;
// Stack: holds reference; Heap: holds the Person object
class Person {
String name;
int age;
}
Person p = new Person(); // p is a reference on stack, object on heap
p.name = "Bob";
p.age = 30;null:不存在的引用
引用变量可以被赋值为 null,表示它不指向任何对象。基本类型不能为 null,它们始终有值。
访问 null 引用会导致 NullPointerException(NPE),这是 Java 中最常见的运行时错误之一。
String s = null;
// int n = null; // Compile error — primitives can't be null
try {
System.out.println(s.length()); // NullPointerException!
} catch (NullPointerException e) {
System.out.println("Caught NPE: reference was null");
}复制语义:基本类型
将一个基本类型变量赋值给另一个变量时,Java 会复制值。修改其中一个变量不会影响另一个变量;两者完全独立。
int a = 10;
int b = a; // b gets a copy of the value 10
b = 20; // changing b does NOT affect a
System.out.println(a); // 10
System.out.println(b); // 20复制语义:引用类型
将一个引用变量赋值给另一个变量时,两个变量都指向同一个对象。通过其中一个引用修改对象后,可以通过另一个引用看到修改结果。
int[] arr1 = {1, 2, 3};
int[] arr2 = arr1; // arr2 points to the SAME array
arr2[0] = 99; // modifies the shared array
System.out.println(arr1[0]); // 99 — arr1 sees the change too!
System.out.println(arr2[0]); // 99包装类:封装基本类型
每种基本类型在 java.lang 中都有对应的包装类:
int→Integerdouble→Doubleboolean→Booleanchar→Character
包装类让您可以将基本类型作为对象使用,这是 List<Integer> 等集合所要求的。
Integer boxed = Integer.valueOf(42); // explicit boxing
int unboxed = boxed.intValue(); // explicit unboxing
// Autoboxing / auto-unboxing (Java does this automatically)
Integer auto = 100; // autoboxed
int val = auto; // auto-unboxed
System.out.println(Integer.MAX_VALUE); // 2147483647
System.out.println(Double.MIN_VALUE); // 5.0E-324自动装箱的陷阱
自动装箱虽然方便,但可能导致不易察觉的错误。Integer 会缓存 -128 到 127 范围内的值;超出该范围时,== 比较的是引用,而不是值。
比较包装类对象时,请始终使用 .equals()。
Integer a = 127;
Integer b = 127;
System.out.println(a == b); // true (cached)
Integer c = 200;
Integer d = 200;
System.out.println(c == d); // false (different objects!)
System.out.println(c.equals(d)); // true (correct comparison)传递给方法:值传递
Java 始终采用值传递。对于基本类型,传递的是值的副本;对于引用类型,传递的是引用(地址)的副本。两个引用仍然指向同一个对象,但您无法在方法内部重新赋值调用方的变量。
static void doubleValue(int n) {
n = n * 2; // only modifies the local copy
}
static void clearArray(int[] arr) {
arr[0] = 0; // modifies the shared object
}
int x = 5;
doubleValue(x);
System.out.println(x); // still 5
int[] nums = {10, 20, 30};
clearArray(nums);
System.out.println(nums[0]); // 0 — object was mutated实用对照表
以下是基本类型与引用类型的快速对照:
- 存储:基本类型 → 栈上的值;引用类型 → 栈上的地址 + 堆中的对象
- 默认值:基本类型 → 0/false/\u0000;引用类型 → null
- 可以为 null:基本类型 → 否;引用类型 → 是
- 赋值复制:基本类型 → 值;引用类型 → 地址
- 在集合中:基本类型需要使用包装类
快速检查
执行以下代码会发生什么?
Integer x = 200; Integer y = 200; System.out.println(x == y);
回顾:基本类型与引用类型
本课的要点:
- Java 有 8 种直接存储在栈上的基本类型
- 引用类型存储堆中对象的地址;变量保存该地址
- 基本类型按值复制;引用类型按地址复制
- 引用变量可以为 null;基本类型不能为 null
- 包装类(Integer、Double 等)将基本类型封装为对象
- Java 始终采用值传递,即使传递的是引用也是如此
常见问题解答
「基本类型与引用类型」课时是免费的吗?
是的 — 「基本类型与引用类型」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Java Academy 课程的其余内容,请升级到 CoddyKit PRO。 Java Academy 课程共包含 4 节课。
「基本类型与引用类型」这节课中我会学到什么?
理解 Java 中基本类型与引用类型之间的根本区别 你通过在浏览器中直接运行的动手代码来练习 Java Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Java Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Java Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「基本类型与引用类型」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Java Academy 课中编写并运行代码吗?
能。每节 Java Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 基本类型与引用类型
- 扩大转换与缩小转换
- instanceof 运算符
- 实际应用中的类型转换