0

0

Java的父类介绍:Object类的源码分析

php是最好的语言

php是最好的语言

发布时间:2018-08-08 11:04:16

|

2088人浏览过

|

来源于php中文网

原创

object类是java中所有类的父类,所以对其的认识是十分重要的。

下面是我对Object类中个方法的认识(结合了代码中的注释以及看过的一些书)

public class Object {

     //其主要作用是将C/C++中的方法映射到Java中的native方法,实现方法命名的解耦。函数的执行是在静态代码块中执行的,在类首次进行加载的时候执行。
    private static native void registerNatives();
    static {
        registerNatives();
    }
 
    //返回此Object的运行时对象,返回的class对象由synchronized锁定
    public final native Class<?> getClass();

    /**
     * 特点:
     *   1、每当在执行Java应用程序期间多次在同一对象上调用它时,{@code hashCode}方法必须始终
     *   返回相同的整数,前提是不修改对象上的{@code equals}比较中使用的信息。 从应用程序的一
     *   次执行到同一应用程序的另一次执行,该整数不需要保持一致。
     *   2、如果两个object根据equals判定真,则hashcode必须返回相同的值
     *   3、如果两个object不equal,hashcode可以相同也可以不同。
     */
    public native int hashCode();

    /**
     *  Object的equals()方法比较的是对象在内存中的地址。
     *  对于所有的非空引用:
     *  自反性:x.equals(x)为true
     *  对称性:如果x.equals(y)为true,则y.equals(x)为true
     *  传递性:如果x.equals(y)为true,y.equals(z)为true,则x.equals(z)为true
     *  一致性:对于任何非null的引用值x与y,假设对象上equals比较中的信息没有被修改,则多次调用x.equals(y)始终返回true或者始终返回false
     *  对于任何非空引用值x,x.equal(null)应返回false
     */
    public boolean equals(Object obj) {
        return (this == obj);
    }

    /**
     *   创建并且返回一个对象的复制,clone()的正确调用是需要实现Cloneable接口,如果没有实现Cloneable接口,并且子类直接
     * 调用Object类的clone()方法,则会抛出CloneNotSupportedException异常。
     *    x.clone() != x 
     *    x.clone().getClass() == x.getClass();
     *    x.clone().equals(x);
     *    这些表达式一般都为true,但是并不是绝对需要的。
     *    一般而言,clone()是将这个对象复制一次,变成两个对象,都有着自己的内存空间,而不是只建立一个引用,所以x.clone() != x;为true
     *    x.clone().getClass() == x.getClass();为true说明两个对象的运行时对象相同
     *    x.clone.equals(x);依赖于equals()方法的重写,如果只是调用Object的equals()方法,那么这个表达式返回false,因为Object的equals()
     * 方法比较的是对象的地址。
     * 
     * 深拷贝和浅拷贝:
     *    浅拷贝是将原始对象中的数据型字段拷贝到新对象中去,将引用型字段的“引用”复制到新对象中去,
     * 不把“引用的对象”复制进去,所以原始对象和新对象引用同一对象,新对象中的引用型字段发生变化会
     * 导致原始对象中的对应字段也发生变化。深拷贝是在引用方面不同,深拷贝就是创建一个新的和原始字
     * 段的内容相同的字段,是两个一样大的数据段,所以两者的引用是不同的,之后的新对象中的引用型字
     * 段发生改变,不会引起原始对象中的字段发生改变。
     * 
     */
    protected native Object clone() throws CloneNotSupportedException;

