一、Object 类基础概述
- 地位 :
java.lang.Object是 Java 中所有类的根父类 。- 如果一个类定义时没有写
extends继承任何类,默认直接继承 Object; - 所有类都间接或直接继承 Object,所以所有对象都能调用 Object 中的方法。
- 如果一个类定义时没有写
- 包说明:
java.lang包下的类,不需要手动 import 导入,直接使用。
口诀:万物皆 Object。
二、Object 类常用方法(重点)
1. toString () 方法
作用
返回对象的字符串描述。
源码
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
- 默认返回:
类名@十六进制哈希值,这个信息对开发基本没用,开发中一般要重写。
代码示例
class Student{
String name;
int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
// 重写toString,返回对象的属性信息
@Override
public String toString() {
return "Student{name='" + name + "', age=" + age + "}";
}
}
public class Test{
public static void main(String[] args) {
Student s = new Student("张三",18);
// 打印对象,底层默认自动调用toString()
System.out.println(s);
// 等价于 System.out.println(s.toString());
}
}
✅ 重点:System.out.println(对象) 会自动调用该对象toString()。 ✅ 开发规范:实体类建议重写 toString,方便打印查看对象数据。
2. equals () 方法
源码
public boolean equals(Object obj) {
return (this == obj);
}
==:- 基本类型:比较值;
- 引用类型:比较对象地址,判断是不是同一个对象。
- Object 原生 equals 本质就是
==,比较对象地址。
什么时候需要重写 equals?
业务需求:只要两个对象的内容(属性)相同,就认为相等,而不是地址相同,就要重写 equals。
重写 equals 示例
class Student{
String name;
int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object o) {
// 1. 如果两个对象地址一样,直接true
if (this == o) return true;
// 2. 判断传入对象是否为null;判断类型是否一致
if (o == null || getClass() != o.getClass()) return false;
// 3. 向下转型
Student student = (Student) o;
// 4. 比较属性
return age == student.age && name.equals(student.name);
}
}
public class Test{
public static void main(String[] args) {
Student s1 = new Student("张三",18);
Student s2 = new Student("张三",18);
System.out.println(s1 == s2); // false,地址不同
System.out.println(s1.equals(s2)); // true,属性相同(重写后)
}
}
⚠易错点:
- 字符串
String类已经重写了 equals ,所以"abc".equals("abc")比较内容;- 自己写的类,不重写 equals,equals 和
==效果一样,比较地址。
3. hashCode () 方法
作用
返回对象的哈希码值(int 整数),哈希码是对象的数字摘要,主要用于哈希集合(HashMap、HashSet)。
规则
- 同一个对象,多次调用
hashCode(),返回值必须相同; - 如果两个对象
equals()返回 true,那么它们的hashCode()必须相等; - 如果两个对象
hashCode()相等,equals()不一定为 true(哈希碰撞)。
✅ 开发规范:重写 equals,必须同时重写 hashCode。
class Student{
String name;
int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return age == student.age && Objects.equals(name, student.name);
}
// 重写hashCode
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
三、Object 其他方法(了解)
-
getClass():返回对象的运行时类型,返回Class对象,反射会用到。Student s = new Student("张三",18);
Class clazz = s.getClass();
System.out.println(clazz.getName()); // 获取类全限定名 -
clone():对象克隆,复制对象,需要类实现Cloneable标记接口,浅拷贝。 -
finalize():对象被垃圾回收前执行,JDK9 之后废弃,不推荐使用。 -
wait()/notify()/notifyAll():多线程等待与唤醒,并发章节学习。
四、对比总结表
| 方法 | 原生功能 | 开发常用操作 |
|---|---|---|
| toString() | 返回类名 @哈希地址 | 重写,输出对象属性 |
| equals() | ==比较对象地址 |
重写,比较对象内容 |
| hashCode() | 返回对象哈希值 | 重写,配合 equals 使用 |
五、常见面试题
==和equals的区别?==是运算符,基本类型比值,引用类型比地址;equals是 Object 的方法,原生等价==;很多类(String)重写后比较内容。
- 重写 equals 为什么一定要重写 hashCode? 哈希集合会先判断 hashCode,如果 hashCode 不一样,直接判定对象不同。如果只重写 equals,两个内容相同对象 hashCode 不同,会存入 HashSet 当成两个对象,产生 bug。