object的常用方法
在面向对象编程中,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;}@Overridepublic 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;}@Overrideprotected 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
:用于创建对象的副本。
这些方法在日常开发中非常重要,建议熟悉它们的用法和注意事项。