`

Object类 源码分析

    博客分类:
  • java
阅读更多
首先看看方法:

public final native Class<?> getClass();
public native int hashCode();
public boolean equals(Object obj);
protected native Object clone() throws CloneNotSupportedException;
public String toString();
public final native void notify();
public final native void notifyAll();
public final native void wait(long timeout) throws InterruptedException;
public final void wait(long timeout, int nanos) throws InterruptedException;
public final void wait() throws InterruptedException;
protected void finalize() throws Throwable;


1. getClass方法

这是一个native方法,返回的是当前对象的类的字节码。

2. hashCode方法

这是一个native方法,返回的是根据当前对象的物理地址生成的哈希码,目的是为了区分不同的对象,这在一些根据Hash值来存储的集合中很有用。

如果两个对象经过equals比较后,返回true,那么它们的hashCode也必须是相同的;
如果两个对象经过equals比较后,返回false,那么它们的hashCode可以不同,也可以相同。

3. equals方法

比较当前对象是否和某个object相等。如果重写这个方法,需要满足下面的契约:
a. reflexive (反身性)
   => x != null
   x.equals(x) return true

b. symmetric (对称性)
   => x != null && y != null
   if (x.equals(y)) y.equals(x) return true

c. transitive (传递性)
   => x != null && y != null && z != null
   if (x.equals(y) && y.equals(z)) x.equals(z) return true

d. consistent (连贯性)
   => x != null && y != null
   x.equals(y) return false;
   ...
   x.equals(y) return false;

e. x != null
   x.equals(null) return false

4. clone方法

这是一个native方法,创建并返回该对象的拷贝。

对于某个对象x,
x.clone() != x return true // 但这不是绝对的
x.clone().getClass() == x.getClass() return true // 但这不是绝对的

典型情况下:
x.clone().equals(x) return true // 但这不是绝对的

按照惯例,该方法调用suer.clone()。如果这个类和所有它的超类都遵循这个规则,那么:x.clone().getClass() == x.getClass()

按照惯例,拷贝的对象应该和该对象相互独立。为了达到这个目标,在返回之前需要对其中的一个或几个字段进行修改,拷贝组成当前对象的变化部分,然后把引用改成指向拷贝。如果一个类只有原始类型字段或者对不变对象的引用,不需要做这些修改。

过程:
a. 首先如果当前对象的类没有实现Cloneable接口,抛CloneNotSupportedException异常
b. 创建当前对象的类的新实例,用当前对象的内容来初始化所有的字段。所以只是复制了引用,是shallow copy

5. toString方法

    public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }

返回该对象的string表示形式。该表示应该能够表达该对象的信息。最好是所有的子类都重写该方法。

Object的toString方法返回:该对象的类名 + "@" + 该对象hashCode的16进制表示形式

6. notify方法

这是一个native方法,唤醒一个在当前对象监视器上等待的线程。

被唤醒的线程直到当前线程释放锁后才可以执行,并且和其它线程竞争对象的拥有权(没有优先级之分)。

这个方法应该仅仅被拥有对象监视器的线程所调用。

一个线程成为对象的监视器的拥有者的三种方法:
a. 执行该对象上的一个同步(synchronized)方法
b. 执行一个同步在该对象上的代码块
c. 执行该对象的类上的静态同步方法

7. notifyAll方法

这是一个native方法,唤醒所有在当前对象监视器上等待的线程。

和notify类似。

8. wait(long timeout)方法

这是一个native方法,使当前线程等待,直到另外一个线程调用改对象的notify或notifyAll方法,或者等待时间已到。

当前线程必须拥有该对象的监视器。

该方法会让当前线程T进入到当前对象的等待集中,让出当前对象的监视器,T被禁用直到下面情况中的一种发生:
a. 其它线程调用当前对象的notify方法,并且T恰好被选中唤醒
b. 其它线程调用当前对象的notifyAll方法
c. 其它线程暂停T
d. 等待时间已到

被唤醒后,T从等待集中被移除和启用等待线程调度,接着会和其它线程竞争当前对象的拥有权。如果T成功了,就会从wait方法的调用处返回,当前对象和T的同步状态和调用wait时一样。

有种情况是伪唤醒,就是T从wait处返回了,没有出现上面说的4种情况。所以wait方法放在loop块中,确保不是伪唤醒:

synchronized (obj) {
	while (<condition does not hold>)
		obj.wait(timeout);
	... // Perform action appropriate to condition
}

如果在wait之前或wait的时候,当前线程被中断了,那么直到当前线程恢复时才会抛InterruptedException。

wait方法会使当前线程让出当前对象的拥有权,但是不会让出同步的其它对象。

该方法必须是在当前线程是当前对象的拥有时才可以调用。

9. wait(long timeout, int nanos)方法

    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);
    }

看到该方法的签名,以为nanos会提供更高精度的控制。但是代码将nanos四舍五入到timeout,调用wait(timeout)方法。

10. wait()方法

    public final void wait() throws InterruptedException {
        wait(0);
    }

这里的参数0表示没有时间限制。

11. finalize方法

垃圾回收器觉得该对象没有被其它任何存在的线程引用时会调用该方法。子类可以通过复写该方法来达到资源释放。

Java不能保证什么线程会来调用某个对象的finalize方法。可以保证的是,当finalize被调用时,调用finalize的线程不会拥有用户可见的同步锁。在方法调用过程中出现的异常会被忽略并且方法调用会终止。

任何对象的finalize方法只会被调用一次。
分享到:
评论

相关推荐

    qt object类分析

    Qt Object 类分析 Qt Object 类是 Qt 框架中最重要的类之一,它是 Qt 类体系的唯一基类,类似于 MFC ...QObject 是 Qt 框架中非常重要的一个类,它是 Qt 类体系的唯一基类,对于 Qt 的源码分析和开发都是非常重要的。

    3D渲染引擎OGRE源码分析

    源码分析可以揭示如何解析脚本语言,以及如何利用元数据来描述资源和类,简化程序的配置和扩展。 7. **线程与多线程** OGRE在资源加载、渲染等方面使用了多线程技术,以提高效率。通过源码,我们可以学习如何在3D...

    08-Hystrix源码分析1

    Hystrix源码分析的主要知识点包括HystrixCommandAspect类、MetaHolderFactory类、HystrixInvokable接口、HystrixCommandFactory类、GenericCommand类和toObservable方法。这些类和方法都是Hystrix的核心组件,对于...

    java源码分析

    从给定的文件片段中,我们可以提取出关于Java中Object类和String类的源码分析的知识点。 首先,Object类是Java中所有类的根类。它包含了所有对象共有的方法,是所有类继承结构的最顶层。从文件片段中我们可以看到...

    MapObject2.3 的 vc代码 common 文件

    在VC++环境中,开发者可以利用MapObject库来构建具备地图显示、地理数据处理和分析功能的应用。"common"文件夹通常包含的是共享的、跨平台的代码资源,这些资源在MapObject的多个组件或模块中都会用到。 在Map...

    Java源码解析之object类

    通过阅读和分析Object类的源码,开发者能够更好地掌握Java对象生命周期、类层次结构和多线程编程的基础。尽管Object类的方法看似简单,但它们在实际编程中扮演着至关重要的角色,尤其是在进行高性能、并发和内存管理...

    objectbox 源码

    在深入研究 ObjectBox 源码之前,我们首先需要了解它的核心特性。 1. **对象映射(Object Mapping)**:ObjectBox 使用对象关系映射(ORM)技术,将 Java 对象直接转换为数据库中的记录。这使得开发者可以像操作...

    Delphi源码分析软件

    它通过生成类继承树报告和函数(过程)调用树报告,提供了强大的源码分析能力。 1. **类继承树报告**:在面向对象编程中,类继承是实现代码复用和封装的重要机制。类继承树清晰地展示了类之间的层次关系,从基类到...

    java集合类源码分析之Set详解.docx

    Set接口在Java集合框架中扮演着重要角色,它是一个不包含重复元素的集合。Set接口继承自Collection接口,提供...了解和掌握这两种集合类的源码分析有助于深入理解Java集合框架的底层实现,从而更好地应用在实际开发中。

    Ceph源码分析:osdc.pdf

    Ceph 源码分析:osdc 本文档对 Ceph 源码进行了深入分析,特别是 osdc 部分。Ceph 是一个分布式存储系统, osdc 是其中的一个关键组件。本文档中,我们将详细介绍 osdc 的实现机制、数据存储和映射机制、PG 和 OSD ...

    C#基础类 常用类 常用方法源码 .NET 工具类 源码

    源码分析可以帮助开发者理解这些方法的工作原理,提升代码优化能力。 4. **工具类**:工具类通常是一些封装了特定功能的静态类,如System.IO.File类用于文件操作,System.Text.RegularExpressions.Regex类用于正则...

    Object_C++_

    LTO是在链接阶段进行的优化,它允许编译器分析整个程序,从而发现并优化跨文件的代码改进机会。在C++项目中,使用LTO可以提高程序的运行效率,减少代码大小,但也会增加编译时间。 总结来说,"Object C++_"主题可能...

    ogre源码分析与使用指南

    《OGRE源码分析与使用指南》是一份深入解析OGRE图形渲染引擎的教程,旨在帮助初学者理解和应用OGRE引擎。本指南由Mage小组成员撰写,提供了丰富的原创内容,鼓励读者通过邮件或QQ交流反馈。 作者Norman_chen@163....

    仿合金弹头的cocos2d objectC源码

    【源码分析】 尽管没有提供具体的源文件内容,但根据项目名称和描述,我们可以推测源码可能涵盖以下几个方面的知识点: 1. **Cocos2d架构**:学习如何组织Cocos2d项目的结构,包括Scene、Layer、Sprite等类的使用。...

    RAD STUDIO 11 DELPHI11 superobject使用源码

    **RAD Studio 11 Delphi 11与SuperObject源码详解** 在 RAD Studio 11 Delphi 11 开发环境中,SuperObject 是一个非常重要的库,它为 Delphi 程序员提供了一种高效、轻量级的方式来处理 JSON(JavaScript Object ...

    ArrayList源码分析

    ### ArrayList源码分析 #### 一、概述 `ArrayList` 是 Java 集合框架中的一个重要的类,它实现了 `List` 接口,并且内部使用动态数组来存储元素。由于其灵活的特性(比如可以方便地增加或删除元素),`ArrayList` ...

    ArrayList源码分析(含jdk1.8).pdf

    在了解ArrayList的源码分析时,我们主要探讨其在Java Development Kit (JDK) 1.8中的实现。ArrayList是一个非常重要的集合框架,用于动态数组的实现,其功能类似于数组,但可以在运行时动态调整大小。它是一个非线程...

    FreeCAD源码分析:PyCXX

    总结来说,《FreeCAD源码分析:PyCXX》通过深入分析Python C API和PyCXX的源码,清晰地阐述了PyCXX如何简化Python扩展的编写过程,并详细介绍了相关的C++类和功能。文档还提供了PyCXX的使用示例,并且对类的成员函数...

    mootools源码分析.rar

    源码分析可以帮助我们理解类是如何被实例化和扩展的。 3. **事件系统**:MooTools提供了一个强大的事件处理机制,可以绑定和触发DOM元素以及自定义对象上的事件。源码中会展示`Event`对象的实现,包括事件监听、...

    Java从JDK源码角度对Object进行实例分析

    "Java从JDK源码角度对Object进行实例分析" Java中的Object类是所有类的父类,也就是说Java中的所有类都是直接或者间接继承自Object类。Object类体现了面向对象编程(OOP)的四大特性:多态、继承、封装、抽象。...

Global site tag (gtag.js) - Google Analytics