Object类有哪些方法?各有什么作用?

本文详细介绍了Java中Object类的13个方法,包括clone、getClass、toString、finalize、equals、hashCode、wait、notify和notifyAll等,并解释了finalize方法的作用及垃圾回收机制的相关知识。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

直接一点上图(使用的是JDK1.7的源码):Object类总共13个方法

1.clone方法

保护方法,实现对象的浅复制,只有实现了Cloneable接口才可以调用该方法,否则抛出CloneNotSupportedException异常。

主要是JAVA里除了8种基本类型传参数是值传递,其他的类对象传参数都是引用传递,我们有时候不希望在方法里讲参数改变,这是就需要在类中复写clone方法。

2.getClass方法

final方法,获得运行时类型。

3.toString方法

该方法用得比较多,一般子类都有覆盖。

4.finalize方法

该方法用于释放资源。因为无法确定该方法什么时候被调用,很少使用。

5.equals方法

该方法是非常重要的一个方法。一般equals和==是不一样的,但是在Object中两者是一样的。子类一般都要重写这个方法。

6.hashCode方法

该方法用于哈希查找,可以减少在查找中使用equals的次数,重写了equals方法一般都要重写hashCode方法。这个方法在一些具有哈希功能的Collection中用到。

一般必须满足obj1.equals(obj2)==true。可以推出obj1.hash- Code()==obj2.hashCode(),但是hashCode相等不一定就满足equals。不过为了提高效率,应该尽量使上面两个条件接近等价。

如果不重写hashcode(),在HashSet中添加两个equals的对象,会将两个对象都加入进去。

7.wait方法

wait方法就是使当前线程等待该对象的锁,当前线程必须是该对象的拥有者,也就是具有该对象的锁。wait()方法一直等待,直到获得锁或者被中断。wait(long timeout)设定一个超时间隔,如果在规定时间内没有获得锁就返回。

调用该方法后当前线程进入睡眠状态,直到以下事件发生。

(1)其他线程调用了该对象的notify方法。

(2)其他线程调用了该对象的notifyAll方法。

(3)其他线程调用了interrupt中断该线程。

(4)时间间隔到了。

此时该线程就可以被调度了,如果是被中断的话就抛出一个InterruptedException异常。

8.notify方法

该方法唤醒在该对象上等待的某个线程。

9.notifyAll方法

该方法唤醒在该对象上等待的所有线程。

二、finalize()的作用

Java允许在类中定义一个名为finalize()的方法。它的工作原理是:一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用其finalize()方法。并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存。

关于垃圾回收,有三点需要记住:

  1、对象可能不被垃圾回收。只要程序没有濒临存储空间用完的那一刻,对象占用的空间就总也得不到释放。

  2、垃圾回收并不等于“析构”。

  3、垃圾回收只与内存有关。使用垃圾回收的唯一原因是为了回收程序不再使用的内存。

finalize()的用途:

  无论对象是如何创建的,垃圾回收器都会负责释放对象占据的所有内存。这就将对finalize()的需求限制到一种特殊情况,即通过某种创建对象方式以外的方式为对象分配了存储空间。不过这种情况一般发生在使用“本地方法”的情况下,本地方法是一种在Java中调用非Java代码的方式。

为什么不能显示直接调用finalize方法?
  如前文所述,finalize方法在垃圾回收时一定会被执行,而如果在此之前显示执行的话,也就是说finalize会被执行两次以上,而在第一次资源已经被释放,那么在第二次释放资源时系统一定会报错,因此一般finalize方法的访问权限和父类保持一致,为protected。

