Java Object 类方法

2025 年 8 月 5 日 | 阅读 8 分钟

在 Java 中,Object 类属于 java.lang 包。它是所有 Java 类的父类,因此位于类层次结构的顶端。这意味着每个 Java 类都直接或间接继承 Object 类的所有方法。这些方法提供了所有 Java 对象共有的基本功能。

Object 类方法

下图显示了 Object 类的一些常用方法。

Object Class Methods in Java

Object.getClass() 方法

它是 Object 类的 final 方法,返回对象的运行时类。我们无法重写此方法。其主要用途是获取对象的特定类信息,包括其名称、父类以及它正在使用的任何接口。

语法

示例:Object.getClass() 方法

编译并运行

输出

Computer
class java.lang.String

Object.toString() 方法

该方法返回该方法的字符串表示(即“文本上表示”该对象)。默认情况下,如果未重写,它将显示一个唯一标识内存中对象的字符串。例如,Demo@1a2b3c4d,其中 Demo 是类名。

由对象所属类的名称、at 符号“@”以及对象的哈希码的无符号十六进制表示组成的字符串。

换句话说,此方法返回一个字符串,该字符串等于

语法

示例:Object.toString() 方法

编译并运行

输出

Book{title='1984', author='George Orwell'} 

Object.equals() 方法

该方法逻辑上比较两个对象,检查两个对象是否相等。注意,该方法不比较引用相等性。

Object 类的 equals 方法实现了对对象最能区分的等价关系;也就是说,对于任何非 null 的引用值 x 和 y,此方法仅当 x 和 y 指向同一对象(x == y 的值为 true)时才返回 true。

示例:Object.equals() 方法

编译并运行

输出

obj1.equals(obj2): false
obj1.equals(obj3): true
obj2.equals(obj3): false

Object.hashCode() 方法

hashCode() 方法返回一个整数值(哈希码),代表对象。对于在基于哈希的集合(如 HashMap、HashSet 和 Hashtable)中使用对象至关重要。

Object 中的默认实现通常基于对象的内存地址返回值。它是一个原生方法,意味着它是在特定于平台的代码中实现的,而不是纯 Java。

当我们尝试重写 equals() 方法时,需要重写 hashCode() 方法。它确保相等的对象具有相同的哈希码。如果对象相等,我们得到相同的哈希码;如果不相等,我们得到不同的哈希码。

示例:Object.hashCode() 方法

编译并运行

输出

obj1.equals(obj2): false
obj1.equals(obj3): true
obj2.equals(obj3): false

Object.clone() 方法

该方法创建并返回(一个新对象)对象的副本。 “副本”的确切含义取决于对象的类。默认情况下,它执行浅拷贝。

该方法支持对象的克隆。要使一个类可克隆,它必须实现 Cloneable 接口(一个标记接口)。如果未实现 Cloneable 接口,则抛出 CloneNotSupportedException。

语法

要了解更多,请参阅 Java 中的对象克隆

示例:Object.clone() 方法

编译并运行

输出

101 Andrew
101 Andrew

Object.finalize() 方法

该方法用于在对象从内存中移除之前对其执行清理操作(例如,关闭打开的文件、释放内存或关闭连接)。它由垃圾回收器在对象上调用。

语法

当垃圾回收器确定对象不再被程序的任何部分引用时,它会执行,表示该对象可以被回收。

Java 虚拟机对任何给定对象都不会调用 finalize 方法超过一次。

注意:不要依赖 finalize() 进行关键的资源清理。

要了解更多,请参阅 Java 中的 finalize() 方法

示例:Object.finalize() 方法

编译并运行

输出

Object created
Main method completed
finalize() is called before an object is garbage collected

Object.wait() 方法

它是用于线程间通信的 final 方法。当前线程将等待,直到另一个线程调用此对象的 notify() 方法或 notifyAll() 方法。

它必须在同步块内调用(否则会得到 IllegalMonitorStateException)。它是一个来自 java.lang.Object 的方法,而不是来自 Thread 的,因此可以用于任何对象。

语法

当前线程必须拥有该对象的监视器。该线程会释放该监视器的所有权,并等待直到另一个线程通过调用 notify 方法或 notifyAll() 方法来唤醒等待在该对象监视器上的线程。然后,该线程会等待直到它能够重新获得监视器的所有权并恢复执行。

示例:Object.wait() 方法

编译并运行

输出

Thread waiting...
Thread notifying...
Thread resumed.

Object.notify() 方法

该方法用于唤醒在该对象监视器上等待的单个线程。如果有任何线程在该对象上等待,将选择其中一个线程唤醒。选择是任意的,并且由实现自行决定。线程通过调用 wait 方法之一来等待对象的监视器。

语法

该方法只能由拥有该对象监视器的线程调用。线程可以通过以下三种方式之一成为对象监视器的所有者

  • 执行该对象的同步实例方法。
  • 执行同步语句体,该语句同步于该对象。
  • 对于 Class 类型的对象,通过执行该类的同步静态方法。

示例:Object.notify() 方法

编译并运行

输出

Consumer waiting...
Producer trying to produce...
Producer produced and notified.
Consumer consumed.

解释

在上面的程序中,Consumer 线程一直等待直到 available 为 true。Producer 设置 available = true 并调用 notify() 来唤醒消费者。消费者恢复执行并处理“已生产”的项。

结论

理解这些 Object 类方法对于有效的 Java 编程至关重要,尤其是在设计类、使用集合或处理并发操作时。正确重写 toString()、equals() 和 hashCode() 是 Java 许多应用程序中可靠对象行为的基础,是一种非常常见且重要的实践。

Object 类方法选择题

1) Java 中的每个类,无论是否显式扩展,都直接或间接继承自 _____ 类。

  1. String
  2. System
  3. Object
  4. Class
 

答案:c)

解释:所有 Java 类都继承自 Object。


2) 公共 final Class<?> getClass() 方法可靠地告诉我们对象的精确 _____。

  1. 内存地址
  2. 运行时类
  3. 哈希码
  4. 包名
 

答案: b)

解释:getClass() 揭示了对象在运行时确切的类型。


3) 重写 equals() 方法时,还必须重写 _____ 以维护其通用约定。

  1. toString()
  2. clone()
  3. hashCode()
  4. finalize()
 

答案:c)

解释:为了正确行为,equals() 和 hashCode() 必须保持一致。


4) 要使一个类支持使用 clone() 方法进行对象克隆,它必须实现 _____ 接口。

  1. Serializable
  2. Comparable
  3. Runnable
  4. Cloneable
 

答案: d)

解释:clone() 需要 Cloneable 接口才能工作。


5) 在现代 Java 中,由于 finalize() 方法不可预测的性质以及存在更好的资源管理实践,它通常被 _____。

  1. 推荐
  2. 鼓励
  3. 不推荐
  4. 必需
 

答案:c)

解释:finalize() 是不可靠的,其使用不被推荐。


下一个主题一维数组(Java)