Object 类是 Java 中所有类的根类,它定义了一些基本方法,供所有类继承和重写

1. 常用方法

1.1 equals(Object obj)

比较两个对象是否“相等”。默认实现是比较对象的引用地址是否相同,可以在子类中重写实现内容比较。

  • 默认行为:判断引用是否相同。

  • 重写场景:比较内容相等(如 String 类)。

示例:

 String s1 = new String("hello");
 String s2 = new String("hello");
 System.out.println(s1.equals(s2)); // true

1.2 hashCode()

返回对象的哈希码,用于散列存储(如 HashMapHashSet 等)。默认实现基于对象地址,常与 equals 一起重写。

  • 约定

    • 如果两个对象通过 equals 方法相等,它们的 hashCode 必须相等。

    • 如果重写 equals,必须重写 hashCode

示例:

 Object obj = new Object();
 System.out.println(obj.hashCode()); // 输出哈希码

1.3 toString()

返回对象的字符串表示形式。默认实现是对象的类名和内存地址,可以在子类中重写以提供更有意义的描述。

  • 默认格式类名@十六进制哈希值

    这个 "十六进制哈希值" 是通过调用 hashCode() 方法的结果转换成十六进制表示得来的,默认hashcode()实现是基于对象的内存地址根据哈希算法计算得出的,只不过又将结果转换为了16进制

  • 常用场景:日志输出、调试。

示例:

 java复制代码Object obj = new Object();
 System.out.println(obj.toString()); // 类名@哈希码
 ​
 // 重写示例
 @Override
 public String toString() {
     return "Custom String Representation";
 }

1.4 clone()

clone()方法

  • clone是Java提供的一种方法,用来复制对象。

  • 当你调用一个对象的 clone() 方法时,它会创建一个新的对象。

为什么要实现cloneable接口

  • 默认的 clone() 方法由 Object 类定义。如果一个类希望支持克隆,它需要实现 Cloneable 接口,告诉 JVM:**“我支持克隆,你可以调用我的 clone() 方法。”** 否则,调用 clone() 方法时,会抛出 CloneNotSupportedException 异常。

    Cloneable 是一个标记接口,不包含任何方法,只起到一个标记作用。

默认行为:浅拷贝

浅拷贝clone() 方法的默认行为,它的特点是:

1、基本数据类型——会直接复制值

2、引用数据类型——只会复制引用,说白了就是只会复制地址。

通俗地说:

  • 浅拷贝创建的新对象的字段内容看起来一样,但是如果字段是引用类型,它们指向的是同一个内存地址

  • 改变引用类型字段的内容,会影响原对象和克隆对象。

如何实现深拷贝?

深拷贝是指,不仅要复制对象本身,还要复制对象引用类型字段指向的对象。 说白了就是克隆对象和原对象完全独立,修改一个不会影响另一个。

1.5 finalize()

在垃圾回收前调用,主要用于释放资源。不推荐使用,因为垃圾回收时间不确定。

  • 不推荐的原因:垃圾回收不保证及时性,finalize 可能不被调用。

示例:

 @Override
 protected void finalize() throws Throwable {
     System.out.println("Finalize called");
 }

2. 线程相关方法

2.1 wait()

让当前线程进入等待状态,直到另一个线程调用 notify()notifyAll()

  • 必须在同步块(synchronized)中使用。

  • 重载方法

    • wait():无限等待。

    • wait(long timeout):等待指定时间。

    • wait(long timeout, int nanos):等待精确时间。


2.2 notify()

唤醒在当前对象上等待的一个线程(随机唤醒一个)。


2.3 notifyAll()

唤醒在当前对象上等待的所有线程。


3. 其他方法

3.1 getClass()

返回对象的运行时类(Class 对象),用于反射——想要使用反射的话,第一步就是先获取类对象。

示例:

 Object obj = new Object();
 System.out.println(obj.getClass()); // class java.lang.Object

3.2 registerNatives()

这是 Object 类中的一个本地方法,用于 JVM 的内部初始化,不需要手动调用。


总结:Object 类的方法清单

方法名 功能描述
equals(Object obj) 判断对象是否相等(默认是比较引用地址)。
hashCode() 返回对象的哈希码(默认基于内存地址)。
toString() 返回对象的字符串表示(默认是类名@哈希值)。
clone() 返回对象的浅拷贝。
finalize() 在垃圾回收前调用(不推荐使用)。
wait() 使线程等待,直到被唤醒。
notify() 唤醒在当前对象上等待的一个线程。
notifyAll() 唤醒在当前对象上等待的所有线程。
getClass() 返回对象的运行时类(反射时常用)。

面试准备提示

  1. equalshashCode 的关系?

    • 如果两个对象相等(equals 返回 true),它们的 hashCode 必须相等。(这是一种约定)

    • hashCode 不相等时,equals 一定不相等。

  2. toString 在实际开发中的用途?

    • 用于调试和日志输出,重写 toString 提供更有意义的信息。

  3. wait()sleep() 的区别?

    • wait() 释放锁,必须在同步块中使用。

    • sleep() 不释放锁,不需要同步块。

  4. finalize 为什么不推荐?

    • 垃圾回收时间不可控,finalize 可能导致资源泄漏或性能问题。

了解这些方法的用法、注意事项及典型面试问题,能帮助你在实际开发和面试中更加游刃有余

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