<think>我们被要求回答Object有哪些方法,并且每个方法作用是什么。 在Java中,Object是所有的父,因此它的方法会被所有继承。 根据Java版本的不同,Object方法可能有所增减,但核心方法是稳定的。 这里我们以Java 17为标准(当前主流稳定版本),列出Object方法及其作用。 注意:在回答中,我们需要列出所有Object方法,并简要说明每个方法作用。 然后,在最后按照要求提出3-5个相关问题,并以“§§相关问题§§”开头。 以下是Object方法(共11个方法): 1. public final native Class<?> getClass(); 2. public native int hashCode(); 3. public boolean equals(Object obj); 4. protected native Object clone() throws CloneNotSupportedException; 5. public String toString(); 6. public final native void notify(); 7. public final native void notifyAll(); 8. public final native void wait(long timeout) throws InterruptedException; 9. public final void wait(long timeout, int nanos) throws InterruptedException; 10. public final void wait() throws InterruptedException; 11. protected void finalize() throws Throwable; // 注意:从Java9开始,此方法被标记为deprecated 另外,在Java 9中引入了一个新的方法,但它是私有的,用于在对象初始化后调用,开发者不可直接使用: private static native void registerNatives(); 但是,我们通常认为registerNatives是Object中用于初始化JNI的方法,不需要开发者关注。 因此,我们主要关注上面11个方法。 下面我们按照要求进行回答:</think># Java Object方法详解 ObjectJava中所有的超,每个Java都直接或间接继承自Object。它提供了11个核心方法,构成了Java对象的基础行为机制。 ## Object核心方法列表 ### 1. `public final native Class<?> getClass()` - **作用**:返回对象的运行时 - **特点**: - 通过`Class`对象可获取名、包名、父、接口、字段、方法等元信息 - 常用于反射操作 ```java String s = "hello"; Class<?> clazz = s.getClass(); // 返回java.lang.String ``` ### 2. `public native int hashCode()` - **作用**:返回对象的哈希码值 - **契约**: - 同一对象多次调用应返回相同值 - 两个对象`equals()`为true时,必须返回相同哈希码 - 哈希码不要求唯一,但应尽量分散(减少哈希碰撞) ```java Map<Object, String> map = new HashMap<>(); map.put(key, value); // HashMap内部使用hashCode() ``` ### 3. `public boolean equals(Object obj)` - **作用**:判断对象是否逻辑相等 - **契约**: - 自反性:`x.equals(x)` 为true - 对称性:`x.equals(y)`与`y.equals(x)`结果相同 - 传递性:`x.equals(y)`且`y.equals(z)`则`x.equals(z)` - 一致性:多次调用结果相同 - 非空性:`x.equals(null)` 返回false ```java String a = "abc"; String b = new String("abc"); a.equals(b); // true (内容相同) ``` ### 4. `protected native Object clone() throws CloneNotSupportedException` - **作用**:创建并返回对象的副本 - **实现要求**: - 必须实现`Cloneable`接口 - 默认实现是浅拷贝 - 重写时应考虑深拷贝需求 ```java class Person implements Cloneable { String name; public Person clone() { try { return (Person) super.clone(); } catch (CloneNotSupportedException e) { throw new AssertionError(); } } } ``` ### 5. `public String toString()` - **作用**:返回对象的字符串表示 - **默认实现**:`名@哈希码十六进制` - **最佳实践**: - 所有重要都应重写 - 输出应包含关键字段信息 ```java // 重写示例 @Override public String toString() { return "Person{name='" + name + "', age=" + age + "}"; } ``` ### 6. `public final native void notify()` - **作用**:唤醒在此对象监视器上等待的单个线程 - **使用要求**: - 必须在同步代码块中调用(持有对象锁) - 随机选择一个等待线程唤醒 ```java synchronized(lock) { lock.notify(); // 唤醒一个等待线程 } ``` ### 7. `public final native void notifyAll()` - **作用**:唤醒在此对象监视器上等待的所有线程 - **使用场景**: - 多个线程等待同一资源时 - 比`notify()`更安全(避免线程饥饿) ```java synchronized(lock) { lock.notifyAll(); // 唤醒所有等待线程 } ``` ### 8. `public final void wait() throws InterruptedException` - **作用**:使当前线程等待,直到被其他线程唤醒 - **行为特点**: - 释放对象锁 - 线程进入WAITING状态 - 可被中断(抛出InterruptedException) ```java synchronized(lock) { while(!condition) { lock.wait(); // 释放锁并等待 } } ``` ### 9. `public final void wait(long timeout) throws InterruptedException` - **作用**:带超时时间的等待(毫秒) - **特殊值**: - timeout=0:无限等待(同wait()) - timeout>0:最多等待指定毫秒数 ```java synchronized(lock) { lock.wait(5000); // 最多等待5秒 } ``` ### 10. `public final void wait(long timeout, int nanos) throws InterruptedException` - **作用**:更高精度的超时等待 - **参数**: - timeout:毫秒 - nanos:纳秒(0-999999) - **计算**:总等待时间 = timeout + (nanos > 0 ? 1 : 0) ```java synchronized(lock) { lock.wait(3000, 500000); // 等待3.5秒 } ``` ### 11. `protected void finalize() throws Throwable` - **作用**:对象被垃圾回收前的清理钩子 - **重要变化**: - Java 9开始标记为`@Deprecated` - Java 18中正式移除 - **替代方案**: - 使用`Cleaner`和`PhantomReference` - 显式资源关闭(try-with-resources) ```java // 过时方法(不推荐使用) @Override protected void finalize() throws Throwable { try { resource.close(); } finally { super.finalize(); } } ``` ## 方法使用注意事项 1. **线程同步方法**: - `wait()/notify()/notifyAll()`必须持有对象锁 - 推荐使用`java.util.concurrent`包的现代同步工具 2. **对象相等性**: - 重写`equals()`必须同时重写`hashCode()` - 使用Objects.equals()避免空指针 3. **克隆限制**: - 数组默认实现深拷贝 - 引用型字段需要特殊处理 4. **finalize替代**: ```java // Java 9+推荐方式 Cleaner cleaner = Cleaner.create(); cleaner.register(this, () -> resource.close()); ``` ## 方法总结 | 别 | 方法 | |--------------|------------------------------------------| | 对象信息 | getClass(), toString() | | 对象相等性 | hashCode(), equals() | | 对象复制 | clone() | | 线程通信 | wait(), notify(), notifyAll() | | 资源清理 | finalize() (已弃用) |
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值