在面向对象编程中,Object
类是所有类的根类,它提供了一些基本的方法,这些方法可以被所有对象继承和使用。以下是一些在 Java 中 Object
类的常用方法,以及它们的作用和使用示例:
1. equals(Object obj)
-
作用:用于比较两个对象是否相等。默认情况下,比较的是对象的内存地址,但通常会在子类中重写该方法以实现逻辑相等性。
-
默认比较对象引用,可被重写来比较对象的内容。
-
示例
public class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } @Override public boolean equals(Object obj) { if (this == obj) return true; // 比较内存地址 if (obj == null || getClass() != obj.getClass()) return false; // 检查是否为同一类 Person person = (Person) obj; return age == person.age && name.equals(person.name); } } Person p1 = new Person("Alice", 30); Person p2 = new Person("Alice", 30); System.out.println(p1.equals(p2)); // 输出:true
2. hashCode()
-
作用:返回对象的哈希码值。默认情况下,返回对象的内存地址的哈希值。如果重写了
equals
方法,通常也需要重写hashCode
方法以保持一致性。 -
示例:
@Override public int hashCode() { return Objects.hash(name, age); // 使用 Objects.hash 方法生成哈希码 }
3. toString()
-
作用:返回对象的字符串表示形式。默认情况下,返回对象的类名和内存地址的十六进制表示。通常会在子类中重写该方法以提供更有意义的字符串表示。
-
示例
@Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } Person p = new Person("Bob", 25); System.out.println(p); // 输出:Person{name='Bob', age=25}
4. getClass()
-
作用:返回对象的运行时类对象(
Class
类的实例)。 -
示例
Person p = new Person("Alice", 30); System.out.println(p.getClass().getName()); // 输出:Person
5. finalize()
-
作用:在对象被垃圾回收器回收之前,由垃圾回收器调用。用于释放资源或进行清理工作。注意:从 Java 9 开始,
finalize
方法已被标记为不推荐使用(@Deprecated
),建议使用其他机制(如try-with-resources
)来管理资源。 -
示例
@Override protected void finalize() throws Throwable { super.finalize(); System.out.println("Object is being garbage collected"); }
6. wait()
、notify()
和 notifyAll()
-
作用:这些方法用于线程间的通信,通常用于多线程编程中的同步机制。
-
wait()
:使当前线程等待,直到其他线程调用notify()
或notifyAll()
。 -
notify()
:唤醒一个等待该对象的线程。 -
notifyAll()
:唤醒所有等待该对象的线程。
-
-
示例
public class SharedResource { private int data; public synchronized void setData(int data) throws InterruptedException { while (this.data != 0) { wait(); // 等待数据被消费 } this.data = data; notifyAll(); // 通知等待的线程 } public synchronized int getData() throws InterruptedException { while (this.data == 0) { wait(); // 等待数据被生产 } int temp = data; data = 0; // 消费数据 notifyAll(); // 通知等待的线程 return temp; } }
7. clone()
-
作用:创建并返回对象的一个副本。默认情况下,
clone()
方法会创建对象的浅拷贝。如果需要深拷贝,需要在子类中重写该方法。 -
条件:要使用
clone()
方法,类必须实现Cloneable
接口,并且重写clone()
方法。 -
示例:
java复制
public class Person implements Cloneable { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } } Person p1 = new Person("Alice", 30); try { Person p2 = (Person) p1.clone(); System.out.println(p2.name); // 输出:Alice } catch (CloneNotSupportedException e) { e.printStackTrace(); }
总结
Object
类提供的这些方法是 Java 中所有对象的基础功能,通过重写这些方法,可以实现更符合业务逻辑的行为。例如:
-
equals
和hashCode
:用于比较对象的逻辑相等性和哈希表操作。 -
toString
:用于提供对象的字符串表示,便于调试和日志记录。 -
wait
、notify
和notifyAll
:用于线程间的同步。 -
clone
:用于创建对象的副本。
这些方法在日常开发中非常重要,建议熟悉它们的用法和注意事项。