• jdk源码Object类解析


    一 简介

     java.lang.Object,是Java所有类的父类,在你编写一个类的时候,若无指定父类(没有显式extends一个父类),会默认的添加Object为该类的父类。

     在JDK 6之前是编译器处理,即编译后的zclass字节码可以显示的看到 extends  Object.

     JDK 7之后是虚拟机处理,class字节码已经看不到了,虚拟机执行代码会默认添加Object类为父类。

     我们在编辑器里(IDE)打点时就能列出Object类下的方法,此时还没轮到编译器和jvm,编辑器就已经知道MyClass类的父类是Object类了,这是因为编辑器为我们做了一些智能处理.

    二 代码解析

    public class Object {
        //native修饰的方法都是本地方法,即在C/C++在DLL中已经实现,通过JNI调用
        private static native void registerNatives();
        //类初始化调用此方法
        static {
            registerNatives();
        }
    
        /**
         * Constructs a new object.
         */
        @HotSpotIntrinsicCandidate
        public Object() {}
    
        /**
         * 返回此Object的运行时类(每个类的Class类对象)
         * 每一个类在被加载的时候,都会生成一个Class类实例,
         * 而这个方法就可以在运行时期获得对象(这里的对象是堆里的那个对象,也就是获得的是动态类型的那个类)的Class对象,Class对象主要用于反射。
         */
        @HotSpotIntrinsicCandidate
        public final native Class<?> getClass();
    
        /**
         * 这个方法返回对象的哈希码值,这个方法与哈希表的性能有关,它的实现方法是通过将对象在内存中所处于的位置转换成数字,这个数字就是hashCode
         */
        @HotSpotIntrinsicCandidate
        public native int hashCode();
    
        /**
         * 对比两对象的内存地址,如果不重写,equals方法比较的是对象地址
         * 判断其它对象是否与此对象“相等”;如果一个对象要重写这个方法,需要与其它非空对象满足等价关系:以下的x,y,z均为非空对象
         * (1)自反性,x.equals(x)=true;
         * (2)对称性,x.equals(y) = y.equals(x);
         * (3)传递性,若x.equals(y) = true,y.equals(z) = true,则x.equals(z) = true;
         * (4)一致性,只要equals的比较操作在对象中所用的信息没有被修改,多次调用x.equals(y)就会一致地返回相同结果;
         * (5)x.equals(null) = false;
         * 注意: 当重写equals方法时,也要重写hashCode方法,这是为了确保相等的对象有相同的哈希码值
         */
        public boolean equals(Object obj) {
            return (this == obj);
        }
    
        /**
         * protected方法,子类可重写,创建并返回此对象的一个副本。
         * 所有的数组都被视为实现接口 Cloneable,且 数组类型T[]的 clone方法返回的类型是T[] ,T 可以是任何引用或基本类型
         * 一个类只有实现了Cloneable接口(标记接口,无任何内容,只针对clone方法),才可以在该类的实例上调用clone方法,否则会抛出CloneNotSupportException。
         * Object中默认的实现是一个浅拷贝,也就是表面拷贝,如果需要实现深层次拷贝的话,必须对类中可变域生成新的实例
         */
        @HotSpotIntrinsicCandidate
        protected native Object clone() throws CloneNotSupportedException;
    
        /**
         * 返回对象的的字符串表示,默认是:类名+@+此对象哈希码的无符号十六进制表示组成,即值等于:getClass().getName() + '@' + Integer.toHexString(hashCode())
         */
        public String toString() {
            return getClass().getName() + "@" + Integer.toHexString(hashCode());
        }
    
        /**
         * 唤醒在此对象监视器上等待的线程,如果有多个,随机选择一个
         */
        @HotSpotIntrinsicCandidate
        public final native void notify();
    
        /**
         * 唤醒在此对象监视器上等待的所有线程
         */
        @HotSpotIntrinsicCandidate
        public final native void notifyAll();
    
        /**
         * final修饰,不可重写,永久等待,直到被唤醒
         */
        public final void wait() throws InterruptedException {
            wait(0L);
        }
    
        /**
         * 本地已实现方法,在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待
         * 在超过给定参数 timeoutMillis 时间之前会一直等待,可提前被唤醒,即等个最大等待时间,如果是0 则永久等待
         */
        public final native void wait(long timeoutMillis) throws InterruptedException;
    
        /**
         * 与上面方面相同,但是可以精确控制时间到 毫微妙级别
         * timeoutMillis - 毫秒
         * nanos - 毫微妙
         * 1秒=1000豪秒 1毫秒=1000微秒 1微秒=1000毫微秒
         */
        public final void wait(long timeoutMillis, int nanos) throws InterruptedException {
            if (timeoutMillis < 0) {
                throw new IllegalArgumentException("timeoutMillis value is negative");
            }
            if (nanos < 0 || nanos > 999999) {
                throw new IllegalArgumentException(
                        "nanosecond timeout value out of range");
            }
            if (nanos > 0) {
                timeoutMillis++;
            }
            wait(timeoutMillis);
        }
    
        /**
         * finalize()是Object的protected方法,子类可以覆盖该方法以实现资源清理工作,GC在回收对象之前调用该方法,jdk9之后已被废弃
         * 一个对象只会调用一次
         */
        @Deprecated(since="9")
        protected void finalize() throws Throwable {}
    }
  • 相关阅读:
    android5.1 修改音量键绑定多媒体声音
    如何使用Android Studio开发/调试Android源码
    git远程从入门到放弃
    java.lang.IllegalStateException: Restarter has not been initialized
    SpringBoot,Vue前后端分离开发首秀
    SpringBoot结合swagger2快速生成简单的接口文档
    SpringBoot整合SpringData JPA入门到入坟
    SpringBoot结合Swagger2自动生成api文档
    uni-app初体验及打包成apk
    Jave Web阿里云短信服务发送验证码
  • 原文地址:https://www.cnblogs.com/houzheng/p/12061296.html
Copyright © 2020-2023  润新知