Object类
指路:
Java Object 类 | 菜鸟教程 (runoob.com)
Object (Java SE 11 & JDK 11 ) (runoob.com)
(中文版,机翻味很浓,基本没有校对,错的很多:()
Object (Java SE 17 & JDK 17) (oracle.com)
(原版JDK17手册)
基本信息
java.lang.Object- 任何一个Java类(除Object类)都直接或间接的继承于Object类
- Object类称为java类的根父类
- Object类中声明的结构(属性、方法等)就具有通用性。
- Object类中没有声明属性
- Object类提供了一个空参的构造器
- 重点关注:Object类中声明的方法
常用方法
clone()
Object (Java SE 17 & JDK 17) (oracle.com)
语法:
protected [Object] clone() throws [CloneNotSupportedException]
规则:
会在内存中创建一个新的相同类型的内容的对象,满足:
x.clone() != x
x.clone().getClass() == x.getClass()
x.clone().equals(x) == true
但是注意,不能用obj.clone()这种方法直接调用clone,需要在类中覆写,见[Java]由Object.clone()方法引出的访问权限问题实际上是protected的权限问题
finalize()
语法:
@Deprecated(since="9")
protected void finalize() throws Throwable
这个方法在java9后就被废弃了,官网也对此作了说明,编写不好会导致内部出现循环引用,导致对象不能被正常回收
作用:
当垃圾回收器(GC)要回收此对象时,调用这个方法,一般会在对象内部覆写这个方法,在回收前完成某些操作
equals()
Object (Java SE 17 & JDK 17) (oracle.com)
public boolean equals(Object obj)
使用说明
- 自定义类没有重写时调用的就是Object中的方法:
public boolean equals(Object obj) {
return (this == obj);
}
判断是否指向同一块空间
- 内置的类一般会重写方法,如:
String类中,内部对equals做了重写,判断的是字符串是否完全相同
String str1 = new String("Hello");
String str2 = new String("Hello");
System.out.println(str1 == str2); // false
System.out.println(str1.equals(str2)); // true
自定义类重写equals()方法
参照JDK8中String类的重写方法:
@Override
public boolean equals(Object obj) {
if (obj == this)
return true;
if (obj instanceof User) {
return this.age == ((User) obj).age &&
this.name.equals(((User) obj).name);
}
return false;
}
实际上IDEA中提供了更加优雅的方法:(太优雅辣:))
alt+insert,即可自动加入equals()

一个高频面试题:equals和的区分
toString()
Object (Java SE 17 & JDK 17) (oracle.com)
语法
public String toString()
使用说明
System.out.println()打印对象时调用的就是toString()方法,返回对象名 @地址值- 自定义类没有重写
toString()时默认返回当前对象的地址值 - 内置的子类一般也会重写方法
自定义类重写toString()方法
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
和equals()一样,在IDEA中也可以快捷插入toString()方法,格式实际上和JS中的一致