`
distantlight1
  • 浏览: 44267 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Java类源码学习(1)-Object

阅读更多
package my.java.lang;

/**
 * 所有类的基类,所有的对象(包括数组)都继承Object类
 *
 * @author unascribed
 * @version 1.73, 03/30/06
 * @see java.lang.Class
 * @since JDK1.0
 */
public class Object {

    /**
     * 初始化
     */
    private static native void registerNatives();

    static {
        registerNatives();
    }

    /**
     * 返回对象的(运行时)类对象,由该类的{@code static synchronized}方法加锁
     *
     * @return 返回值的编译类型实际为调用对象的声明类型的擦除,例如Number n = 0;则n.getClass()的编译类型为Class<? extends
     *         Number>,运行时类型为Class<Integer>
     * 
     */
    @Override
    public final native Class<?> getClass();

    // 以下native方法可以重写,注释中主要说明重写这些方法的一些约定规范/////////////////

    /**
     * 返回hash值,默认实现是native的
     * 
     * <pre>
     * hashCode取值的常规约定如下:
     * 
     * 同一java应用中,如果equals()用到的信息没有变更,同一对象的hashCode()始终返回相同的值
     * 如果两个对象equals()返回true,则hashCode()返回相同数值
     * 反之非equals的对象允许返回相同的hashCode
     * 
     * 但Object.hashCode()保证不同对象一定返回不同hashCode(实现为将对象的内存地址转化为整数签名)
     * 
     * @return a hash code value for this object.
     * @see java.lang.Object#equals(java.lang.Object)
     * @see java.util.Hashtable
     */
    @Override
    public native int hashCode();

    /**
     * 判断两个对象“相等”,一般需要遵守如下约定(不是强制,但是违反可能造成奇怪的错误):
     * 
     * <pre>
     * 自反性:x.equals(x)==true
     * 对称性:x.equals(y)==y.equals(x)
     * 传递性:x.equals(y)==true && y.equals(z)== x.equals(z)==true
     * 一致性:如果equals()实现中用到的属性没有发生变化,重复调用x.equals(y)始终返回相同的结果
     * x.equals(null)==false
     * Object类的equals方法是最严格的相等判断,即通过==直接比较对象
     * 
     * 一般来说,如果重写equals(),也需要同时重写hashCode(),以实现hashCode()的约定(equal的对象具有相同的hashCode)
     * 
     * @see #hashCode()
     * @see java.util.Hashtable
     */
    public boolean equals(Object obj) {
        return (this == obj);
    }

    /**
     * 返回本对象的一个复制。返回值的具体情形依赖于调用对象的类型
     * 
     * 一般约定是以下条件为true(但并非强制要求)
     * 
     * <pre>
     * x.clone() != x
     * x.clone().getClass() == x.getClass()
     * x.clone().equals(x)
     * 
     * 根据约定,返回值对象应该通过super.clone()来创建
     * 如果某类及其所有祖先(Object除外)都满足此约定,则x.clone().getClass() == x.getClass()自动满足
     * 
     * 根据约定,clone()的返回值应与原对象独立(隔离)。为实现这点,有时需要修改<tt>super.clone</tt>返回值的一些属性
     * 通常就是复制对象属性引用结构里的所有引用。如果所有属性都是原始类型,那么就不需要这步了
     * 
     * Object.clone()实现略有特别:
     * 首先,如果该类没有实现Cloneable接口,则方法会抛出<tt>CloneNotSupportedException</tt> (所有数组对象默认实现Cloneable)
     * 否则,方法返回此类的一个新对象,其所有属性均与原对象保持一致
     * 注意非原始类型属性本身并不进行复制,因此这是一个“浅克隆”实现
     * 
     * <tt>Object</tt>类本身没有实现<tt>Cloneable</tt>,因此调用一个实际类型为Object的对象的clone()方法会报错
     * (这地方有点绕,注意是实际类型,Cloneable调用super.clone()是可以的,即使super是Object)
     * 
     * @return a clone of this instance.
     * @exception CloneNotSupportedException if the object's class does not support the
     *                <code>Cloneable</code> interface. Subclasses that override the
     *                <code>clone</code> method can also throw this exception to indicate that an
     *                instance cannot be cloned.
     * @see java.lang.Cloneable
     */
    @Override
    protected native Object clone() throws CloneNotSupportedException;

    /**
     * 默认的toString()写法,类名加hashCode(内存地址签名)
     */
    @Override
    public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }

    // 以下native方法为线程相关的方法,虚拟机底层实现,一般不重写//////////////////////

    /**
     * (随机)唤醒一个在本对象上等待的线程
     * 
     * <pre>
     * 被唤醒的线程首先竞争wait时放弃的(本对象的)锁,持锁后才能继续运行
     * 唤醒的线程在竞争锁的时候没有任何额外的优先权
     * 
     * 此方法只能被本对象的所有者线程调用,所有者指满足以下条件之一(其实就是持有锁的线程):
     * 1.正在执行该对象的synchronized实例方法
     * 2.正在执行行该对象锁定的synchronized代码块
     * 3.如果该对象是Class对象且正在执行对应类的synchronized静态方法
     * 
     * 根据锁的特性,同一个对象同时只有一个线程作为所有者
     * 
     * @exception IllegalMonitorStateException 非对象持有者线程调用抛出
     * @see java.lang.Object#notifyAll()
     * @see java.lang.Object#wait()
     */
    @Override
    public final native void notify();

    /**
     * 唤醒所有在本类等待的线程,其他特性与notify相同
     */
    @Override
    public final native void notifyAll();

    /**
     * 当前线程进入等待状态
     * 
     * <pre>
     * 本线程保持此状态直到竞态的其他线程调用notify()或notifyAll(),或者方法超时
     * 当前线程必须持有此对象的锁(在synchronized(this)中),否则抛出IllegalMonitorStateException
     * 所以调用方法的对象一般被用来当做锁
     * 
     * 调用wait的线程放弃所有已持有该对象锁的synchronized代码并进入阻塞,知道以下条件之一满足:
     * 1.其他线程调用该对象的notify(),而本线程恰好被(随机)选中为被唤醒的线程
     * 2.其他线程调用该对象的notifyAll()。
     * 3.其他线程调用Thread.interrupt()中断本线程
     * 4.等待时间超过timeout(如果timeout不是0)
     * 
     * 注意本线程退出等待状态,不意味着立刻继续执行,因为有可能需要重新竞争锁
     * 线程退出等待(等价于wait方法返回)时,该线程的所有状态与调用wait时完全一致
     * 
     * 线程还可能通过一种“虚假唤醒(spurious wakeup)”的方式来唤醒
     * 此方式很少被有意使用,但必须注意防止其发生引起意外错误,应用在wait返回后应该显式校验线程唤醒的条件
     * 也就是说wait应该总是以如下的方式在循环中使用
     * 
     * <pre>
     *     synchronized (obj) {
     *         while (&lt;condition does not hold&gt;)
     *             obj.wait(timeout);
     *         ... // Perform action appropriate to condition
     *     }
     * </pre>
     * 
     * (For more information on this topic, see Section 3.2.3 in Doug Lea's
     * "Concurrent Programming in Java (Second Edition)" (Addison-Wesley, 2000), or Item 50 in
     * Joshua Bloch's "Effective Java Programming Language Guide" (Addison-Wesley, 2001).
     * 
     * 如果本线程在等待期间被(其他线程)调用Thread.interrupt(),则会抛出<tt>InterruptedException</tt>
     * 该异常会等到线程重新持锁后才会实际抛出(而不是Thread.interrupt()调用后立刻抛出
     * 
     * 注意wait()方法只是交出本对象的锁持有,如果线程还持有其他锁,则(等待期间)其他锁也不会被放弃(注意死锁隐患)
     * 
     * @param timeout 单位:毫秒
     * @exception IllegalArgumentException if the value of timeout is negative.
     * @exception IllegalMonitorStateException if the current thread is not the owner of the
     *                object's monitor.
     * @exception InterruptedException if any thread interrupted the current thread before or while
     *                the current thread was waiting for a notification. The <i>interrupted
     *                status</i> of the current thread is cleared when this exception is thrown.
     * @see java.lang.Object#notify()
     * @see java.lang.Object#notifyAll()
     */
    @Override
    public final native void wait(long timeout) throws InterruptedException;

    /**
     * 重载,对超时时间做更精细的控制
     * 
     * 实际超时时间为:1000000 * timeout + nanos(纳秒)
     */
    @Override
    public final void wait(long timeout, int nanos) throws InterruptedException {
        if (timeout < 0) {
            throw new IllegalArgumentException("timeout value is negative");
        } else if (nanos < 0 || nanos > 999999) {
            throw new IllegalArgumentException("nanosecond timeout value out of range");
        }

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

        wait(timeout);
    }

    /**
     * 重载,不超时(永久等待notify/interrupt)
     */
    @Override
    public final void wait() throws InterruptedException {
        wait(0);
    }

    // ////////////////////////

    /**
     * gc时如果该对象没有引用,垃圾回收器调用此方法做自定义的系统资源释放及其他清理工作
     * 
     * <pre>
     * finalize()方法约定只有在如下情况下被调用:
     * jvm确认此对象不会被任何活跃线程访问到(其他对象/类的finalize方法除外)
     * 
     * finalize()原则上允许做任何操作,包括使对象重新可用
     * 但通常的目的是在对象不可逆转地被丢弃之前做清理工作,如代表I/O连接的对象断开连接
     * 
     * Object.finalize()没有具体实现,具体内容由子类重写
     * 
     * java不保证具体什么线程会调用finalize(),但是保证调用时线程不会持有任何用户可见的锁
     * 如果finalize()抛出未捕获的异常,该异常会被直接忽略
     * 
     * jvm不会调用同一对象的finalize()超过一次
     * 
     * @throws Throwable the <code>Exception</code>
     * raised by this method
     */
    @Override
    protected void finalize() throws Throwable {
    }
}

 

1
2
分享到:
评论

相关推荐

    【数据驱动】复杂网络的数据驱动控制附Matlab代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    (源码)基于Qt框架的智能家居管理系统.zip

    # 基于Qt框架的智能家居管理系统 ## 项目简介 本项目是一个基于Qt框架开发的智能家居管理系统,旨在提供一个集成的平台来监控和管理家庭环境中的各种传感器数据,如温度、湿度、烟雾状态、红外状态等。系统通过图形界面实时展示数据,并提供警报功能以应对异常情况。 ## 项目的主要特性和功能 1. 实时数据监控通过Qt和Qwt库创建的曲线图,实时显示温度和湿度数据。 2. 多传感器支持支持温度、湿度、烟雾、红外等多种传感器的监控。 3. 警报系统当传感器数据超过设定阈值时,系统会触发警报,并通过界面显示警告信息。 4. 用户交互提供滑动条和复选框,允许用户调整警报阈值或关闭警报。 5. 网络通信通过TCP套接字与服务器通信,获取和发送传感器数据及网络拓扑信息。 6. 蓝牙数据读取支持通过蓝牙读取传感器数据并更新界面显示。 ## 安装使用步骤 1. 环境准备 确保已安装Qt开发环境。 安装Qwt库以支持曲线图功能。

    【路径规划】一种考虑拥塞的改进路径规划算法CCPF-RRT附Matlab代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    基于springboot高性能计算中心的高性能集群共享平台源码数据库文档.zip

    基于springboot高性能计算中心的高性能集群共享平台源码数据库文档.zip

    (源码)基于JavaFX的图片管理系统.zip

    # 基于JavaFX的图片管理系统 ## 项目简介 本项目是一个基于JavaFX的图片管理系统,旨在提供一个用户友好的界面来管理和浏览图片。系统支持图片的预览、重命名、删除、复制、粘贴等操作,并提供了多种排序和展示方式。 ## 项目的主要特性和功能 1. 预览窗口 目录树展示 缩略图预览 单选、多选(Ctrl+左键)、框选功能 图片信息显示(如文件名、大小、最后修改时间等) 2. 右键菜单 复制粘贴图片 单选和多选重命名 删除图片 3. 展示窗口 图片放大缩小 左右切换图片 幻灯片播放功能 4. 排序功能 按文件名排序 按文件大小排序 按最后修改时间排序 5. 其他功能 图片信息封装(ImageBean) 文件树节点管理(FileTreeItem)

    (源码)基于Windows窗体的披萨店厨房管理系统.zip

    # 基于Windows窗体的披萨店厨房管理系统 ## 项目简介 这是一个基于Windows窗体的应用程序,主要用于披萨店的厨房管理。该系统通过WebSocket与服务器进行实时通信,显示从服务器接收到的订单信息。用户界面简洁明了,易于操作。 ## 项目的主要特性和功能 1. 实时通信: 通过WebSocket与服务器进行实时数据交换,获取订单信息。 2. 订单显示: 在窗体上实时显示订单信息,包括订单号和菜品等。 3. 界面简洁: 用户界面设计简洁,易于操作。 4. 定时刷新: 定时器用于定时从服务器获取消息,确保数据的实时性。 5. 错误处理: 在连接过程中遇到技术问题时会显示错误消息框。 6. 退出功能: 提供退出按钮,点击后程序会退出。 ## 安装和使用步骤 1. 下载项目源码文件: 从相关仓库或网站下载此项目的源码文件。 2. 准备开发环境: 确保你的开发环境已经安装了必要的软件和工具,如Visual Studio等。

    基于springboot高校创新创业课程体系源码数据库文档.zip

    基于springboot高校创新创业课程体系源码数据库文档.zip

    基于springboot汽车美容与保养网站源码数据库文档.zip

    基于springboot汽车美容与保养网站源码数据库文档.zip

    基于springboot校友录管理系统源码数据库文档.zip

    基于springboot校友录管理系统源码数据库文档.zip

    Cocos2d-x教程视频使用Eclipse在Ubuntu下搭建Cocos2d-x 3集成开发环境

    Cocos2d-x教程视频使用Eclipse在Ubuntu下搭建Cocos2d-x 3集成开发环境提取方式是百度网盘分享地址

    毕业设计&课设_基于 vue.js 与 node.js 的毕业设计项目,含多模块功能,用于大学信息交流平台开发 .zip

    该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过严格测试运行成功才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

    基于springboot服装生产管理信息系统源码数据库文档.zip

    基于springboot服装生产管理信息系统源码数据库文档.zip

    (源码)基于Spring Boot和Redis的高并发秒杀系统.zip

    # 基于Spring Boot和Redis的高并发秒杀系统 ## 项目简介 本项目是一个基于Spring Boot框架开发的高并发限时抢购秒杀系统。系统实现了基本的登录、查看商品列表、秒杀、下单等功能,并针对高并发场景进行了优化,包括系统缓存、降级和限流等措施。通过Redis、RabbitMQ等中间件技术,确保系统在高并发情况下的稳定性和性能。 ## 项目的主要特性和功能 ### 核心功能 用户登录用户可以通过手机号和密码进行登录,系统支持两次MD5加密确保密码安全。 商品列表展示用户可以查看所有商品的列表,包括商品的详细信息、库存数量、秒杀价格等。 商品详情展示用户可以查看单个商品的详细信息,包括秒杀状态和剩余时间。 秒杀下单用户可以参与秒杀活动,系统通过本地标记、Redis预处理、RabbitMQ异步下单等技术确保高并发下的系统稳定。 订单详情用户可以查看自己的订单详情,包括订单状态、商品信息等。 ### 技术优化

    基于springboot校园论坛系统源码数据库文档.zip

    基于springboot校园论坛系统源码数据库文档.zip

    飞利浦CT机自动推送配置

    飞利浦CT机自动推送配置

    PHP 学习教程(入门到实践)

    本教程介绍了 PHP 的基础语法、函数与面向对象编程、文件操作、以及与 MySQL 的交互。通过实例与练习,帮助您快速入门 PHP 开发,为动态网站和 Web 应用打下坚实基础。

    (源码)基于Android的玩具租赁系统.zip

    # 基于Android的玩具租赁系统 ## 项目简介 本项目是一个基于Android平台的玩具租赁系统,旨在为用户提供一个便捷的玩具租赁服务。系统涵盖了用户注册、登录、玩具浏览、租赁、个人信息管理等功能,通过前后端分离的架构实现。 ## 项目的主要特性和功能 1. 用户管理 用户注册与登录支持通过昵称、手机号等多种方式进行注册和登录。 找回密码用户可以通过手机验证码找回密码。 个人信息管理用户可以修改个人信息,包括姓名、密码等。 2. 玩具租赁 玩具浏览用户可以浏览不同分类的玩具,查看玩具详情。 租赁功能用户可以选择玩具进行租赁,并查看租赁订单。 3. 搜索与推荐 搜索功能用户可以通过关键词搜索玩具。 推荐系统根据用户的历史行为推荐相关玩具。 4. 测试与集成 单元测试确保基础功能的正确性。 集成测试测试Spring Boot应用的上下文加载情况。

    65-MarkdownEditorsPart1-Code.zip

    6个免费的所见即所得Markdown桌面编辑器的实用指南,用于在Windows平台上编写GitHub Readme.md文件(截至2024年9月)。

    【路径规划】基于深度学习DQN的机器人路径规划附Matlab代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    (源码)基于Arduino IDE和Flutter的电动汽车充电监控系统.zip

    # 基于Arduino IDE和Flutter的电动汽车充电监控系统 ## 一、项目简介 这是一个电动汽车充电监控项目,旨在通过Arduino IDE创建一个HTTP Web服务器,结合ESP32芯片、电源管理集成电路(IC)、电流和电压传感器,实现对电动汽车充电过程的实时监控和管理。同时,该项目还包括一个基于Flutter开发的移动应用,方便用户通过移动设备查看和控制充电过程。 ## 二、项目的主要特性和功能 1. HTTP Web服务器通过Arduino IDE创建HTTP Web服务器,实现与ESP32芯片的通信。 2. ESP32芯片连接WiFi,并作为中间设备连接电源管理集成电路(IC)、电流和电压传感器。 3. 远程监控与控制用户可以通过移动设备访问特定的网页,输入充电瓦数并提交,实现远程监控和控制充电过程。 4. Flutter应用项目中的Flutter应用提供了用户友好的界面,方便用户查看充电状态、调整充电参数等。

Global site tag (gtag.js) - Google Analytics