📜  java.lang.Object的灵活性(1)

📅  最后修改于: 2023-12-03 14:42:21.105000             🧑  作者: Mango

Java.lang.Object的灵活性

Java语言中所有类都继承自java.lang.Object类,主要作用是提供一些通用的方法,因此可以看作是所有类的根类。底层库和框架的核心类库都是基于java.lang.Object开发的。下面介绍java.lang.Object的灵活性以及其在程序设计中的应用。

java.lang.Object的常用方法

java.lang.Object提供了一些通用的方法,如下所示:

  1. equals(Object obj):判断当前对象是否和指定对象相等。
  2. hashCode():返回当前对象的哈希码值。
  3. clone():创建并返回当前对象的一个副本。
  4. toString():返回当前对象的字符串表示。
  5. getClass():返回当前对象所属的类。
  6. notify():唤醒一个在当前对象上等待的线程。
  7. notifyAll():唤醒在当前对象上等待的所有线程。
  8. wait():使当前线程等待,直到另一个线程调用notify()或notifyAll()方法唤醒它。
  9. finalize():在垃圾回收器将当前对象回收之前调用。

这些通用方法为所有Java类提供了很大的灵活性。开发者可以根据实际需求,覆盖这些方法,实现自己的逻辑。

覆盖java.lang.Object方法

通过覆盖java.lang.Object提供的方法,我们可以实现自己的逻辑,比如实现比较几个对象的大小、实现自定义的哈希码等。

equals()方法

equals()方法用于判断当前对象是否和指定对象相等。如果两个对象相等,它们的hashCode()方法应该返回相同的值。例如:

public class Student {
    private int id;
    private String name;

    @Override
    public boolean equals(Object obj) {
        if (obj instanceof Student) {
            Student other = (Student) obj;
            return this.id == other.id && this.name.equals(other.name);
        }
        return false;
    }

    @Override
    public int hashCode() {
        return Objects.hash(id, name);
    }
}

在实现equals()方法时,我们一般还需要实现hashCode()方法,确保将相等的对象映射到相同的哈希表桶中。

toString()方法

如果没有覆盖toString()方法,系统会返回当前对象的类名和哈希码的16进制字符串。例如:

public class Student {
    private int id;
    private String name;
}

Student student = new Student(1, "Bob");
System.out.println(student.toString()); // 输出:Student@15db9742

为了方便调试和日志输出,我们通常会实现toString()方法,将对象信息输出为字符串,例如:

public class Student {
    private int id;
    private String name;

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}

Student student = new Student(1, "Bob");
System.out.println(student.toString()); // 输出:Student{id=1, name='Bob'}
compareTo()方法

compareTo()方法用于比较两个对象的大小,如果当前对象小于指定对象,返回负数;如果当前对象大于指定对象,返回正数;如果两个对象相等,返回0。只有实现了Comparable接口的类才能使用该方法。例如:

public class Student implements Comparable<Student> {
    private int id;
    private String name;

    @Override
    public int compareTo(Student o) {
        if (this.id > o.id) {
            return 1;
        } else if (this.id < o.id) {
            return -1;
        } else {
            return 0;
        }
    }
}

Student student1 = new Student(1, "Bob");
Student student2 = new Student(2, "Amy");
System.out.println(student1.compareTo(student2)); // 输出:-1
总结

java.lang.Object的灵活性提供了很大的便利性,能够让开发者根据实际需求轻松实现自己的逻辑。通过重写equals()、hashCode()、toString()和compareTo()等方法,可以让Java程序更加灵活和强大。