Object相关的知识

Object类是所有类的父类,但是不会显示的写出来 entexds Object,所以所有的类都可以使用Object中的方法,那么Object中都有什么方法?(这里使用的是java 9 版本,不要问我为什么是9)

Object的成员方法

在这里插入图片描述
以下逐个进行了解:

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

和静态代码块配合使用的,在类创建的时候就会直接调用。
大概意思就是定位本地方法,将其与该类进行链接,可以在该类调用本地方法的时候直接使用。
一个Java程序要想调用一个本地方法,需要执行两个步骤:第一,通过System.loadLibrary()将包含本地方法实现的动态文件加载进内存;第二,当Java程序需要调用本地方法时,虚拟机在加载的动态文件中定位并链接该本地方法,从而得以执行本地方法。registerNatives()方法的作用就是取代第二步,让程序主动将本地方法链接到调用方,当Java程序需要调用本地方法时就可以直接调用,而不需要虚拟机再去定位并链接。

  • Object() 构造方法
  • getclass 返回此object的运行时类
@HotSpotIntrinsicCandidate
public final native Class<?> getClass();

调用本地的getClass方法

  • hashCode
@HotSpotIntrinsicCandidate
public native int hashCode();
  • equals
public boolean equals(Object obj) {
        return (this == obj);
    }
  • clone 创建并返回此对象的副本
@HotSpotIntrinsicCandidate
    protected native Object clone() throws CloneNotSupportedException;
  • toString 返回对象的字符串表示形式,默认是对象类名@hashCode
public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }
  • notify 唤醒正在等待的单个线程 随机的
@HotSpotIntrinsicCandidate
    public final native void notify();
  • notifyAll 唤醒正在等待的所有线程
@HotSpotIntrinsicCandidate
    public final native void notifyAll();
  • wait的三种重载
    如果wait传入参数,且不为0,除了可以使用notifu唤醒外,当时间到达设定时间,也会就绪,重新等待调度,但是如果没有参数,或者参数为0,那么就只能等待notify唤醒
public final native void wait(long timeout) throws InterruptedException;
//释放锁,进入等待,直到被唤醒,或者是超过等待的时间,然后该线程就绪,等待CPU的调度
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);
    }
    //其中long的单位是纳秒,int单位是毫秒,CPU在计算等待的时候都是以纳秒为单位,
    //所以官方文档上等待的时间为1000000*timeout+nanos  
public final void wait() throws InterruptedException {
        wait(0);
    }
    //释放锁,进入等待,直到被唤醒 和wait(0),wait(0,0)效果是一样的
  • finalize
    当垃圾收集确定不再有对该对象的引用时,垃圾收集器在对象上调用该对象。简单理解为对象的销毁
@Deprecated(since="9")
    protected void finalize() throws Throwable { }

object的组成

参考博文
java中object大小为16个字节
一个object由标记字、类型指针、实例数据、对齐补位组成,其中类型指针是默认开启压缩的,在不压缩的情况下,标记的大小为8个字节、类型指针为8个字节,如果object没有进行实例化(创建的就是object),那么实例数据大小也为0,刚好是16位,没有对齐补位。如果压缩,也是16,类型指针压缩成4,对齐补位再补4
如果实例数据不为空,就需要按数据类型进行计算。
标记字和类型指针又称为对象头,也就是一个对象的组成是对象头+数据实例+补齐,如果前两个加起来刚好为8的倍数,那就不用补齐,如果不是,就补齐。如果类型为数组,还需要一个数组长度,占用4个字节。
在这里插入图片描述
在这里插入图片描述

对象头的具体结构

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值