Java源码分析之Object

 

在查看源码的时候你会发现@author  unascribed作者无归属。

唉,可真是事了拂衣去,深藏功与名!

开篇遇到一个方法:private static native void registerNatives();那么这里学习了一下native。

native关键字说明其修饰的是一个原生态方法,方法对应的实现在其他语言实现的文件中,这里应该是c或c++。Java语言本身不能对操作系统底层进行操作和访问,但是可以通过JNI接口调用其他语言来实现对底层的访问。

JNI是Java本机接口(Java Native Interface),是一个本机编程接口,简单理解就是Java与C交互的API。可参照:https://www.cnblogs.com/Alandre/p/4456719.html

接下来是static修饰的代码块,静态加载本地方法registerNatives(),具体实现在其他语言里。

static学习:https://www.cnblogs.com/dolphin0520/p/3799052.html

终于第一个不特立独行的方法出现了:public final native Class<?> getClass();获取实际运行时的类。同样是native修饰,屡试不爽。在每个类被类加载器加载后会生成一个对应的Class类实例,此方法可以在运行时获得Class对象。

然后是:public native int hashCode();返回对象的哈希码值,即将对象在内存中的位置转换成数字。

关于hash code:(1)在同个java环境下,相同的对象必须有同样的哈希码值;但是对于这个具体的整数值(哈希码)在两个相同应用下不需要一定要保持一致。

  (2)如果两个对象通过equals方法是相等的,则他们的哈希值相同。

  (3)反过来,如果两个对象通过equals方法是不相等的,他们的哈希值不一定不同。但是开发者应该明白,对于不相等的两个对象返回不同的哈希值会提高哈希表的性能。

 

然后

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

直接比较地址,判断对象是否相等。

 

protected native Object clone() throws CloneNotSupportedException;

这个原生方法是用来复制一个对象属性,实现对象克隆。java赋值是复制对象引用,如果我们想要得到一个对象的副本,使用赋值操作是无法达到目的的。所以实现Cloneable接口并覆盖clone方法可以实现对象克隆,一般用不到,具体详解:https://blog.csdn.net/qq_33314107/article/details/80271963

 

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

返回对象的字符串表示,将hashCode转换为16进制表示。

 

接下来是与线程同步有关的方法:

public final native void notify();
...

public final native void notifyAll();
...

public final native void wait(long timeout) throws 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);
}
...

public final void wait() throws InterruptedException {
    wait(0);
}

前三个是本地方法,无法被重写,所以就加了两个重载方法以供己用

void notifyAll()

解除所有那些在该对象上调用wait方法的线程的阻塞状态。该方法只能在同步方法同步块内部调用。如果当前线程不是锁的持有者,该方法抛出一个IllegalMonitorStateException异常。

void notify()

随机选择一个在该对象上调用wait方法的线程,解除其阻塞状态。该方法只能在同步方法同步块内部调用。如果当前线程不是锁的持有者,该方法抛出一个IllegalMonitorStateException异常。

void wait()

导致线程进入等待状态,直到它被其他线程通过notify()或者notifyAll唤醒。该方法只能在同步方法中调用。如果当前线程不是锁的持有者,该方法抛出一个IllegalMonitorStateException异常。

void wait(long millis)和void wait(long millis,int nanos)

导致线程进入等待状态直到它被通知或者经过指定的时间。这些方法只能在同步方法中调用。如果当前线程不是锁的持有者,该方法抛出一个IllegalMonitorStateException异常。

Object.wait()和Object.notify()和Object.notifyall()必须写在synchronized方法内部或者synchronized块内部,这是因为:这几个方法要求当前正在运行object.wait()方法的线程拥有object的对象锁。即使你确实知道当前上下文线程确实拥有了对象锁,也不能将object.wait()这样的语句写在当前上下文中。

https://www.cnblogs.com/moongeek/p/7631447.html

最后一个方法:

protected void finalize() throws Throwable { }

回收对象之前会调用此方法,所以当某个对象临终前需要写遗书就可以重写这个方法来记录他的遗志。

protected void finalize() throws Throwable {

        throw new MyException("点个赞再走呗");

}

咳咳!!!

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值