声明:这里写的是本人自己对源码的理解加上参考网友的观点写的。另外自己英文能力有限,可能有不正确或者不全面的地方,希望大家可以指正。非诚感谢!
一、首先Object类是这样的:
public class Object {
private static native void registerNatives();
static {
registerNatives();
}
//1
public final native Class<?> getClass();
//2
public native int hashCode();
//3
public boolean equals(Object obj) {
return (this == obj);
}
//4
protected native java.lang.Object clone() throws CloneNotSupportedException;
//5
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
//6
public final native void notify();
//7
public final native void notifyAll();
//8
public final native void wait(long timeout) throws InterruptedException;
//9
public final void wait(long timeout, int nanos) throws InterruptedException {
if (timeout < 0) {
throw new IllegalArgumentException("timeout value is negative");
}
if (nanos < 0 || nanos > 999999) {
throw new IllegalArgumentException(
"nanosecond timeout value out of range");
}
if (nanos > 0) {
timeout++;
}
wait(timeout);
}
//10
public final void wait() throws InterruptedException {
wait(0);
}
//11
protected void finalize() throws Throwable { }
}
二、详细解释
①native是通过JNI调用C或者C++
②各个方法解析
1.getClass():返回Object运行时的类;
2.hashCode():返回一个哈希值。这个方法对散列表起作用。并且:
在java应用程序执行期间,在对同一对象多次调用hashCode()方法时,必须返回相同的整数,前提是将对象进行equals比较时所用的信息没有被修改。而某个应用的两次执行中,该整数无需保持一致。
如果根据equals(object)方法,两个对象是相等的,那么对这两个对象中的每个对象调用hashCode方法都必须生成相同的整数结果。
如果根据equals(java.lang.Object)方法,两个对象不相等,那么对这两个对象中的任一对象上调用hashCode()方法不要求一定生成 不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同整数结果可以提高哈希表的性能。
3.equals(Object obj):这里的equals和==号是一样的,都是比较内存地址是否相同,所以一般我们自定义一个类,如果需要将属性完全相等的两个对象equals返回true,则需要自己改写。我再另外一篇文章里有写到equals、==和hashCode的关系:
https://blog.csdn.net/littleDingDang/article/details/88849063
4.clone():浅拷贝,创建一个新对象,然后将当前对象的非静态字段复制到该对象,如果字段类型是值类型(基本类型)的,那么对该字段进行复制;如果字段是引用类型的,则只复制该字段的引用而不复制引用指向的对象。此时新对象里面的引用类型字段相当于是原始对象里面引用类型字段的一个副本,原始对象与新对象里面的引用字段指向的是同一个对象,改变其中一个,两个都会变化。
注:要让一个类可以使用clone方法,首先implements Cloneable,因为Objcet的clone是protected修饰的,再实现clone方法
6.notify():唤醒一个这个对象监视器上的等待的线程。如果有线程在等待这个对象,那么其中之一将会被唤醒。
7.notifyAll():唤醒所有这个对象监视器上等待的线程。
8.wait(long timeout):线程进入等待状态,直到被notify或者notifyAll唤醒,或者到达等待时间。
9.wait(long timeout, int nanos):跟8类似只不过这里的时间为timeout(单位秒)与nanos(微秒,但是这里似乎写的是纳秒的英文)相加。
10.wait():等同于wait(0)和wait(0,0),线程进入等待状态,直到被notify或者notifyAll唤醒。
11.finalize():当垃圾回收器认为没有任何指向该对象的引用时,调用该方法。