LeetCode第二题知识点3 ----引用类型
1.. 首先:什么是“引用类型”?
在 Java 中,类型分为两大类:
类型 | 例子 | 特点 |
---|---|---|
基本类型(Primitive Types) | int , boolean , double , char , byte , short , long , float | 直接存“值”,不是对象 |
引用类型(Reference Types) | 所有类、接口、数组、枚举 | 存的是“指向对象的地址” |
🔑 关键:所有你自己用 class
定义的东西,都是引用类型!
2. ListNode
是怎么被定义的?
public class ListNode {int val;ListNode next;ListNode(int x) { val = x; }
}
- 你用了
class ListNode
来定义它。 - 只要是
class
定义的,Java 就认为它是一个类(class)。 - 所有类的实例(对象)都是引用类型。
👉 所以:ListNode
是引用类型,因为它是一个 类(class)。
3. 为什么“定义了一个类”就叫引用类型?
我们来对比:
❌ 基本类型(Java 内置,不是用 class
定义的)
int a = 10;
int
是 Java 语言内置的基本类型。- 它不是用
class
定义的,是语言“原生支持”的。 a
直接存储数字10
。
引用类型(用 class
定义的)
ListNode node = new ListNode(5);
ListNode
是你用class
定义的一个类。node
不直接存数据,它存的是这个对象在堆中的地址(比如0x123
)。- 真正的数据(
val=5
,next=null
)在堆上。
4. 举个更直观的例子
String s = "hello";
String
是引用类型(它是class String
定义的)s
存的是地址,不是"hello"
这个字符串本身
int x = 100;
int
是基本类型x
直接存100
👉 所以:只要是 class
、interface
、enum
、[]
(数组)定义的,都是引用类型。
5. 回到你的疑问:“他只是定义了一个方法而已啊”
你说“只是定义了一个方法”,这其实是一个常见的误解。
我们再看 ListNode
的定义:
public class ListNode { // ← 这是定义一个“类”,不是方法!int val; // ← 成员变量ListNode next; // ← 成员变量(类型是 ListNode)ListNode(int x) { // ← 构造方法(特殊方法)val = x;}
}
class ListNode
:这是在定义一个类,不是定义方法。ListNode(int x)
:这是一个构造方法,用来创建对象。int val;
和ListNode next;
:这是两个字段(成员变量)。
所以:
ListNode
是一个类,它的实例是对象,因此它是引用类型。
6. 如何快速判断一个类型是不是引用类型?
方法一:看它是不是这 8 个基本类型之一
byte, short, int, long,
float, double,
boolean,
char
👉 ListNode
不在其中 → 是引用类型
方法二:看它是不是用 class
/ interface
/ []
定义的
class Person {}
→ 引用类型interface Runnable
→ 引用类型int[] arr
→ 引用类型(数组)String s
→ 引用类型(class String
)
👉 ListNode
是 class
→ 引用类型
方法三:能不能用 new
创建?
int x = 10;
✅ 合法,但不能写new int(10)
(虽然数组可以)ListNode node = new ListNode(0);
✅ 合法
能用
new
创建的,一定是引用类型(对象)
7. 为什么 ListNode next;
中的 next
类型是 ListNode
就能说明它是引用?
因为:
在 Java 中,只有引用类型才能作为类的字段类型。
你不能写:
// ❌ 错误!不能用基本类型名字当类名
int int = 5; // 语法错误
但你可以写:
ListNode next; // ✅ 合法,因为 ListNode 是一个类(引用类型)
所以编译器看到 ListNode next;
就知道:
ListNode
是一个类next
是一个引用,指向ListNode
类型的对象
✅ 总结:一句话回答你的问题
ListNode
是引用类型,因为它是一个用class
定义的类,而不是 Java 的 8 个基本类型之一。
class ListNode
→ 定义了一个类- 所有类的实例都是对象
- 所有对象的引用都是引用类型
所以 ListNode next;
中的 next
是一个引用,指向一个 ListNode
对象,默认值是 null
。