    //返回类的名称加上@,然后 加上此类的哈希码的16进制表示
    public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }


    /**
     *     唤醒正在此对象上等待的一个线程。 如果有多个线程正在等待此对象,则选择其中一个线程被唤醒。 选择是任意的,由JVM实施决定。
     * 线程通过调用{@code wait}方法等待获取对象。
     *     在当前线程放弃对该对象的锁定之前,唤醒的线程(就绪状态)将无法继续。唤醒的线程将以普通的方式与可能正在竞争同步此对象的任何其他线程
     * 竞争; 例如,唤醒线程在成为锁定此对象的下一个线程时没有可靠的特权或劣势。
     *     这个方法只能被对象的所有者线程调用,线程以以下三种方式成为对象的所有者:
     *     1、通过执行该对象的同步实例方法
     *     2、通过执行该对象的同步代码块
     *     3、通过执行该对象的静态同步方法。
     *     同一时刻只能有一个线程持有该对象的锁
     */
    public final native void notify();

    //使所有正在等待池中等待同一共享资源的全部线程从等待状态退出,进入可运行状态,让它们竞争对象的锁,只有获得锁的线程才能进入就绪状态 
    public final native void notifyAll();

    /**
     *   使当前线程进入等待状态,直至其他线程调用notify()或者notifyAll()方法,又或是达到指定时间
     *   当前线程必须持有该对象的锁。
     *   这个方法使得当前线程T 进入该对象的等待队列中,直到以下四件事情发生:
     *      1、有其他线程调用了notify()方法,且线程T正好被选为唤醒的线程
     *      2、有其他线程调用了notifyAll()方法
     *      3、其他线程调用了interrupt()方法中断线程T
     *      4、等待的时间超过了wait制定的时间。但是,如果{@code timeout}为零,则不考虑实时,线程只是等待其他线程唤醒。
     *   线程被唤醒后就从Object的等待集合中删除,并且能够被重新调度
     *   
     * 
     */
    public final native void wait(long timeout) throws InterruptedException;


    public final void wait(long timeout, int nanos) throws InterruptedException {
        if (timeout < 0) {
            throw new IllegalArgumentException("timeout value is negative");
        }

        if (nanos < 0 || nanos > 999999) {
            throw new IllegalArgumentException(
                                "nanosecond timeout value out of range");
        }

        if (nanos >= 500000 || (nanos != 0 && timeout == 0)) {
            timeout++;
        }

        wait(timeout);
    }
    //不考虑等待时间,线程只等待其他线程唤醒
    public final void wait() throws InterruptedException {
        wait(0);
    }


    /**
     * 当垃圾回收器认为一个对象没有其他引用时,调用该方法。子类重写{@code finalize}方法以处理系统资源或执行其他清理。
     * 《深入理解Java虚拟机》书中谈到:
     *   即使在可达性分析算法中不可达的对象,也并非是“非死不可”的。要真正宣告一个对象死亡,至少要经历两次标记过程:
     *   1、如果对象在进行可达性分析后发现没有与GC Roots相连接的引用链,那它将会被第一次标记并且进行一次筛选,筛选的
     *   条件是此对象是否有必要执行finalize()方法。当对象没有覆盖finalize()方法,或者finalize()方法已经被虚拟机调用
     *   过,则虚拟机认为该对象死亡。
     *   2、如果需要执行finalize()方法,那么对象会被放置到一个F-Queue的队列中。finalize()方法是对象逃脱死亡的最后一次
     *   机会。GC对F-Queue中的对象进行第二次标记,如果对象在finalize()方法中成功拯救了自己,则GC在第二次标记时将对象移出
     *   “即将回收”集合;如果对象没有逃脱,那就真的GG了
     *   注意 finalize()方法只能被系统调用一次。如果对象面临第二次垃圾回收,finalize()方法不会被执行。
     */
    protected void finalize() throws Throwable { }
}

相关推荐:

Java中Object类的方法分析

清爽型淘客天下模板
清爽型淘客天下模板

由淘返利提供的清爽型淘客天下模板是经过多重杀毒软件检查,是一款开放的ASP源程序,为淘宝客免费提供服务。 后台地址:你的网址/admin/index.asp 浏览后台账 号:admin密 码:admin路 径:adminn 网站后台具有的功能1.淘宝商品推广,店铺推广及管理功能。2.超强的分类管理,商品分类随心所欲自由排序、修改分类时同步更新所属商品。3.内嵌仿Word在线编辑器,可在商品介绍、新

下载

Java中父类Object的常用方法总结

立即学习Java免费学习笔记(深入)”;

相关文章

java速学教程(入门到精通)
java速学教程(入门到精通)

java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

38

2026.03.10

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

83

2026.03.09

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

97

2026.03.06

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

223

2026.03.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

458

2026.03.04

AI安装教程大全
AI安装教程大全

2026最全AI工具安装教程专题:包含各版本AI绘图、AI视频、智能办公软件的本地化部署手册。全篇零基础友好,附带最新模型下载地址、一键安装脚本及常见报错修复方案。每日更新,收藏这一篇就够了,让AI安装不再报错!

169

2026.03.04

Swift iOS架构设计与MVVM模式实战
Swift iOS架构设计与MVVM模式实战

本专题聚焦 Swift 在 iOS 应用架构设计中的实践,系统讲解 MVVM 模式的核心思想、数据绑定机制、模块拆分策略以及组件化开发方法。内容涵盖网络层封装、状态管理、依赖注入与性能优化技巧。通过完整项目案例,帮助开发者构建结构清晰、可维护性强的 iOS 应用架构体系。

246

2026.03.03

C++高性能网络编程与Reactor模型实践
C++高性能网络编程与Reactor模型实践

本专题围绕 C++ 在高性能网络服务开发中的应用展开,深入讲解 Socket 编程、多路复用机制、Reactor 模型设计原理以及线程池协作策略。内容涵盖 epoll 实现机制、内存管理优化、连接管理策略与高并发场景下的性能调优方法。通过构建高并发网络服务器实战案例,帮助开发者掌握 C++ 在底层系统与网络通信领域的核心技术。

34

2026.03.03

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go语言教程-全程干货无废话
Go语言教程-全程干货无废话

共100课时 | 11.3万人学习

swift开发文档
swift开发文档

共33课时 | 26万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号