1.1、概述

java.lang.Object类是Java语言中的根类,即所有类的父类。它中描述的所有方法子类都可以使用。在对象实例化的时候,最终找的父类就是Object。

如果一个类没有特别指定父类, 那么默认则继承自Object类。例如:

  1. public class MyClass /*extends Object*/ {
  2. // ...
  3. }
方法 说明
Object clone() 创建与该对象的类相同的新对象
boolean equals(Object) 比较两对象是否相等
void finalize() 当垃圾回收器确定不存在对该对象的更多引用时,对象垃圾回收器调用该方法
Class getClass() 返回一个对象运行时的实例类
int hashCode() 返回该对象的散列码值
void notify() 激活等待在该对象的监视器上的一个线程
void notifyAll() 激活等待在该对象的监视器上的全部线程
String toString() 返回该对象的字符串表示
void wait() 在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待

其中,toString()、equals() 方法和 getClass() 方法在 Java 程序中比较常用

1.2、toString方法

方法摘要

  • public String toString():返回该对象的字符串表示。

toString方法返回该对象的字符串表示,其实该字符串内容就是对象的类型+@+内存地址值。

由于toString方法返回的结果是内存地址,而在开发中,经常需要按照对象的属性得到相应的字符串表现形式,因此也需要重写它

哈希码(hashCode),每个 Java 对象都有哈希码属性,哈希码可以用来标识对象,提高对象在集合操作中的执行效率。

覆盖重写

如果不希望使用toString方法的默认行为,则可以对它进行覆盖重写。例如自定义的Person类:

  1. public class Person {
  2. private String name;
  3. private int age;
  4. @Override
  5. public String toString() {
  6. return "Person{" + "name='" + name + '\'' + ", age=" + age + '}';
  7. }
  8. // 省略构造器与Getter Setter
  9. }

在IntelliJ IDEA中,可以点击Code菜单中的Generate...,也可以使用快捷键alt+insert,点击toString()选项。选择需要包含的成员变量并确定

1.3 equals方法

方法摘要

  • public boolean equals(Object obj):指示其他某个对象是否与此对象“相等”。

调用成员方法equals并指定参数为另一个对象,则可以判断这两个对象是否是相同的。这里的“相同”有默认和自定义两种方式。

  1. boolean result = obj.equals(Object o);

其中,obj 表示要进行比较的一个对象,o 表示另一个对象

默认地址比较

如果没有覆盖重写equals方法,那么Object类中默认进行==运算符的对象地址比较,只要不是同一个对象,结果必然为false。

对象内容比较

如果希望进行对象的内容比较,即所有或指定的部分成员变量相同就判定两个对象相同,则可以覆盖重写equals方法。例如:

  1. import java.util.Objects;
  2. public class Person {
  3. private String name;
  4. private int age;
  5. @Override
  6. public boolean equals(Object o) {
  7. // 如果对象地址一样,则认为相同
  8. if (this == o)
  9. return true;
  10. // 如果参数为空,或者类型信息不一样,则认为不同
  11. if (o == null || getClass() != o.getClass())
  12. return false;
  13. // 转换为当前类型
  14. Person person = (Person) o;
  15. // 要求基本类型相等,并且将引用类型交给java.util.Objects类的equals静态方法取用结果
  16. return age == person.age && Objects.equals(name, person.name);
  17. }
  18. }

这段代码充分考虑了对象为空、类型一致等问题,但方法内容并不唯一。大多数IDE都可以自动生成equals方法的代码内容。在IntelliJ IDEA中,可以使用Code菜单中的Generate…选项,也可以使用快捷键alt+insert,并选择equals() and hashCode()进行自动代码生成