Java源码阅读---Object

Object源码阅读

[TOC]

首先我们来看一下这个类的描述:

Class {@code Object} is the root of the class hierarchy.
Every class has {@code Object} as a superclass. All objects,
including arrays, implement the methods of this class.

翻译:

类 {@code Object} 是类层次结构的根。
每个类都有 {@code Object} 作为超类。 
所有对象,包括数组,都要实现这个类的方法。

下面我们来看一下Object类中有哪些方法,以及这些方法的作用:

(1)registerNatives()

private static native void registerNatives();

static {
        registerNatives();
    }

上面这段代码是当类加载时执行的静态代码块,进行本地方法注册。

Java程序有两种方法:java方法和本地方法

  • Java方法是由Java语言编写,编译成字节码,存储在class文件中。Java方法是平台无关的,通过JVM加载字节码运行。
  • 本地方法在Java类中定义,用native进行修饰,且只有方法定义,没有方法实现。本地方法是由其他语言(比如C,C++,或者汇编)编写,编译成处理器相关的机器代码,并保存在动态连接库中,Java类不需要实现这些方法。当Java程序调用本地方法时,JVM通过加载本地方法的动态连接库,找到对应方法并执行相关代码。

registerNatives()方法的作用就是将Java代码中定义的本地方法和本地方法的实现连接起来,当Java程序调用一个本地方法时,就可以直接执行本地方法代码,不需要JVM再去定位并连接。

(2)getClass()

public final native Class<?> getClass();

class是一个类的属性,能获取该类编译时的类对象,而getClass()是一个类的方法,它是获取该类运行的类对象

(3)hashCode()

public native int hashCode();

在Java 中, hashCode() 方法的主要作用就是为了配合哈希表使用的。 哈希表(Hash Table),也叫散列表,是一种可以通过关键码值(key-value)直接访问的数据结构,它最大的特点就是可以快速实现查找、插入和删除。

(4) equals(Object obj)

public boolean equals(Object obj) {
        return (this == obj);
    }

equals() 的作用是用来判断两个对象是否相等。 既然Object.java中定义了equals()方法,这就意味着所有的Java类都实现了equals()方法,所有的类都可以通过equals()去比较两个对象是否相等。

(5)clone()

protected native Object clone() throws CloneNotSupportedException;

Object clone() 方法用于创建并返回一个对象的拷贝。

clone 方法是浅拷贝,对象内属性引用的对象只会拷贝引用地址,而不会将引用的对象重新分配内存,相对应的深拷贝则会连引用的对象也重新创建。

(6) toString()

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

toString() 方法用于返回对象的字符串表示形式

(7)notify()

public final native void notify();

notify() 方法用于唤醒一个在此对象监视器上等待的线程。 如果所有的线程都在此对象上等待,那么只会选择一个线程,选择是任意性的,并在对实现做出决定时发生。 一个线程在对象监视器上等待可以调用wait() 方法。 notify() 方法只能被作为此对象监视器的所有者的线程来调用。

(8) notifyAll()

public final native void notifyAll();

notifyAll() 方法用于唤醒在该对象上等待的所有线程。 notifyAll() 方法跟notify() 方法一样,区别在于notifyAll() 方法唤醒在此对象监视器上等待的所有线程,notify() 方法是一个线程。

(9) wait(long timeout)

public final native void wait(long timeout) throws InterruptedException;

wait() 方法让当前线程进入等待状态。 直到其他线程调用此对象的notify() 方法或notifyAll() 方法。 当前线程必须是此对象的监视器所有者,否则还是会发生IllegalMonitorStateException 异常。

(10)finalize()

protected void finalize() throws Throwable { }

finalize() 方法用于实例被垃圾回收器回收的时触发的操作。 当GC (垃圾回收器) 确定不存在对该对象的有更多引用时,对象的垃圾回收器就会调用这个方法。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容