您的位置:

Java中的Object类

在Java中,每一个对象都是从Object类继承而来。Object类是Java中所有类的祖先类,也是Java中最基本的类。

一、Object类的概述

Object类是所有Java类的父类。如果在类的声明中没有使用extends关键字指定父类,则默认继承自Object类。

Object类中有一些基本的方法,它们在其它类中也都可以使用。这些方法包括:

  • public boolean equals(Object obj):判断当前对象与另一个对象是否相等。
  • public int hashCode():返回当前对象的哈希值。
  • public String toString():返回当前对象的字符串表示。
  • public final void notify():唤醒在当前对象上等待的单个线程。
  • public final void notifyAll():唤醒在当前对象上等待的所有线程。
  • public final void wait() throws InterruptedException:使当前线程等待,直到另一个线程调用该对象的notify()方法或notifyAll()方法。
  • public final void wait(long timeout) throws InterruptedException:使当前线程等待指定的毫秒数,直到另一个线程调用该对象的notify()方法或notifyAll()方法。
  • public final void wait(long timeout, int nanos) throws InterruptedException:使当前线程等待指定的毫秒数和纳秒数,直到另一个线程调用该对象的notify()方法或notifyAll()方法。
  • protected void finalize() throws Throwable:当垃圾收集器确定没有对该对象的更多引用时,会调用这个方法来清理对象。

二、Object类中的方法

1. equals方法

equals方法是用来判断两个对象是否相等的。这个方法最初是在Object类中定义的,所有的Java类都继承了这个方法。然而,在默认情况下,equals方法将比较对象的引用,而不是对象的值。因此,需要重写equals方法,以便在自己的类中比较对象的值。

class Student {
    private String name;
    private int age;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public boolean equals(Object obj) {
        if (obj == this) {
            return true;
        }

        if (!(obj instanceof Student)) {
            return false;
        }

        Student student = (Student) obj;

        return this.name.equals(student.name) && this.age == student.age;
    }
}

Student s1 = new Student("Alice", 20);
Student s2 = new Student("Alice", 20);

System.out.println(s1.equals(s2)); // 输出true

2. hashCode方法

hashCode方法返回当前对象的哈希码值,它是一个整数。在Java中,哈希码值用于存储对象,在 HashMap、HashSet等集合类中,对象的哈希值决定了对象在集合中的存储位置。

Object类中默认的hashCode方法返回的是对象的内存地址。

Student s1 = new Student("Alice", 20);
System.out.println(s1.hashCode()); // 输出1956725890

如果要重写hashCode方法,需要满足以下两个条件:

  • 当两个对象相等时,它们的hashCode方法应该返回相同的值。
  • 当两个对象不相等时,它们的hashCode方法返回值可以相同,也可以不同。

3. toString方法

toString方法返回一个代表对象字符串的字符串。默认情况下,toString方法返回的是对象类的名字和该对象的哈希码值的十六进制表示。

Student s1 = new Student("Alice", 20);
System.out.println(s1.toString()); // 输出"Student@4554617c"

可以重写toString方法,以便返回更有意义的字符串,方便调试和日志记录。

class Student {
    private String name;
    private int age;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String toString() {
        return "Student(name=" + this.name + ", age=" + this.age + ")";
    }
}

Student s1 = new Student("Alice", 20);
System.out.println(s1.toString()); // 输出"Student(name=Alice, age=20)"

4. finalize方法

finalize方法是Java中的垃圾回收机制使用的方法。它在对象成为垃圾之前被调用,用于释放对象占用的资源。

在垃圾回收机制运行时,会搜索内存中的对象,并把被判定为垃圾的对象加入队列中。当垃圾回收器判定对象为可终结状态时,它会调用对象的finalize方法,清理对象占用的资源。

三、总结

在Java中,所有类都继承自Object类。Object类包含了一些基本的方法,例如equals、hashCode、toString和finalize方法。

这些方法可以在自定义类中进行重写,以便满足实际情况的需求,方便对象值比较、哈希码值计算、字符串表示和垃圾回收操作。