目录

Java之Object对象那点事

一、前言

  • 作为一名java语言的使用者,我很惭愧,之前一直没有去研究Object对象,直到前两天被问到时,当时的自己是一脸懵逼。
  • 固今天特地来挽救一下自己的无知

二、Obejct

序号 方法 描述
1 private transient Class shadow$klass; 存储当前的class
2 private transient int shadow$monitor; 存储对象的hashcode
3 public final Class getClass() 获得当前类的class对象
4 public int hashCode() 返回的是这个对象的hash值
5 public boolean equals(Object obj) 用来判断两个对象是否相等的函数,默认的是两个对象的地址比较,在使用Compare计算的时候,往往需要重写这个函数
6 protected Object clone() throws CloneNotSupportedException 调用该函数需要实现 Cloneable,否则会抛出 CloneNotSupportedException的异常
7 private native Object internalClone(); 内部克隆方法
8 public String toString() 在Object类里面定义toString()方法,返回对象的哈希code码(对象地址字符串),若要输出对象信息,需要重写toString方法
9 public final native void notify(); 唤醒被这个对象的monitor标记等待的线程,如果线程的数量大于1,那么被唤醒的线程是由VM自行决定的。注意被唤醒的线程不一定立即执行,至少要等待当前调用notify的线程释放这个对象的monitor,或者等待其他正好同步锁定该对象的线程释放了该对象。 当然了,也不是任何地方都可以调用notify的,调用的地方必须持有对象的monitor,可以有以下几种情况:1.在一个同步( synchronized)方法中;2.在一段该对象的同步代码块中;3.如果这个变量是类变量(static),同步的静态方法也持有。
10 public final native void notifyAll(); 与上面所属的notify类似,只不过是唤醒了所有的线程,当然这些线程也不是立即执行,理由同上
11 public final native void wait() throws InterruptedException; 通知当前线程挂起,当对象的notify或者notifyAll被调用的时候才会被重新唤醒,wait了的thread是可以被中断(interrupt)的。当线程wait的时候,这个线程其实丢失了对象的monitor,当被notify的时候,会在程序执行前重新请求到对象的monitor还有两个wait函数是带参数的,参数指明了线程的wait时长,如果在这个时长内,线程没有被唤醒,那么当时间到达的时候,这个线程也会被重新唤醒。其他的与上面的wait一致,对了时间为0,说明没有超时时间,时间不可以小于零,否则抛出 IllegalArgumentException
12 protected void finalize() throws Throwable { } 这个函数在对象被消解的时候,例如垃圾回收的时候等,会被调用,如果对象使用了不可被自动回收的内存空间等资源,应该在这个函数里面收回。