Object源码解读

Object

Object类是java中所有类的父类,在编译时会自动导入。Object类中的大部分方法都是native方法,一般使用c/c++语言来实现的。

  • private static native void registerNatives();
    

    本地方法都是native修饰的,native是一个原生态方法,方法的实现不是在当前文件,而是用其他语言实现的,java本身不能对操作系统底层进行访问和操作,但是可以通过JNI(Java Native Interface)接口调用其他语言来实现对底层的访问。有兴趣的可以看一下《JNI编程指南》

  • static {
        registerNatives();
    }
    

​ 顾名思义,该方法是用来注册本地方法的,也就是初始化java原生方法映射到对应的其他语言描述方法

  • public final native Class<?> getClass();
    

​ getClass()方法返回Object运行时类,一般在反射时,我们需要获取某个类的class对象,可以通过对象.class()获得

  • public native int hashCode();
    

​ hashCode()一般和equals(Object obj)一起用,在大量数据进行比较的时候,为了提高比较效率,会先比较hashCode()值是否相等,如果不相等,则equals(Object obj)就不需要比较了,因为肯定不同,如果hashCode值相等, 在比较equals(Object obj)是否相同,前提是必须重写hashCode()方法和equals(Object obj)方法。至于为什么要重写,大家可以看一下《为什么要重写hashcode和equals方法?》

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

​ 通过源码我们可以看出,如果不重写equals(Object obj)方法,那么equals(Object obj)就是==,而==比较的是基本类型的内容,引用类型的地址,即比较的都是栈内存中的值。

  • protected native Object clone() throws CloneNotSupportedException;
    

​ 返回一个此类的克隆对象,二者具有相同的属性,和独立的属性存储空间,存在浅克隆和深克隆,浅克隆中拷贝对象和原始对象引用的类型引用同一个对象,也就是说原始对象的引用类型引用的对象发生变化时,对应的拷贝对应的引用类型引用对象也会跟着改变,而深克隆则是拷贝对象和原始对象的引用类型引用的不同对象,发生变化时不会跟着变。可以看一下《浅克隆与深克隆》

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

​ 一般用来返回对象的属性值,用作调试的时候重写该方法将相应的属性打印出来。

  • public final native void notify();
    

​ notify()唤醒一个在这个对象的监视器上等待的单个线程。因为一个CPU一次只能处理一个进程(线程),为了方便管理线程执行,就需要监视器对某些进程进行管理,维持他们之间的秩序,唤醒的线程不是得到CPU的使用权,而是和其他就绪线程竞争。也就是将阻塞状态转换为就绪状态,并不是立即执行。

  • public final native void notifyAll();
    

​ 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);
    }
    

​ wait()方法是让一个线程进入等待状态并释放锁,通过设置相应的参数表示等待的时间,时间到后自动唤醒,或者中途由notify()和notifyAll()方法唤醒,timeout(以毫秒为单位),nanos(以纳秒为单位),总时间=1000000*timeout+nanos。另外wait()=wait(0)=wait(0,0),都是无期限,只能通过偶notify()或notifyAll()唤醒。notify()、notifyAll()和wait()都必须在同步(Synchronized)方法/代码块中调用,因为必须获得锁才能释放锁,必须自身有锁才能将锁交给其他线程。

  • protected void finalize() throws Throwable { }
    

​ 当垃圾回收器将要回收对象所占内存之前被调用。几乎不会使用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值