Object类的常见方法总结

本文深入解析Java中Object类的方法,包括getClass(), hashCode(), equals(), clone(), toString(), notify(), notifyAll(), wait()及finalize()。解释了这些方法的作用,如对象复制、线程同步和垃圾回收,并介绍了native方法的概念。

我们先来看一下Object类的源码:

package java.lang;
public class Object {
	public final native Class<?> getClass()
	
	public native int hashCode()
	
	public boolean equals(Object obj)
	
	protected native Object clone() throws CloneNotSupportedException
	
	public String toString()
	
	public final native void notify()
	
	public final native void notifyAll()
	
	public final native void wait(long timeout) throws InterruptedException
	
	public final void wait(long timeout, int nanos) throws InterruptedException
	
	public final void wait() throws InterruptedException

	protected void finalize() throws Throwable { } 
}

1.getclass():native方法,用于返回运行时对象的Class方法,因为使用了final的修饰词,所以不能被继承。
2.hashCode():native方法,用于返回对象的哈希码,主要用于哈希表中,比如JDK的HashMap。
3.equals(Object obj):用于比较2个对象的内存地址是否相同,String类对该方法进行了重写,用于用户比较字符串的值是否相等。
4.clone():native方法,用于创建并返回 当前对象的拷贝。一般情况下,对于任何对象a,表达式a.clone()!=a; 表达式的结果为true(a.clone()操作后返回的a’内容和a相同,但是他们的地址不同),表达式a.clone().getClass() == a.getClass(),表达式的结果为true。
5.toString():返回类的名字。建议Object所有的子类都重写这个方法。
6.notify():native方法,因为final修饰,所以不能被重写。唤醒一个在此对象监视器上等待的的线程。如果有多个线程在等待,只会任意唤醒一个。
7.notifyAll():native方法,因为final修饰,所以不能被重写。跟notify()方法一样,唯一的区别就是会唤醒在此对象监视器上等待的所有线程。
8.wait(long timeout):native方法,因为final修饰,所以不能被重写。暂停线程的进行。timeout表示等待时间。
9.wait(long timeout, int nanos):第8个方法的重载方法,多了一个nanos参数,表示额外时间(以毫微秒为单位,范围是0~999999),所以等待时间还需要加上nanos。
10.wait():第8个方法的重载方法,这个表示一直等待,没有时间。
11.finalize():实例被垃圾回收器回收的时候触发的操作。

温馨补充:
native方法是什么意思?
native关键字说明其修饰的方法是一个原生态方法,方法对应的实现不是在当前文件,而是在用其他语言(如C和C++)实现的文件中。Java语言本身不能对操作系统底层进行访问和操作,但是可以通过JNI接口调用其他语言来实现对底层的访问。

