Object
类是 Java 类层次结构中的根类,所有类都直接或间接地继承自 Object
类。因此,Object
类中的方法可以被所有 Java 对象使用。下面是 Object
类的一些关键方法及其用途:
Object
类的方法
-
public final Class<?> getClass()
返回对象的运行时类。Object obj = new String("Hello"); Class<?> clazz = obj.getClass(); System.out.println(clazz.getName()); // 输出: java.lang.String
-
public int hashCode()
返回对象的哈希码值。默认情况下,哈希码值与对象的内存地址有关。有可能不同对象拥有相同的哈希码值。Object obj = new Object(); int hashCode = obj.hashCode(); System.out.println(hashCode);
-
public boolean equals(Object obj)
判断两个对象是否相等。默认实现是比较对象的内存地址,可以在子类中重写以实现自定义的相等逻辑。Object obj1 = new Object(); Object obj2 = new Object(); System.out.println(obj1.equals(obj2)); // 输出: false
-
protected Object clone() throws CloneNotSupportedException
创建并返回对象的副本。类必须实现Cloneable
接口并重写clone
方法。class MyClass implements Cloneable { @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } }
-
public String toString()
返回对象的字符串表示形式。默认实现是类名 + “@” + 哈希码的十六进制表示,可以在子类中重写。Object obj = new Object(); System.out.println(obj.toString()); // 输出: java.lang.Object@<hashcode>
-
public final void notify()
唤醒在此对象监视器上等待的单个线程。必须在同步方法或同步块中调用。synchronized(obj) { obj.notify(); }
-
public final void notifyAll()
唤醒在此对象监视器上等待的所有线程。必须在同步方法或同步块中调用。synchronized(obj) { obj.notifyAll(); }
-
public final void wait()
导致当前线程等待,直到其他线程调用此对象的notify()
或notifyAll()
方法。必须在同步方法或同步块中调用。synchronized(obj) { obj.wait(); }
-
public final void wait(long timeout)
导致当前线程等待,直到其他线程调用此对象的notify()
或notifyAll()
方法,或者经过指定的时间。synchronized(obj) { obj.wait(1000L); // 等待1秒 }
-
public final void wait(long timeout, int nanos)
导致当前线程等待,直到其他线程调用此对象的notify()
或notifyAll()
方法,或者经过指定的时间(以毫秒和纳秒为单位)。synchronized(obj) { obj.wait(1000L, 500); // 等待1秒和500纳秒 }
-
protected void finalize() throws Throwable
在垃圾回收时由垃圾回收器调用,子类可以重写此方法以清理资源。但是,不推荐使用finalize
方法,因为它是不可靠和不确定的。
示例代码
下面是一个示例,展示了如何重写 Object
类的一些方法:
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);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + "}";
}
public static void main(String[] args) {
Person p1 = new Person("Alice", 30);
Person p2 = new Person("Alice", 30);
Person p3 = new Person("Bob", 25);
System.out.println(p1.equals(p2)); // 输出: true
System.out.println(p1.equals(p3)); // 输出: false
System.out.println(p1.hashCode()); // 输出: 具体的哈希码值
System.out.println(p1.toString()); // 输出: Person{name='Alice', age=30}
}
}
总结
1.Object
类是所有类的根类,提供了一些基础方法,如 equals
、hashCode
、toString
、clone
、notify
、wait
等。
2.可以根据需求在子类中重写这些方法,以实现自定义的行为。
3. Object
类的方法在实现多线程同步、对象比较和对象字符串表示等方面非常重要。