在 Java 中,java.lang.Object 类是所有类的「顶级父类」—— 任何类都直接或间接继承于 Object 类。它定义了所有对象共有的基础行为,掌握其核心方法的特性与用法,是理解 Java 面向对象思想的关键。本文结合实例,详解 Object 类的核心方法及实战应用。
一、Object 类的基础特性
1. 顶级父类的地位
所有 Java 类(包括自定义类、系统类)都默认继承 Object 类,无需显式声明 extends Object。这意味着:
- 任何对象都能调用 Object 类的方法
- 子类可重写 Object 类的方法,定制自身行为
2. 核心方法概览
Object 类定义了多个基础方法,其中最常用的包括:
toString():返回对象的字符串表示equals(Object obj):比较两个对象是否「相等」clone():实现对象克隆(复制)
二、toString () 方法:对象的字符串表示
1. 默认行为
Object 类中 toString() 的默认实现返回「类名 @哈希码」的字符串(如 com.hm.Object.Student@7ef20235),本质是对象的内存地址标识,对开发者意义有限。
// Object 类中 toString() 的默认实现
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
2. 重写必要性与实现
实际开发中,我们更关注对象的「内容」而非地址,因此通常会重写 toString() 方法,返回对象的属性信息。
示例:Student 类重写 toString()
public class Student {
private String name;
private int age;
// 重写 toString(),返回属性值
@Override
public String toString() {
return name + "," + age;
}
}
// 使用:打印对象时自动调用 toString()
Student stu = new Student("zhangsan", 24);
System.out.println(stu); // 输出:zhangsan,24(而非地址)
作用:简化对象信息的打印与调试,避免手动拼接属性。
三、equals () 方法:对象相等性比较
1. 默认行为与 == 的区别
- Object 类中
equals()的默认实现等价于==,即比较两个对象的内存地址(是否为同一对象):// Object 类中 equals() 的默认实现 public boolean equals(Object obj) { return (this == obj); } ==对于基本类型比较值,对于引用类型比较地址;equals()是方法,默认比较地址,可重写为比较内容。
2. 重写规则与实现
实际业务中,「相等」通常指「属性值相同」(如两个 Student 对象姓名和年龄相同即为相等),因此需重写 equals()。
示例:Student 类重写 equals()
@Override
public boolean equals(Object o) {
if (this == o) return true; // 自身比较,直接返回 true
if (o == null || getClass() != o.getClass()) return false; // 类型不同,返回 false
Student student = (Student) o; // 强转
// 比较属性(基本类型用 ==,引用类型用 Objects.equals 避免空指针)
return age == student.age && Objects.equals(name, student.name);
}
3. 不同类的 equals() 实现差异
- String 类:重写了
equals(),比较字符串内容(而非地址)。String str = "zhangsan"; StringBuilder sb = new StringBuilder("zhangsan"); System.out.println(str.equals(sb)); // false(String 先判断类型,sb 不是 String) System.out.println(sb.equals(str)); // false(StringBuilder 比较地址,地址不同)
四、clone () 方法:对象克隆(复制)
1. 克隆的基本要求
- 需实现
Cloneable接口(标记性接口,无抽象方法,仅标识类可克隆)。 - 重写
clone()方法(Object 中clone()为protected,需重写为public)。 - 调用
clone()会抛出CloneNotSupportedException,需处理异常。
2. 浅克隆与深克隆
- 浅克隆:默认的
super.clone()实现,对基本类型复制值,对引用类型(如数组、对象)复制地址(共享引用)。 - 深克隆:对引用类型也创建新对象并复制内容,原对象与克隆对象完全独立。
示例:User 类实现深克隆
public class User implements Cloneable {
private int[] data; // 引用类型属性
@Override
protected Object clone() throws CloneNotSupportedException {
// 1. 浅克隆得到对象(基本类型已复制,引用类型仍共享地址)
User user = (User) super.clone();
// 2. 对引用类型(数组)进行深克隆
int[] newData = new int[this.data.length];
for (int i = 0; i < this.data.length; i++) {
newData[i] = this.data[i]; // 复制数组内容
}
user.data = newData; // 替换克隆对象的引用
return user;
}
}
区别验证:
- 浅克隆:修改原对象的引用类型属性(如数组),克隆对象的对应属性会同步变化。
- 深克隆:修改原对象的引用类型属性,克隆对象不受影响。
五、总结
Object 类作为 Java 类的根基,其核心方法为所有对象提供了基础行为规范:
toString():通过重写实现对象内容的可读性展示,便于打印与调试。equals():默认比较地址,重写后可实现属性级别的相等性判断,需注意与==的区别及不同类的实现差异。clone():通过实现Cloneable接口和重写方法实现对象复制,需区分浅克隆(共享引用)与深克隆(完全独立)。
掌握这些方法的默认行为与重写技巧,能帮助我们更规范地设计类结构,提升代码的可读性、可靠性与灵活性,是 Java 面向对象编程的基础技能。
1348

被折叠的 条评论
为什么被折叠?



