Object源码分析

Object类的基本属性

  • Object类是Java中所有类的父类,在jdk9,它的位置位于java.base模块的java.lang包中。若用树形结构来描述Java类分类等级结构,则Object应该是树根root。
  • Object类型的变量可以存储任意类型的引用。
  • 可以用Object来给方法传参,以匹配更多类型的参数。

源码分析

 //在JAVA的树形结构中,属于根节点。
 //每个JAVA类都是Object的子类,包括数组,也实现了这个类的相关方法。
package java.lang;

public class Object {
    //类首次加载时执行 
    //虚拟机调用initializeSystemClass方法,即静态初始化程序,来初始化静态变量、调用静态方法
    private static native void registerNatives();
    static {
        registerNatives();
    }
	// 用final修饰,说明不可被重写
    // 作用:返回对象的运行时类,返回的Class对象是被表示类的静态同步方法锁定的对象。
    // 这便于进行反射操作,进行动态加载指定的类等操作
    public final native Class<?> getClass();

    //多次调用同一个对象的这个方法,返回的值一样
	//如果2个对象equals为true, 那么它们的hashCode为一样的值
	//不过如果2个对象equals为false, 那么hashCode也可能为一样的值
	//对于Object or String,注意前者的hashCode、equals、identityHashCode、==都是比较地址
    //后者的hashCode、equals比较的是内容
    public native int hashCode();

    //作用范围:引用型数据,而不是基本类型数据(比较简单)
    //如果两个对象根据equals(Object)方法是相等的,那么调用这两个对象中任一个对象的hashCode方法必须产生同样的整数结果
    public boolean equals(Object obj) {
        return (this == obj);
    }

    / *Object的clone方法实施具体的操作:
	 *1、如果这个对象的类 没有实现Cloneable接口, CloneNotSupportedException异常就会抛出
	 *2、注意所有arrays 应该实现Cloneable接口 T[]返回T[] T是任意引用、基本类型
	 *3、否则,此方法初始化这个对象的新对象+赋值所有字段(但字段的内容不会被克隆)
	 *这也就是浅拷贝,而不是深拷贝操作
	 *4、Object类自己并没有实现Cloneable接口,因此在Object类的对象上调用方法,运行时会抛出异常
	 */
	//1、一般在原型模式时使用
    //2、使用时需要让被拷贝的对象所属的类实现Cloneable接口,才能调用该方法进行拷贝。
    protected native Object clone() throws CloneNotSupportedException;

    //返回对象的字符串表示,建议所有子类重写此方法。
    public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }

    //唤醒对象的等待队列上的 一个线程
    public final native void notify();
     //唤醒对象的等待队列上的 全部线程
    public final native void notifyAll();
    
    //第一种实现:使线程进入等待状态,直到被notify or notifyAll调用 or 等待时间达到限定值
    //timeout - 要等待的最长时间(以毫秒为单位)。
    //nanos - 额外时间(以毫微秒为单位,范围是 0-999999)
    //超时时间=1000000*timeout+nanos(毫微秒)。
    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);
    }
    //从Java SE 9开始弃用 
    protected void finalize() throws Throwable { }
}

JDK源代码由C++、Java、C、汇编 这四种语言组成。JVM主体是C++写的,JNI部分是C,工具类是Java写的,JVM里混有汇编代码。JNI是Java Native Interface的缩写,从Java 1.1 开始,Java Native Interface (JNI)标准就成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他语言,只要调用约定受支持就可以了。

下一篇我们来介绍下finalize()方法的原理,以及为什么要弃用finalize方法。

作者:select you from me
链接:https://mp.csdn.net/mdeditor/96473652
来源:CSDN
转载请联系作者获得授权并注明出处。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值