非本地方法:
public boolean equals(Object obj);
同 == ,比较的是两个对象的地址
实现:
return (this == obj);
public String toString();
返回字符串,由对象的类名+@+对象的哈希码的十六进制组成。
public final void wait(long timeout, int nanos) throws InterruptedException;
当 nanos大于0小于999999时,调用wait(timeout)方法,timeout+1;
public final void wait() throws InterruptedException;
进入等待,经过timeout 超时后,若未被唤醒,则自动唤醒
protected void finalize() throws Throwable;
空实现,使用时需要被重写,GC(关于GC请自行查阅资料)在收集垃圾时就会调用这个方法,大概就是被回收前做一些操作。
本地方法:
private static native void registerNatives();
注册object类里面的几个本地方法,映射到对应的C的方法。
public final native Class<?> getClass();
可以获取一个类的定义信息,然后使用反射去访问其全部信息(包括函数和字段)。还可以查找该类的ClassLoader,以便检查类文件所在位置等。
public native int hashCode();
返回对象的哈希值,支持此方法的目的是为了提高哈希表的性能。
protected native Object clone() throws CloneNotSupportedException;
新的对象和原对象是两个不同的对象,是浅拷贝。
浅拷贝:创建一个新对象,然后将当前对象的非静态字段复制到该对象,如果字段类型是值类型(基本类型)的,
那么对该字段进行复制;如果字段是引用类型的,则只复制该字段的引用而不复制引用指向的对象。
此时新对象里面的引用类型字段相当于是原始对象里面引用类型字段的一个副本,原始对象与新对象里面的引用字段指向的是同一个对象
public final native void notify();
表示持有对象锁的线程A准备释放对象锁权限,通知jvm唤醒某个竞争该对象锁的线程X。线程A synchronized 代码作用域结束后,线程X直接获得对象锁权限,其他竞争线程继续等待(即使线程X同步完毕,释放对象锁,其他竞争线程仍然等待,直至有新的notify ,notifyAll被调用)。
public final native void notifyAll();
notifyAll 表示持有对象锁的线程A准备释放对象锁权限,通知jvm唤醒所有竞争该对象锁的线程,线程A synchronized 代码作用域结束后,jvm通过算法将对象锁权限指派给某个线程X,所有被唤醒的线程不再等待。线程X synchronized 代码作用域结束后,之前所有被唤醒的线程都有可能获得该对象锁权限,这个由JVM算法决定。
public final native void wait(long timeout) throws InterruptedException;
表示持有对象锁的线程A准备释放对象锁权限,释放cpu资源并进入等待;
静态代码块:
static {
registerNatives();
}
静态构造代码块比构造器优先执行,对几个本地方法进行注册(也就是初始化java方法映射到C的方法);
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},
};