Object类源码解析

时间:2017-07-29 15:46:50   收藏:0   阅读:142

本文的分析基于JDK 1.8 
Java中所有的类都继承自Object类。

Object类的源码解析

1.void registerNatives()

   private static native void registerNatives();
    static {
        registerNatives();
    }

该方法只是对几个本地方法进行注册(即初始化java方法映射到C的方法)。需要注意的是,很多类中都有这个方法,但是执行注册的目标是不同的。System类中也有该方法,但是它注册的方法是另一些方法。

2.Class <?> getClass()方法

    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。

3.int hashCode()方法

public native int hashCode();

这也是一个本地方法,返回值是对象的一个哈希值。 
在编写实现hashCode()方法时,我们需要遵守一些约定:

4.boolean equals(Object obj)

    public boolean equals(Object obj) {
        return (this == obj);
    }

从这里我们可以看到,equals(obj)方法最根本的实现就是‘==’,因此对于一些自定义类,如果没有重写hashcode()方法和equals()方法的话,利用‘==’和equals()方法比较的结果是一样的。对于‘==’比较的是地址,equals()方法比较的是内容这种说法,是片面的。(虽然在最常用的String类中是这样的)。

5.Object clone()

protected native Object clone() throws CloneNotSupportedException;

这个也是本地方法。需要注意的是该方法是“浅拷贝”的。

下面2个图可以帮助理解:

技术分享

6.String toString()方法

    public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }

很简单,就是返回信息而已。该方法经常被重写。

7.final void notify()方法和final void notifyAll()方法

这2个方法都是本地方法,前者唤醒一个当前对象监视器上等待的线程。后者唤醒所有当前对象监视器上等待的线程。 
我们应该注意的是,这2个方法应当仅仅被拥有对象监视器的线程所调用。而一个线程成为对象的监视器的拥有者有三种方法:

    public final native void notify();
    public final native void notifyAll();

8.final native void wait()方法

本地方法。 
首先,调用该方法会抛出中断异常(InterruptedException),调用时应该用try catch捕捉。

    public final void wait() throws InterruptedException {
        wait(0);//0表示没有时间限制。
    }

9.final native void wait(long timeout)

本地方法 
该方法也会抛出中断异常,调用时应捕捉。

public final native void wait(long timeout) throws InterruptedException;

该方法使当前线程等待,直到另外一个线程调用该对象的notify或notifyAll方法,或者等待时间已到,当前线程才会从等待池移到运行池。 
如果在wait之前或者wait的时候,当前线程被中断了,那么直到该线程被恢复的时候才会抛出中断异常(InterruptedException)。

10.final void wait(long timeout,int nanos)

该方法可能会抛出中断异常,调用时应捕捉。

    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四舍五入,并没有提供更高精度的控制。

11.protected void finalize()方法

垃圾回收器在认为该对象是垃圾对象的时候会调用该方法。子类可以通过重写该方法来达到资源释放的目的。 
在方法调用过程中出现的异常会被忽略且方法调用会被终止。 
任何对象的该方法只会被调用一次。

总结

原文:http://www.cnblogs.com/wyh199303/p/7255995.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!