好的,我们来解析Java中 Object 类的核心方法。作为所有Java类的根父类,Object 提供了几个基础方法,这些方法通常会被子类重写以满足特定的需求。以下是其核心方法的解析:
1. equals(Object obj)
- 作用: 用于比较两个对象是否“逻辑相等”。默认实现(即 Object 类中的实现)使用 == 操作符,比较的是两个对象的内存地址是否相同。
- 重写原则: 当我们需要根据对象的内容(属性值)来判断是否相等时,就需要重写此方法。重写时通常需要满足以下约定:
- 自反性: $x.equals(x)$ 应为 true
- 对称性: 若 $x.equals(y)$ 为 true,则 $y.equals(x)$ 也应为 true
- 传递性: 若 $x.equals(y)$ 为 true 且 $y.equals(z)$ 为 true,则 $x.equals(z)$ 也应为 true
- 一致性: 在对象未被修改的前提下,多次调用 $x.equals(y)$ 应返回相同结果
- 非空性: 对于任何非空引用 $x$, $x.equals(null)$ 应返回 false
- 与 == 的区别: == 比较的是引用(内存地址),而 equals 在重写后可以比较内容。
2. hashCode()
- 作用: 返回对象的哈希码值。哈希码是一个 int 类型的整数,通常用于哈希表数据结构(如 HashMap, HashSet) 中快速定位对象。
- 重写原则: 必须与 equals 方法协同工作,并满足以下重要约定:
- 如果两个对象根据 equals 方法是相等的,那么对这两个对象调用 hashCode 方法必须产生相同的整数结果。
- 如果两个对象根据 equals 方法是不相等的,并不严格要求它们的 hashCode 值不同,但为不同的对象产生不同的哈希码值有助于提高哈希表的性能。
- equals 与 hashCode 的关系: 重写 equals 时必须同时重写 hashCode,以确保相等的对象具有相等的哈希码。否则,在使用基于哈希的集合时会导致不可预期的行为(如对象放入 HashSet 后无法正确查找)。
3. toString()
- 作用: 返回对象的字符串表示形式。默认实现返回类名 + @ + 对象的哈希码的无符号十六进制表示(如 java.lang.Object@1b6d3586)。
- 重写原则: 为了提供更有意义、可读性更好的信息,通常会重写此方法,返回包含对象关键属性值的字符串。这对于调试和日志记录非常有用。
4. clone()
- 作用: 创建并返回当前对象的一个副本(拷贝)。
- 特点:
- 方法声明为 protected,意味着只能在类内部或其子类中调用。
- 类必须实现 Cloneable 接口,否则调用 clone() 会抛出 CloneNotSupportedException。
- 默认实现进行的是浅拷贝:它复制原始对象的所有字段值。如果字段是基本类型,则复制值本身;如果字段是对象引用,则复制的是引用值(即新对象和原始对象共享同一个引用指向的对象)。
- 深拷贝: 如果需要拷贝引用的对象本身(而不仅仅是引用),必须在重写的 clone 方法中显式处理这些引用类型的字段。
5. wait(), notify(), notifyAll()
- 作用: 这三个方法用于实现线程间的协作和通信(线程同步)。
- 使用前提: 必须在 synchronized 同步块或方法内部调用。调用它们的对象(通常是共享资源)作为锁对象。
- 功能:
- wait(): 使当前线程等待,直到其他线程调用此对象的 notify() 或 notifyAll() 方法将其唤醒,或者等待超时。
- notify(): 唤醒在此对象的监视器上等待的一个(任意选择的)线程。
- notifyAll(): 唤醒在此对象的监视器上等待的所有线程。
- 替代方案: 在更现代的并发编程中,通常推荐使用 java.util.concurrent 包下的高级工具(如 Lock, Condition)来代替直接使用 wait/notify。
示例:重写 equals 和 hashCode
public class Person {
private String name;
private int age;
// … 构造方法、Getter、Setter 省略 …
@Override
public boolean equals(Object o) {
if (this == o) return true; // 同一个对象
if (o == null || getClass() != o.getClass()) return false; // 类型不同
Person person = (Person) o;
return age == person.age && Objects.equals(name, person.name); // 比较字段内容
}
@Override
public int hashCode() {
return Objects.hash(name, age); // 使用相同的字段计算哈希码
}
}
https://tv.sohu.com/v/dXMvNDQxNzIwNDc5LzY5NTU5NTY5My5zaHRtbA==.html
https://tv.sohu.com/v/dXMvNDQxNzIwNDc5LzY5NTU5NTkxMA5zaHRtbA==.html
https://tv.sohu.com/v/dXMvNDQxNzIwNDc5LzY5NTU5NjAwNw5zaHRtbA==.html
https://tv.sohu.com/v/dXMvNDQxNzIwNDc5LzY5NTU5NjAwMg5zaHRtbA==.html
https://tv.sohu.com/v/dXMvNDQxNzIwNDc5LzY5NTU5NTg0Nw5zaHRtbA==.html
https://tv.sohu.com/v/dXMvNDQxNzIwNDc5LzY5NTU5NTc5Mg5zaHRtbA==.html
https://tv.sohu.com/v/dXMvNDQxNzIwNDc5LzY5NTU5NTU5Mw5zaHRtbA==.html
https://tv.sohu.com/v/dXMvNDQxNzIwNDc5LzY5NTU5NTgzMw5zaHRtbA==.html
https://tv.sohu.com/v/dXMvNDQxNzIwNDc5LzY5NTU5NTY3NA5zaHRtbA==.html
https://tv.sohu.com/v/dXMvNDQxNzIwNDc5LzY5NTU5NTgxNA5zaHRtbA==.html
https://tv.sohu.com/v/dXMvNDQxNzIwNDc5LzY5NTU5NTc2NA5zaHRtbA==.html
https://tv.sohu.com/v/dXMvNDQxNzIwNDc5LzY5NTU5NTgwNg5zaHRtbA==.html
https://tv.sohu.com/v/dXMvNDQxNzIwNDc5LzY5NTU5NTc1Nw5zaHRtbA==.html
https://tv.sohu.com/v/dXMvNDQxNzIwNDc5LzY5NTU5NTc1Ng5zaHRtbA==.html
https://tv.sohu.com/v/dXMvNDQxNzIwNDc5LzY5NTU5NTQ4OQ5zaHRtbA==.html
https://tv.sohu.com/v/dXMvNDQxNzIwNDc5LzY5NTU5NTYzOQ5zaHRtbA==.html
https://tv.sohu.com/v/dXMvNDQxNzIwNDc5LzY5NTU5NTU1MA5zaHRtbA==.html
https://tv.sohu.com/v/dXMvNDQxNzIwNDc5LzY5NTU5NTczMw5zaHRtbA==.html
https://tv.sohu.com/v/dXMvNDQxNzIwNDc5LzY5NTU5NTcyOQ5zaHRtbA==.html
https://tv.sohu.com/v/dXMvNDQxNzIwNDc5LzY5NTU5NTU0MQ5zaHRtbA==.html
https://tv.sohu.com/v/dXMvNDQxNzIwNDc5LzY5NTU5NTQ1Ng5zaHRtbA==.html
https://tv.sohu.com/v/dXMvNDQxNzIwNDc5LzY5NTU5NTUzNQ5zaHRtbA==.html
https://tv.sohu.com/v/dXMvNDQxNzIwNDc5LzY5NTU5NTQ0OA5zaHRtbA==.html
https://tv.sohu.com/v/dXMvNDQxNzIwNDc5LzY5NTU5NDQ0NA5zaHRtbA==.html
https://tv.sohu.com/v/dXMvNDQxNzIwNDc5LzY5NTU5NDYxNw5zaHRtbA==.html
https://tv.sohu.com/v/dXMvNDQxNzIwNDc5LzY5NTU5NDM1Nw5zaHRtbA==.html
https://tv.sohu.com/v/dXMvNDQxNzIwNDc5LzY5NTU5NDM1Mw5zaHRtbA==.html
https://tv.sohu.com/v/dXMvNDQxNzIwNDc5LzY5NTU5NDE4Mg5zaHRtbA==.html
https://tv.sohu.com/v/dXMvNDQxNzIwNDc5LzY5NTU5NDQwMw5zaHRtbA==.html
https://tv.sohu.com/v/dXMvNDQxNzIwNDc5LzY5NTU5NDE3NQ5zaHRtbA==.html
https://tv.sohu.com/v/dXMvNDQxNzIwNDc5LzY5NTU5NDE3MQ5zaHRtbA==.html
https://tv.sohu.com/v/dXMvNDQxNzIwNDc5LzY5NTU5MDk4Ng5zaHRtbA==.html
https://tv.sohu.com/v/dXMvNDQxNzIwNDc5LzY5NTU5MTEyMA5zaHRtbA==.html
https://tv.sohu.com/v/dXMvNDQxNzIwNDc5LzY5NTU5MTExOA5zaHRtbA==.html
理解并正确使用 Object 类的这些核心方法是编写健壮、高效 Java 代码的基础。
网硕互联帮助中心





评论前必须登录!
注册