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 { } | 这个函数在对象被消解的时候,例如垃圾回收的时候等,会被调用,如果对象使用了不可被自动回收的内存空间等资源,应该在这个函数里面收回。 |