转载:https://www.jianshu.com/p/852faf4dc8f1
1、getClass方法:public final native Class<?> getClass();
getClass方法返回的是当前实例对应的Class类,也就是说不管一个类有多少个实例,每个实例的getClass返回的Class对象是一样的
2、hashCode方法:public native int hashCode();
对象的哈希码主要用于在哈希表中的存放和查找等。Java中对于对象hashCode方法的规约如下:
1)在java程序执行过程中,在一个对象没有被改变的前提下,无论这个对象被调用多少次,hashCode方法都会返回相同的整数值。对象的哈希码没有必要在不同的程序中保持相同的值。
2)如果2个对象使用equals方法进行比较并且相同的话,那么这2个对象的hashCode方法的值也必须相等。
3)如果根据equals方法,得到两个对象不相等,那么这2个对象的hashCode值不需要必须不相同。但是,不相等的对象的hashCode值不同的话可以提高哈希表的性能。
3、equals方法:Java要求一个类的equals方法和hashCode方法同时覆写
public boolean equals(Object obj) {
return (this == obj);
}
equals方法用于判定两个对象是否相等。Object中的equals方法其实默认比较的是两个对象是否拥有相同的地址。
也就是"=="对应的内存语义
equals方法在非空对象引用上的特性:
1)reflexive,自反性。任何非空引用值x,对于x.equals(x)必须返回true
2)symmetric,对称性。任何非空引用值x和y,如果x.equals(y)为true,那么y.equals(x)也必须为true
3)transitive,传递性。任何非空引用值x、y和z,如果x.equals(y)为true并且y.equals(z)为true,那么x.equals(z)也必定为true
4)consistent,一致性。任何非空引用值x和y,多次调用 x.equals(y) 始终返回 true 或始终返回 false,前提是对象上 equals 比较中所用的信息没有被修改
对于任何非空引用值 x,x.equals(null) 都应返回 false
4、clone方法:protected native Object clone() throws CloneNotSupportedException;
用于克隆一个对象,被克隆的对象需要implements Cloneable接口,否则调用这个对象的clone方法,将会抛出CloneNotSupportedException异常。克隆的对象通常情况下满足以下三条规则:
x.clone() != x,克隆出来的对象和原来的对象不是同一个,指向不同的内存地址
x.clone().getClass() == x.getClass()
x.clone().equals(x)
一个对象进行clone时,原生类型和包装类型的field的克隆原理不同。对于原生类型是直接复制一个,而对于包装类型,则只是复制一个引用而已,并不会对引用类型本身进行克隆。
浅拷贝:对引用进行了拷贝,指向的还是同一块内存地址。
深拷贝:对一个对象深拷贝时,对于对象的包装类型的属性,会对其再进行拷贝,从而达到深拷贝的目的
5、toString方法:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
6、notify方法和notifyAll方法:
public final native void notify();
public final native void notifyAll();
notify方法用于唤醒正在等待当前对象监视器的线程,唤醒的线程是随机的。一般notify方法和wait方法配合使用来达到多线程同步的目的。
在一个线程被唤醒之后,线程必须先重新获取对象的监视器锁(线程调用对象的wait方法之后会让出对象的监视器锁),才可以继续执行
一个线程在调用一个对象的notify方法之前必须获取到该对象的监视器(synchronized),否则将抛出IllegalMonitorStateException异常。同样一个线程在调用一个对象的wait方法之前也必须获取到该对象的监视器。
7、wait方法
public final native void wait(long timeout) throws InterruptedException;
public final void wait() throws InterruptedException {
wait(0);
}
wait方法一般和上面说的notify方法搭配使用。一个线程调用一个对象的wait方法后,线程将进入WAITING状态或者TIMED_WAITING状态。直到其他线程唤醒这个线程。
线程在调用对象的wait方法之前必须获取到这个对象的monitor锁,否则将抛出IllegalMonitorStateException异常。线程的等待是支持中断的,如果线程在等待过程中,被其他线程中断,则抛出InterruptedException异常。
如果wait方法的参数timeout为0,代表等待过程是不会超时的,直到其他线程notify或者被中断。如果timeout大于0,则代表等待支持超时,超时之后线程自动被唤醒。
8、finalize方法
protected void finalize() throws Throwable { }
垃圾回收器在回收一个无用的对象的时候,会调用对象的finalize方法,我们可以覆写对象的finalize方法来做一些清除工作。
finalize方法中对象其实还可以"自救",避免垃圾回收器将其回收。在finalize方法中通过建立this的一个强引用来避免GC: