标签:turn 深拷贝 导致 也会 释放 也有 源码解析 资源 hash
本文的分析基于JDK 1.8
Java中所有的类都继承自Object类。
private static native void registerNatives();
static {
registerNatives();
}
该方法只是对几个本地方法进行注册(即初始化java方法映射到C的方法)。需要注意的是,很多类中都有这个方法,但是执行注册的目标是不同的。System类中也有该方法,但是它注册的方法是另一些方法。
public final native Class<?> getClass();
这也是一个本地方法,返回一个对象的运行时类。注意是运行时类。请看下列代码:
public class tests
{
public static void main(String[] args)
{
A te = new B();
System.out.println(te.getClass());
}
}
class A{
}
class B extends A
{
}
运行结果是:
class B
A类的引用,但是运行时te这个对象的实际类是B。
public native int hashCode();
这也是一个本地方法,返回值是对象的一个哈希值。
在编写实现hashCode()方法时,我们需要遵守一些约定:
public boolean equals(Object obj) {
return (this == obj);
}
从这里我们可以看到,equals(obj)方法最根本的实现就是‘==’,因此对于一些自定义类,如果没有重写hashcode()方法和equals()方法的话,利用‘==’和equals()方法比较的结果是一样的。对于‘==’比较的是地址,equals()方法比较的是内容这种说法,是片面的。(虽然在最常用的String类中是这样的)。
protected native Object clone() throws CloneNotSupportedException;
这个也是本地方法。需要注意的是该方法是“浅拷贝”的。
下面2个图可以帮助理解:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
很简单,就是返回信息而已。该方法经常被重写。
这2个方法都是本地方法,前者唤醒一个在当前对象监视器上等待的线程。后者唤醒所有在当前对象监视器上等待的线程。
我们应该注意的是,这2个方法应当仅仅被拥有对象监视器的线程所调用。而一个线程成为对象的监视器的拥有者有三种方法:
public final native void notify();
public final native void notifyAll();
本地方法。
首先,调用该方法会抛出中断异常(InterruptedException),调用时应该用try catch捕捉。
public final void wait() throws InterruptedException {
wait(0);//0表示没有时间限制。
}
本地方法
该方法也会抛出中断异常,调用时应捕捉。
public final native void wait(long timeout) throws InterruptedException;
该方法使当前线程等待,直到另外一个线程调用该对象的notify或notifyAll方法,或者等待时间已到,当前线程才会从等待池移到运行池。
如果在wait之前或者wait的时候,当前线程被中断了,那么直到该线程被恢复的时候才会抛出中断异常(InterruptedException)。
该方法可能会抛出中断异常,调用时应捕捉。
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);
}
源码只是将timeout四舍五入,并没有提供更高精度的控制。
垃圾回收器在认为该对象是垃圾对象的时候会调用该方法。子类可以通过重写该方法来达到资源释放的目的。
在方法调用过程中出现的异常会被忽略且方法调用会被终止。
任何对象的该方法只会被调用一次。
标签:turn 深拷贝 导致 也会 释放 也有 源码解析 资源 hash
原文地址:http://www.cnblogs.com/wyh199303/p/7255995.html