JDK源码解析---Object

1.概述

Object类是所有类的父类(包括数组),Object类中共有12个方法(除了init和cinit以外),如下图所示
在这里插入图片描述

  • 本地方法registerNatives 在类被加载时执行。
  • hashCode(),equals(Object obj),clone(),toString(),finalize()。这五个方法由子类重写。
  • getClass(),notify(),notifyAll(),wait(long timeout),wait(long timeout, int nanos),wait()这6个final的方法,都是由本地方法实现。

2.registerNatives()

registerNatives方法,作用是通过类加载器,加载一些本地方法到jvm中。
Object类在被加载时,会加载下面的methods中的那些本地方法到jvm中。

static JNINativeMethod methods[] = {
{“hashCode”,()I”, (void *)&JVM_IHashCode},
{“wait”,(J)V”, (void *)&JVM_MonitorWait},
{“notify”,()V”, (void *)&JVM_MonitorNotify},
{“notifyAll”,()V”, (void *)&JVM_MonitorNotifyAll},
{“clone”,()Ljava/lang/Object;, (void *)&JVM_Clone},
};

3.getClass()

这个方法返回的是类的Class对象,具体值取决于调用这个方法的对象

4.notify()、notifyAll()

当某个线程调用某个对象的wait()方法,则会释放该对象的锁,然后进入到对象的等待队列中
Objet可以当作锁来使用,其子类也是。这两个方法用来唤醒等待队列中的线程
区别在于一个唤醒单个线程,一个唤醒所有线程

5.wait(long timeout)、wait(long timeout, int nanos)、wait()

三个方法都是将获得锁的线程释放锁 进入等待队列。

区别在于有参数的方法在等待一定的时间后会被主动唤醒
而wait(long timeout)、wait(long timeout, int nanos)的区别在于
timeout 是毫秒级别的时间
nanos 是以毫微秒为单位更加的精准

6.hashCode()

用于计算一个对象的hash值

hash值需要遵守的约定:

  • 一致性(consistent),在程序的一次执行过程中,对同一个对象必须一致地返回同一个整数。
  • 如果两个对象通过equals(Object)比较,结果相等,那么对这两个对象分别调用hashCode方法应该产生相同的整数结果。
  • 如果两个对象通过java.lang.Object.equals(java.lang.Ojbect)比较,结果不相等,不必保证对这两个对象分别调用hashCode也返回两个不相同的整数。

7.equals(Object obj)

判断2个对象是否相等,默认实现是判断引用是否相等。
一般来说,如果重写了equals方法,那么需要重写hashcode方法

8.clone()

拷贝默认实现是浅拷贝,若对于一个复杂的对象,需要对内部引用的对象也进行一次拷贝。
若想调用clone()方法,则需要实现Cloneable接口。

注意!所有的数组默认实现了 Cloneable接口。

9.toString()

推荐所有的子类都覆盖这个方法,默认实现返回类名和对象哈希值的十六进制。

10.finalize()

当这个对象不再被引用时由gc调用,子类覆盖这个方法用于释放系统资源。
在第一次垃圾回收发现不可达时,会先把finalize方法加到F-Q队列中由专门的线程执行,可以在这个方法中自救。如果没有自救或者自救失败,这个类就会被标记为可回收的,再下次垃圾回收时如果还是不可达,并且finalize执行过之后,就会真正的回收。
如果finalize方法发生异常,那么方法会终止,但是异常会被忽略。
finalize是一个对象用来自救的手段,并不一定要去实现它。

猜你喜欢

转载自blog.csdn.net/gongsenlin341/article/details/107401392