<think>好的,我现在需要回答用户关于Object常用方法的问题。首先,我得回想一下Java中的Object,因为它是所有的父,所以每个对象都继承自Object,对吧?用户可能想知道这些方法的作用和使用场景。 首先,我记得Object有几个关键方法,比如toString()、equals()、hashCode(),这三个应该是最常用的。toString()用于返回对象的字符串表示,默认实现可能不太有用,所以通常会被覆盖。equals()和hashCode()通常一起被提及,因为重写equals时通常也要重写hashCode,特别是当对象用于哈希表的时候。 接下来是getClass(),这个方法返回对象的运行时,可能在反射中使用。然后wait()、notify()、notifyAll()这些方法用于线程间的通信,属于多线程的内容。不过用户可能想知道它们的基本作用,而具体的线程同步机制可能需要更多上下文。 还有finalize()方法,不过我记得这个方法现在已经被废弃了,因为Java 9之后不推荐使用,因为它有性能问题和不确定性。用户可能需要注意这一点,避免在新代码中使用它。 clone()方法用于创建对象的一个副本,但需要实现Cloneable接口,否则会抛出CloneNotSupportedException。这个方法是浅拷贝,如果需要深拷贝,可能需要自己实现。 接下来,我需要组织这些信息,按重要性排序,可能先讲最常用的,然后是次常用的。同时要说明每个方法的默认行为和为什么要覆盖它们,以及使用时的注意事项。例如,默认的equals()比较的是对象引用,而不是内容,所以如果需要内容比较,必须重写。 同时,可能用户会混淆==和equals()的区别,可以简单提一下。比如,==比较的是内存地址,而equals()在没有被覆盖时也是比较地址,但覆盖后可以比较内容。 还需要注意线程相关的方法,如wait()和notify(),属于Object方法,但必须在同步块中使用,否则会抛出IllegalMonitorStateException。这部分可能需要简要说明,但不要深入多线程细节,除非用户特别要求。 另外,hashCode()的约定,如果两个对象相等(equals()返回true),它们的hashCode必须相同,反之则不一定。这个在哈希集合如HashMap中很重要,所以要强调重写equals时必须重写hashCode()。 对于clone()方法,要提到深拷贝和浅拷贝的区别,以及为什么可能需要自己实现深拷贝,或者使用其他方法如复制构造函数或序列化来实现对象的复制。 还有finalize()的替代方案,比如Cleaner或PhantomReference,可以提及但不展开,因为用户可能只需要知道这个方法已经不推荐使用。 最后,总结一下每个方法的用途和使用场景,可能以表格形式列出方法名、作用和注意事项,这样用户看起来更清晰。同时,代码示例可能会有帮助,比如展示如何重写equals和hashCode,或者toString的例子。 需要确保回答结构清晰,分点说明,每个方法单独一个部分,包含方法名、作用、默认实现、覆盖注意事项等。同时,避免技术术语过多,用通俗易懂的中文解释,但保持准确性。 可能还需要检查是否有遗漏的方法,比如registerNatives(),但这个方法通常对开发者不可见,是native方法,不需要用户关心,所以不用提。Object共有9个方法,包括:getClass(), hashCode(), equals(), clone(), toString(), notify(), notifyAll(), wait(), finalize()。确认是否都覆盖到了。 在组织内容时,可以先总体介绍Object的重要性,然后逐个方法说明,每个方法下分要点。例如: 1. toString() - 作用 - 默认实现 - 覆盖示例 2. equals() - 作用 - 默认比较引用 - 需要覆盖的情况 - 与hashCode()的关系 似这样,每个方法都详细说明。确保用户能理解每个方法的使用场景和注意事项。此外,可能需要强调哪些方法需要同步使用,比如wait()和notify()必须在synchronized块中调用。 最后,可能总结一下最佳实践,比如总是覆盖toString()以提供有用的信息,正确重写equals和hashCode,避免使用finalize()等。这样用户不仅知道方法的存在,还知道如何正确使用它们。</think>在Java中,`Object`是所有的根父,其定义的方法会被所有对象继承。以下是`Object`中**最常用的方法**及其核心作用,按重要性和使用频率排序: --- ### **1. `toString()`:对象字符串表示** - **作用**:返回对象的可读字符串,默认格式为`名@哈希值`。 - **覆盖场景**:调试或日志输出时需明确展示对象内容。 - **示例**: ```java @Override public String toString() { return "Person{name='" + name + "', age=" + age + "}"; } ``` --- ### **2. `equals(Object obj)`:对象等价性判断** - **作用**:默认比较对象**内存地址**是否相同(即`==`的效果)。 - **覆盖规则**: - 若重写`equals()`,必须同时重写`hashCode()`(哈希集合依赖此规则)。 - 需满足自反性、对称性、传递性、一致性。 - **示例**: ```java @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); } ``` --- ### **3. `hashCode()`:生成哈希码** - **作用**:返回对象的整数哈希值,用于哈希表(如`HashMap`)快速查找。 - **核心规则**: - 等价对象必须返回相同哈希码。 - 不等价对象尽量返回不同哈希码(减少哈希冲突)。 - **示例**: ```java @Override public int hashCode() { return Objects.hash(name, age); // 使用工具简化计算 } ``` --- ### **4. `getClass()`:获取运行时信息** - **作用**:返回对象所属的`Class`对象,常用于反射或型检查。 - **示例**: ```java Class<?> clazz = obj.getClass(); System.out.println("名: " + clazz.getName()); ``` --- ### **5. `clone()`:对象克隆** - **作用**:创建对象的副本(浅拷贝)。 - **使用条件**: - 需实现`Cloneable`标记接口,否则抛出`CloneNotSupportedException`。 - 若需深拷贝,需手动复制引用型字段。 - **示例**: ```java @Override public Object clone() throws CloneNotSupportedException { return super.clone(); } ``` --- ### **6. 线程通信方法** - **`wait()` / `notify()` / `notifyAll()`**: - **作用**:用于多线程间的等待/唤醒机制。 - **使用限制**:必须在`synchronized`代码块中调用。 - **示例**: ```java synchronized (lock) { lock.wait(); // 释放锁并等待 lock.notify(); // 唤醒单个等待线程 lock.notifyAll(); // 唤醒所有等待线程 } ``` --- ### **7. `finalize()`:对象销毁前清理** - **作用**:对象被垃圾回收前调用的清理方法(不推荐使用)。 - **现状**:Java 9+已标记为`@Deprecated`,建议用`AutoCloseable`或`Cleaner`替代。 --- ### **方法对比总结** | 方法名 | 典型用途 | 必须覆盖的场景 | 注意事项 | |-----------------|-----------------------------|----------------------------------|-----------------------------------| | `toString()` | 调试输出、日志记录 | 需要明确对象内容时 | 默认输出无意义 | | `equals()` | 内容等价比较 | 需要基于字段值判断相等时 | 必须与`hashCode()`同步覆盖 | | `hashCode()` | 哈希表存储 | 重写`equals()`后必须重写 | 保证等价对象哈希码一致 | | `clone()` | 创建对象副本 | 需要复制对象时 | 浅拷贝需谨慎,深拷贝需自定义实现 | | `getClass()` | 反射、型检查 | 需要动态获取型信息时 | 直接关联JVM运行时型 | | 线程通信方法 | 多线程协作 | 线程间协调执行顺序 | 必须与`synchronized`配合使用 | --- ### **最佳实践** 1. **始终覆盖`toString()`**:提升代码可读性和调试效率。 2. **谨慎重写`equals()`和`hashCode()`**:确保遵守等价性契约。 3. **避免使用`finalize()`**:改用显式资源管理(如`try-with-resources`)。 4. **优先使用工具**:`Objects.equals()`和`Objects.hash()`可简化代码。 ```java // 安全实现equals()和hashCode()的模板 @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; MyClass obj = (MyClass) o; return Objects.equals(field1, obj.field1) && Objects.equals(field2, obj.field2); } @Override public int hashCode() { return Objects.hash(field1, field2); } ``` 掌握这些方法的核心逻辑,能更高效地处理对象生命周期、等价性判断和多线程协作等关键问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值