Object、Objects
具体信息请查看 API 帮助文档
5. Object
Object类所在包是java.lang包。Object 是类层次结构的根,每个类都可以将 Object 作为超类(父类)。
5.1 概述及功能
所有类都直接或者间接的继承自Object类。Object类定义了一些基本的方法,对于所有对象都是通用的。
以下是Object类的主要功能:
-
equals()方法:Object类提供了用于比较对象是否相等的equals()方法。在默认情况下,equals()方法通过比较对象的引用来确定它们是否相等。但是,它可以被子类重写以提供自定义的相等性比较规则。
-
hashCode()方法:Object类定义了hashCode()方法,用于返回对象的散列码(哈希码)。hashCode()方法经常与equals()方法一起使用,以确保相等的对象具有相等的哈希码。hashCode()方法也可以被子类重写以提供自定义的哈希码实现。
-
toString()方法:Object类提供了toString()方法,用于返回对象的字符串表示。默认实现返回由类名、@符号和对象的散列码组成的字符串。可以通过在子类中重写toString()方法来提供更具信息性的字符串表示形式。
-
getClass()方法:Object类的getClass()方法返回对象的运行时类。它返回一个Class对象,该对象包含有关类的元数据信息。
-
垃圾回收:Object类定义了finalize()方法,当垃圾回收器准备回收对象时,会调用该方法。finalize()方法允许对象在被销毁之前执行一些清理操作。
-
wait()、notify()和notifyAll()方法:Object类提供了用于线程间通信的wait()、notify()和notifyAll()方法。这些方法可以与synchronized关键字一起使用,以实现多线程之间的同步和协作。
5.2 常用方法
下表列出了Object类的所有方法,并提供简单的说明和示例:
方法名 | 说明 | 示例 |
---|---|---|
boolean equals(Object obj) | 比较对象是否相等。默认通过比较引用来判断,可以被子类重写。 | Integer x = 5; Integer y = 5; x.equals(y); // true |
int hashCode() | 返回对象的哈希码。默认实现基于对象的内存地址,可以被子类重写。 | String str = "Hello"; str.hashCode(); // 69609650 |
Class<?> getClass() | 返回对象的运行时类。 | String str = "Hello"; str.getClass(); // class java.lang.String |
String toString() | 返回对象的字符串表示。默认返回类名、@符号和散列码的组合,可以被子类重写。 | Integer num = 10; num.toString(); // "10" |
void notify() | 唤醒在该对象上等待的单个线程。 | synchronized (obj) { obj.notify(); } |
void notifyAll() | 唤醒在该对象上等待的所有线程。 | synchronized (obj) { obj.notifyAll(); } |
void wait() | 使当前线程等待,直到该对象收到notify或notifyAll通知。 | synchronized (obj) { obj.wait(); } |
void finalize() | 垃圾回收器准备回收对象时调用,允许对象进行一些清理操作。 | protected void finalize() throws Throwable {...} |
这些方法为所有Java对象提供了通用的行为和功能。
equals()
和hashCode()
方法用于比较对象的相等性和生成唯一标识。toString()
方法返回对象的字符串表示形式,方便输出调试信息。getClass()
方法返回对象的运行时类,用于获取类的元数据信息。wait()
、notify()
和notifyAll()
方法用于实现线程间通信和同步。finalize()
方法在对象被垃圾回收前执行清理操作。
5.2.1 toString()方法的重写
重写toString()
方法的格式为:
@Override
public String toString() {
// 生成对象字符串表示的逻辑
}
重写toString()
方法的原因是为了提供更有意义和可读性的对象字符串表示,方便调试和输出信息。
例如:假设我们有一个Student
类,表示一个学生的信息,包含学生的姓名、年龄和学号属性。
-
没有重写
toString()
方法的情况调用默认
toString()
方法返回的是对象的类名、@符号和散列码的组合。示例代码如下:
public class Student { private String name; private int age; private int studentNumber; public Student(String name, int age, int studentNumber) { this.name = name; this.age = age; this.studentNumber = studentNumber; } // 没有重写toString()方法 public static void main(String[] args) { Student student = new Student("Tom", 18, 12345); System.out.println(student.toString()); } }
输出结果:
Student@<散列码>
这个输出结果不够直观,无法直观地看到一个学生的具体信息。
-
重写
toString()
方法的情况返回一个更有意义和可读性的对象字符串表示。
示例代码如下:
public class Student { private String name; private int age; private int studentNumber; public Student(String name, int age, int studentNumber) { this.name = name; this.age = age; this.studentNumber = studentNumber; } @Override public String toString() { return "Student [name=" + name + ", age=" + age + ", studentNumber=" + studentNumber + "]"; } public static void main(String[] args) { Student student = new Student("Tom", 18, 12345); System.out.println(student.toString()); } }
输出结果:
Student [name=Tom, age=18, studentNumber=12345]
通过重写
toString()
方法,我们返回了一个包含学生姓名、年龄和学号的字符串,这样就更方便看到一个学生的具体信息。
5.2.2 equals方法的重写
重写equals()
方法的格式为:
@Override
public boolean equals(Object obj) {
// 判断传入的对象是否与当前对象相等的逻辑
}
重写equals()
方法的原因是为了自定义对象之间的相等性判断逻辑,以便符合需求。
例如:假设我们有一个Person
类表示一个人的信息,包含姓名和年龄属性。
-
没有重写
equals()
方法的情况默认情况下,调用
equals()
方法会使用对象的引用地址进行比较,判断两个对象是否为同一个对象。示例代码如下:
public class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } // 没有重写equals()方法 public static void main(String[] args)