tClass()、hashCode()、clone()、notify()、notifyAll()、wait(long timeout ...
Java Object 类核心方法实战解析tClass()、hashCode()、clone()、notify()、notifyAll()、wait()在 Java 中Object类是所有类的根父类它定义了若干关键方法这些方法在多线程、对象比较、克隆等场景中有着至关重要的应用。本文将从实战角度出发深入解析tClass()、hashCode()、clone()、notify()、notifyAll()、wait(long timeout)这几个方法并通过代码示例演示它们的用法和注意事项。## 1. getClass() —— 运行时类型识别getClass()方法返回当前对象的运行时类Class对象常用于反射和类型判断。注意它返回的是实际运行时的类型而不是编译时声明的类型。### 代码示例getClass() 实战java// 文件GetClassDemo.javapublic class GetClassDemo { public static void main(String[] args) { Object obj new String(Hello); // 运行时类型是 String而不是 Object System.out.println(运行时类型 obj.getClass()); // class java.lang.String // 通过 Class 对象获取类名 String className obj.getClass().getName(); System.out.println(类名 className); // java.lang.String // 使用反射创建对象实际项目中谨慎使用 try { Class? clazz Class.forName(java.lang.StringBuilder); Object sb clazz.newInstance(); // 已过时但演示概念 System.out.println(反射创建的对象类型 sb.getClass()); } catch (Exception e) { e.printStackTrace(); } }}输出结果运行时类型class java.lang.String类名java.lang.String反射创建的对象类型class java.lang.StringBuilder实战要点-getClass()返回的是Class?对象可用于获取方法、字段、注解等元数据。- 不要用obj.getClass() String.class来判断类型推荐使用instanceof运算符。## 2. hashCode() —— 哈希码的生成与约定hashCode()返回对象的哈希码整数用于支持基于哈希的集合如HashMap、HashSet。它必须遵循以下约定- 同一对象多次调用hashCode()应返回相同值前提是对象未修改影响哈希码的字段。- 如果equals()返回true则两个对象的hashCode()必须相等。- 如果equals()返回false则两个对象的hashCode()可以不相等但相等会提高哈希表性能。### 代码示例正确实现 hashCode() 和 equals()java// 文件Person.javaimport java.util.Objects;public class Person { private String name; private int age; public Person(String name, int age) { this.name name; this.age age; } // 重写 equals()基于 name 和 age 判断相等 Override public boolean equals(Object obj) { if (this obj) return true; if (obj null || getClass() ! obj.getClass()) return false; Person person (Person) obj; return age person.age Objects.equals(name, person.name); } // 重写 hashCode()与 equals() 保持一致性 Override public int hashCode() { return Objects.hash(name, age); // 使用 Objects 工具类 } // 测试 main 方法 public static void main(String[] args) { Person p1 new Person(Alice, 25); Person p2 new Person(Alice, 25); Person p3 new Person(Bob, 30); System.out.println(p1.equals(p2): p1.equals(p2)); // true System.out.println(p1.hashCode() p2.hashCode(): (p1.hashCode() p2.hashCode())); // true System.out.println(p1.equals(p3): p1.equals(p3)); // false System.out.println(p1.hashCode() p3.hashCode(): (p1.hashCode() p3.hashCode())); // false可能 }}输出结果p1.equals(p2): truep1.hashCode() p2.hashCode(): truep1.equals(p3): falsep1.hashCode() p3.hashCode(): false实战要点- 如果重写equals()必须重写hashCode()否则哈希集合如HashSet会失效。- 使用Objects.hash()是生成哈希码的推荐方式它内部处理了数组和 null 值。## 3. clone() —— 对象的浅拷贝与深拷贝clone()方法用于创建对象的副本。默认实现是浅拷贝复制基本类型和引用地址且要求类实现Cloneable接口否则抛出CloneNotSupportedException。### 代码示例浅拷贝 vs 深拷贝java// 文件CloneDemo.javaclass Address { String city; Address(String city) { this.city city; } // 为了演示浅拷贝不重写 clone()}class Employee implements Cloneable { String name; Address address; // 引用类型 public Employee(String name, Address address) { this.name name; this.address address; } // 重写 clone()实现浅拷贝 Override protected Object clone() throws CloneNotSupportedException { return super.clone(); // 浅拷贝 } // 演示深拷贝需要手动复制引用对象 public Employee deepClone() throws CloneNotSupportedException { Employee cloned (Employee) super.clone(); // 手动创建新的 Address 对象 cloned.address new Address(this.address.city); return cloned; } public static void main(String[] args) throws CloneNotSupportedException { Address addr new Address(Beijing); Employee e1 new Employee(Tom, addr); // 浅拷贝 Employee e2 (Employee) e1.clone(); System.out.println(浅拷贝后修改地址); e2.address.city Shanghai; // 修改 e2 的地址 System.out.println(e1.address.city: e1.address.city); // Shanghai被影响了 System.out.println(e2.address.city: e2.address.city); // Shanghai // 深拷贝 Employee e3 e1.deepClone(); e3.address.city Shenzhen; System.out.println(\n深拷贝后修改地址); System.out.println(e1.address.city: e1.address.city); // Shanghai不受影响 System.out.println(e3.address.city: e3.address.city); // Shenzhen }}输出结果浅拷贝后修改地址e1.address.city: Shanghaie2.address.city: Shanghai深拷贝后修改地址e1.address.city: Shanghaie3.address.city: Shenzhen实战要点- 默认clone()是浅拷贝对于包含可变引用对象的类务必实现深拷贝。- 推荐使用拷贝构造函数或工厂方法代替clone()因为clone()设计存在缺陷如返回类型强制转型、Cloneable接口只是标记。## 4. wait()、notify()、notifyAll() —— 线程间通信这三个方法用于线程间的等待与通知必须由持有对象锁的线程调用即在synchronized块内否则抛出IllegalMonitorStateException。-wait()让当前线程进入等待状态并释放锁。-wait(long timeout)等待指定毫秒数后自动唤醒。-notify()随机唤醒一个等待该对象锁的线程。-notifyAll()唤醒所有等待该对象锁的线程。### 代码示例生产者-消费者模型java// 文件ProducerConsumerDemo.javaclass Buffer { private int data; private boolean hasData false; // 消费者方法 public synchronized int consume() throws InterruptedException { while (!hasData) { // 使用 while 循环防止虚假唤醒 System.out.println(消费者等待数据...); wait(); // 释放锁等待生产者通知 } hasData false; System.out.println(消费者消费数据: data); notifyAll(); // 通知生产者可以生产 return data; } // 生产者方法 public synchronized void produce(int value) throws InterruptedException { while (hasData) { System.out.println(生产者等待消费者消费...); wait(); // 等待消费者消费 } data value; hasData true; System.out.println(生产者生产数据: value); notifyAll(); // 通知消费者可以消费 }}public class ProducerConsumerDemo { public static void main(String[] args) { Buffer buffer new Buffer(); // 生产者线程 Thread producer new Thread(() - { for (int i 1; i 5; i) { try { buffer.produce(i); Thread.sleep(1000); // 模拟生产耗时 } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } }); // 消费者线程 Thread consumer new Thread(() - { for (int i 1; i 5; i) { try { buffer.consume(); Thread.sleep(500); // 模拟消费耗时 } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } }); producer.start(); consumer.start(); }}输出结果示例生产者生产数据: 1消费者等待数据...消费者消费数据: 1消费者等待数据...生产者生产数据: 2消费者消费数据: 2...交替执行实战要点- 总是在while循环中调用wait()避免因虚假唤醒导致条件不满足时继续执行。- 使用notifyAll()比notify()更安全因为notify()可能唤醒错误的线程导致死锁。-wait(long timeout)在超时后会自动唤醒适合设置最大等待时间。## 总结本文从实战角度详细解析了Object类的六个核心方法-getClass()运行时类型识别用于反射和动态类型判断。-hashCode() 和 equals()必须成对重写保证哈希集合的正确性。-clone()浅拷 vs 深拷贝推荐使用工厂方法替代。-wait() / notify() / notifyAll()线程间通信的基石需在同步块内使用并注意虚假唤醒。掌握这些方法不仅能加深对 Java 对象模型的理解还能在实际编码中避免常见的陷阱如哈希冲突、线程死锁。建议在真实项目中多编写单元测试验证这些行为确保代码的健壮性。

相关新闻

C++多重定义错误解析:从链接器原理到工程实践

C++多重定义错误解析:从链接器原理到工程实践

1. 项目概述:从“Multiple Definition”报错说起如果你在用C写项目,尤其是项目规模稍微大一点,链接了多个源文件,那“Multiple Definition of Symbol”这个链接器报错,十有八九是你绕不开的“老朋友”。它不像编译错误…

2026/9/30 3:04:24 阅读更多 →
QT属性动画驱动样式表:原理、实现与性能优化指南

QT属性动画驱动样式表:原理、实现与性能优化指南

1. 项目概述:当属性动画遇上样式表 在QT开发中,属性动画( QPropertyAnimation )是构建流畅UI交互的利器,我们常用它来驱动控件的位置、大小、透明度等标准属性。但你是否想过,用它来动态改变一个按钮的背…

2026/10/2 12:26:42 阅读更多 →
【AI搜索代码问题终极指南】:20年资深架构师亲授5大高频场景的精准定位与秒级修复方案

【AI搜索代码问题终极指南】:20年资深架构师亲授5大高频场景的精准定位与秒级修复方案

更多请点击: https://codechina.net 第一章:AI搜索代码问题的本质与认知重构 AI搜索代码并非传统关键词匹配的简单延伸,而是对编程语义、上下文意图与知识图谱的深度协同建模。当开发者输入“如何用Go实现带重试的HTTP客户端”,A…

2026/9/30 3:04:44 阅读更多 →

最新新闻

JavaWeb实验室预约管理系统:从冲突检测到一键预约的落地实践

JavaWeb实验室预约管理系统:从冲突检测到一键预约的落地实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 7:50:11 阅读更多 →
GhPython反射机制解决Image Sampler图片刷新与曲线更新难题

GhPython反射机制解决Image Sampler图片刷新与曲线更新难题

做了这么多年Grasshopper参数化,我遇到过最憋屈的情况之一,就是用GhPython批量替换画布上Image Sampler组件的图片文件时,代码跑完没有任何报错,预览缩略图还是旧图,下游依赖采样结果输出的曲线也保持原来的形状&#…

2026/10/4 7:50:11 阅读更多 →
Flutter鸿蒙实现K8s运维终端:kubeconfig解析与TLS适配实践

Flutter鸿蒙实现K8s运维终端:kubeconfig解析与TLS适配实践

做云原生运维的人,应该都有过这种经历:集群告警了,人却在外边,手边只有一台手机,想看一眼 Pod 状态、翻一下日志,都得先找电脑。我最近用 Flutter 写了一个跑在鸿蒙设备上的 K8s 运维终端,核心思…

2026/10/4 7:50:11 阅读更多 →
AI系统综述写作:Claude Scientific Writer文献综述与引用管理完整教程(PubMed/OpenAlex/BibTeX全覆盖)

AI系统综述写作:Claude Scientific Writer文献综述与引用管理完整教程(PubMed/OpenAlex/BibTeX全覆盖)

AI系统综述写作:Claude Scientific Writer文献综述与引用管理完整教程(PubMed/OpenAlex/BibTeX全覆盖) 【免费下载链接】claude-scientific-writer A general purpose scientific writer 项目地址: https://gitcode.com/gh_mirrors/cl/clau…

2026/10/4 7:50:11 阅读更多 →
锂电池废料回收实战:钴镍锂怎么检测、怎么计价,别按黑粉重量卖

锂电池废料回收实战:钴镍锂怎么检测、怎么计价,别按黑粉重量卖

锂电池废料回收实战:钴镍锂怎么检测、怎么计价,别按黑粉重量卖这两年电池的废料来源彻底变了:早年是手机电池和笔记本电芯,现在主力变成了动力电池退役模组、正极厂涂布废极片、卷绕切边的边角料,还有一批一批化成车间…

2026/10/4 7:50:11 阅读更多 →
Flutter跑马灯无极滚动算法实践与鸿蒙适配要点

Flutter跑马灯无极滚动算法实践与鸿蒙适配要点

前阵子给一个银行客户做App首页改版,需求清单里有一项写着“公告轮播,无限循环,不能看到回弹”。我心想这不就是个跑马灯嘛,一行Text加个AnimationController,十分钟搞定。结果真写起来才发现,跑马灯这三个…

2026/10/4 7:49:11 阅读更多 →

日新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 10:36:31 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/3 9:42:35 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/3 9:42:36 阅读更多 →