一、引用数据类型概述
1. 定义
引用数据类型是 Java 中除基本数据类型外的另一大类数据类型,其变量存储的是对象在内存中的地址(引用),而非对象本身的数据。通过引用可以操作对应的对象。
2. 特点
- 变量存储的是地址,指向堆内存中的对象实体。
- 默认值为
null
(表示不指向任何对象)。 - 占用内存空间通常大于基本数据类型(具体大小取决于虚拟机实现)。
- 赋值操作时,传递的是引用(地址),而非对象本身。
二、引用数据类型分类及详解
1. 数组(Array)
-
定义:由相同数据类型的元素组成的有序集合,长度固定。
-
特点:
- 元素类型可以是基本数据类型或引用数据类型。
- 通过索引(从 0 开始)访问元素。
- 一旦创建,长度不可改变。
-
声明与初始化:
// 声明数组 int[] intArray; // 推荐方式 String strArray[]; // 兼容C语言的方式 // 初始化 intArray = new int[3]; // 动态初始化:指定长度,元素为默认值(int默认0) String[] names = {"Alice", "Bob", "Charlie"}; // 静态初始化:直接指定元素
2. 类(Class)
-
定义:类是对象的模板,描述对象的属性(成员变量)和行为(方法)。自定义类或 Java 内置类(如
String
、System
)均属于此类。 -
特点:
- 通过
new
关键字创建类的实例(对象)。 - 成员变量有默认值(与基本数据类型默认值一致,引用类型默认
null
)。
- 通过
-
示例(以
String
类为例):// String是Java内置的类,用于表示字符串 String message; // 声明String类型变量 message = "Hello, Java"; // 初始化,指向字符串对象 String name = new String("Alice"); // 通过构造方法创建对象
-
自定义类示例:
// 定义类 class Person { String name; // 成员变量 int age; void sayHello() { // 成员方法 System.out.println("Hello, I'm " + name); } } // 使用类 Person person = new Person(); // 创建对象 person.name = "Tom"; // 赋值成员变量 person.sayHello(); // 调用方法
3. 接口(Interface)
-
定义:一种抽象类型,仅声明方法(抽象方法)和常量,无方法实现(Java 8 后可包含默认方法和静态方法)。
-
特点:
- 不能直接实例化,需通过类实现(
implements
关键字)。 - 实现类必须重写接口中的抽象方法。
- 不能直接实例化,需通过类实现(
-
示例:
// 定义接口 interface Runnable { void run(); // 抽象方法 } // 实现接口 class MyThread implements Runnable { @Override public void run() { System.out.println("Thread is running"); } } // 使用 Runnable task = new MyThread(); task.run();
4. 枚举(Enum)
-
定义:一种特殊的类,用于定义固定数量的常量(枚举项)。
-
特点:
- 枚举项为该枚举类型的实例,自动被
public static final
修饰。 - 可包含构造方法、成员变量和方法。
- 枚举项为该枚举类型的实例,自动被
-
示例:
// 定义枚举 enum Season { SPRING, SUMMER, AUTUMN, WINTER; // 枚举项 } // 使用 Season currentSeason = Season.SUMMER; if (currentSeason == Season.SUMMER) { System.out.println("It's hot"); }
5. 注解(Annotation)
-
定义:用于标记代码(类、方法、变量等)的特殊标记,可在编译、运行时被读取并处理。
-
特点:
- 本身不直接影响代码逻辑,需通过注解处理器生效。
- 可内置(如
@Override
、@Deprecated
)或自定义。
-
示例(内置注解):
class Student { @Override // 标记重写父类方法 public String toString() { return "Student"; } }
6. 记录(Record)(Java 16+)
-
定义:一种简化的类,用于存储不可变数据(类似 “数据载体”),自动生成构造方法、
equals()
、hashCode()
和toString()
。 -
特点:
- 成员变量默认
final
,不可修改。 - 声明时直接指定成员变量,无需手动编写 getter 等方法。
- 成员变量默认
-
示例:
// 定义记录 record Point(int x, int y) {} // 使用 Point p = new Point(3, 4); System.out.println(p.x()); // 自动生成的getter方法 System.out.println(p); // 自动生成的toString()
三、引用数据类型的常见操作
1. 赋值操作
引用数据类型的赋值传递的是地址,多个变量可指向同一个对象,修改一个变量会影响其他变量:
StringBuilder sb1 = new StringBuilder("Hello");
StringBuilder sb2 = sb1; // sb2与sb1指向同一对象
sb2.append(" World");
System.out.println(sb1); // 输出"Hello World"(sb1指向的对象被修改)
2. 比较操作
==
:比较两个引用是否指向同一个对象(地址是否相同)。equals()
:默认与==
一致,可重写用于比较对象内容(如String
类重写了equals()
比较字符串内容)。
String s1 = new String("abc");
String s2 = new String("abc");
System.out.println(s1 == s2); // false(地址不同)
System.out.println(s1.equals(s2)); // true(内容相同)
3. 空值判断
引用变量未指向任何对象时为null
,使用前需判断避免NullPointerException
:
String str = null;
if (str != null) {
System.out.println(str.length()); // 避免空指针异常
}