一、核心方法概览Object类是所有Java类的超类,包含9个原生方法,开发者最常使用的有以下关键方法:
方法签名
出现频率
重要性
是否需要重写
toString()
⭐⭐⭐⭐⭐
高
建议
equals(Object obj)
⭐⭐⭐⭐⭐
高
必须
hashCode()
⭐⭐⭐⭐
高
必须
getClass()
⭐⭐⭐
中
禁止
clone()
⭐⭐
中
选择性
finalize()
⭐
低
已过时
wait()/notify()/notifyAll()
⭐⭐⭐
高
禁止
二、关键方法详解2.1 toString() - 对象描述器代码语言:java复制// 默认实现:类名@哈希码十六进制
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
// 正确重写示例
public class Student {
private String name;
private int age;
@Override
public String toString() {
return "Student{name='" + name + "', age=" + age + "}";
}
}作用:
提供对象的字符串表示形式 用于日志输出、调试信息展示 集合类toString依赖元素对象的toString 重写原则:
包含所有关键字段信息 避免暴露敏感数据 保持格式稳定 2.2 equals() & hashCode() - 对象等价判断组合代码语言:java复制// equals重写模板
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
MyClass obj = (MyClass) o;
return Objects.equals(field1, obj.field1) &&
field2 == obj.field2;
}
// hashCode正确实现
@Override
public int hashCode() {
return Objects.hash(field1, field2);
}equals方法契约:
自反性:x.equals(x) == true 对称性:x.equals(y) == y.equals(x) 传递性:x.equals(y)且y.equals(z) → x.equals(z) 一致性:多次调用结果相同 非空性:x.equals(null) == false hashCode契约:
等价对象必须产生相同哈希码 不等价对象尽量产生不同哈希码 常见误区:
❌ 仅重写equals不重写hashCode
❌ 使用随机数生成hashCode
❌ 在equals中进行类型转换前不检查类型
2.3 getClass() - 运行时类型识别代码语言:java复制// 类型检查示例
public void process(Object obj) {
if (obj.getClass() == ArrayList.class) {
// 处理ArrayList特例
}
}
// 获取类元信息
Class> clazz = object.getClass();
String className = clazz.getSimpleName();应用场景:
严格类型检查(优于instanceof) 反射机制入口 日志记录具体类型 注意事项:
对代理对象返回代理类 无法被子类重写 2.4 clone() - 对象复制代码语言:java复制// 深拷贝实现示例
public class DeepClone implements Cloneable {
private int[] data;
@Override
public DeepClone clone() {
try {
DeepClone cloned = (DeepClone) super.clone();
cloned.data = Arrays.copyOf(this.data, this.data.length);
return cloned;
} catch (CloneNotSupportedException e) {
throw new AssertionError();
}
}
}克隆类型对比:
类型
实现方式
特点
浅拷贝
super.clone()
复制基本类型字段,引用类型共享
深拷贝
递归调用引用对象clone()
完全独立的对象副本
序列化拷贝
通过ObjectOutputStream
最彻底的深拷贝方式
最佳实践:
✅ 优先使用拷贝构造器:new MyClass(existingInstance)
✅ 复杂对象使用序列化实现深拷贝
✅ 结合Cloneable接口需谨慎
2.5 wait()/notify() - 线程协作代码语言:java复制// 标准使用模板
synchronized (lockObject) {
while (conditionNotMet) {
lockObject.wait();
}
// 执行操作
lockObject.notifyAll();
}方法对比:
方法
作用范围
使用场景
wait()
当前对象锁
释放锁并进入等待状态
notify()
当前对象锁
随机唤醒一个等待线程
notifyAll()
当前对象锁
唤醒所有等待线程
使用规范:
必须在同步代码块中调用 使用while循环检查条件(避免虚假唤醒) 优先使用notifyAll() 三、过时方法说明3.1 finalize()代码语言:java复制@Deprecated(since="9")
protected void finalize() throws Throwable {
// 资源清理逻辑
}淘汰原因:
执行时机不确定(依赖GC) 性能影响严重 可能导致资源泄漏 替代方案:
✅ 使用try-with-resources管理资源
✅ 显式编写close()方法
✅ 使用PhantomReference进行资源清理
四、扩展应用技巧4.1 对象判空工具代码语言:java复制// 使用Objects工具类优化空判断
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
return Objects.equals(this.name, ((Person)o).name);
}
// 安全调用链
String code = Optional.ofNullable(obj)
.map(MyObject::getDetail)
.map(Detail::getCode)
.orElse("default");4.2 高效hashCode生成代码语言:java复制// Apache Commons实现
public int hashCode() {
return new HashCodeBuilder(17, 37)
.append(name)
.append(age)
.toHashCode();
}
// Google Guava实现
public int hashCode() {
return Objects.hashCode(name, age);
}五、常见问题排查5.1 equals与hashCode不一致现象:
对象存入HashSet后无法正确检索
解决方案:
检查equals比较字段是否与hashCode计算字段一致 使用IDE自动生成配对方法 5.2 浅拷贝导致数据污染案例:
代码语言:java复制int[] original = {1,2,3};
int[] cloned = original.clone();
cloned[0] = 9; // original数组也被修改!修复方案:
代码语言:java复制int[] deepCloned = Arrays.copyOf(original, original.length);六、最佳实践总结强制重写组合:当重写equals时必须同时重写hashCode toString规范:生产环境避免输出敏感信息 线程协作:使用Condition替代原生wait/notify 对象复制:优先采用序列化或工具类实现深拷贝 空安全处理:使用Optional替代null检查 通过合理运用Object类方法,可以显著提升代码的健壮性和可维护性。建议结合具体业务场景选择最合适的实现方式,并使用静态代码分析工具(如SonarQube)进行规则检查。