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 (垃圾回收器) 确定不存在对该对象的有更多引用时,对象的垃圾回收器就会调用这个方法。