• 你知道java的Object对象里面都包含什么吗?


    Java作为一个庞大的知识体系,涉及到的知识点繁多,本文将从Java中最基本的类java.lang.Object开始谈起。
    Object类位于java.lang包中,java.lang包包含着Java最基础和核心的类,在编译时会自动导入。Object类没有定义属性,一共有13个方法,具体的类定义结构如下图:
    idea :alt+7

    其主要作用是将C/C++中的方法映射到Java中的native方法,实现方法命名的解耦。

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

    *返回这个{@code对象}的运行时类。返回的

    • {@code类}对象是被{@code锁定的对象 (效果与Object.class相同。)
      被表示类的静态同步}方法。

    public final native Class<?> getClass();

    对象重写euqase方法必须重写hashcode方法

    /**
    *

    •  * 原则1:一致性————多次调用同一个对象的这个方法,返回的值一样
      
    • 2、如果2个对象equals为true, 那么它们的hashCode为一样的值
    • 3、不过如果2个对象equals为false, 那么hashCode也可能为一样的值
    •  * 开发者应该注意:先使用hashCode进行筛选,可以提高哈希表的性能
      
    •  4、尽可能合理地定义这个方法
      
    •  * 有些类: 不同的对象(内存地址),哈希码不同;
      
    •  * 有些类: 不同的内容, 哈希码不同
      
    •  * 根据我们的需要决定是否重写方法,有以上两种情况,不过不管是哪种情况,根据以上第二、三点,
      
    •  * 在使用时,(1)我们先用HashCode方法比较两个对象的哈希值是否相等,若不等,则一定不是同一个        
      
    •  * 对象or内容相同;反之,进第二步判断
      
    •  *(2)再用equals方法比较两个对象是否为同一个对象or内容是否相同,若返回结果为true,则同一个
      
    •  *对象or内容相同
      
    •  *之所以按照这个规则,我想大概基于两点:i、hashCode其实是将地址or内容采用一种算法进行映射得    
      
    •  *到一种编码,而equals则是直接比较两个对象的地址or内容是否相同。 所以,hashCode存在冲突的
      
    •  *现象————内容or地址不同的2个对象,hashCode值相同 ii、尽管equals是直接比较,但是其消耗较大
      
    •  *所以,先用hashCode有助于提高性能,筛选掉大部分情况(毕竟冲突时小概率事件)
      
    • @return
      */
      public native int hashCode();

    /**
    注意是非空对象的等价关系,也就是说,null不能调用

    • 性质1、反射性--任何 非空引用 调用自身,返回结果都是true
    • 2、 对称性--两个引用 互相调用,返回结果一样
    • 3、 传递性
      4、 一致性--两个对象之间的调用 多少次还是那个结果 前提是没有信息被修改
    • 5、 任意非空引用 调用null 返回的都是false
      • 不管equals方法有没有重写,我们都要重写hashCode方法
    •  *从而保证————equal的对象(无重写:内存地址相同,指向同一个对象;有重写:内容相同)
      
    •  *具有相同的hashCode值:for 地址or 内容的各个位 + hashCode算法 ==得到 相同的值
      

    */
    public boolean equals(Object obj) {
    return (this == obj); // 比较的是两个对象的内存地址
    // 前面总是说reference object,也就是引用型数据,而不是基本类型数据(比较简单)
    //基本数据类型一般都是用 ==
    }

    /**

    • (1)clone方法是产生对象的一个独立副本
    • (2)对象x和它clone的独立副本 调用getClass方法 结果一样
    •  * 但这些不是绝对的条件(意思是clone可以重写吗?)
      
    •     * x的clone副本 和 自己 equal  但是不是绝对的(意思是如果equal的是地址的话就不一定?)
      
    •     按照惯例,返回的对象应该通过super.clone调用得到
      
    •  *如果一个类和它所有父类遵循这个惯例,那么x.clone().getClass() == x.getClass()
      
    •  按照惯例,返回的对象是独立的
      
    •  *为了实现这个独立性,返回副本之前 有必要修改这个对象的一个or多个元素
      
    •  *通常,这意味着复制组成这个对象深层结构的所有可变元素,并用副本的引用替换这些元素的引用
      
    •  *如果一个类只包含原始字段、不可变元素的引用,那么super.clone返回的对象 没有字段需要修改
      
    •  *大概意思: 浅拷贝  只复制引用的值,没有复制可变元素所引用的对象
      

    */
    protected native Object clone() throws CloneNotSupportedException;
    深克隆与浅克隆

    /**

    •  *返回这个对象的 字符串表示
      
    •     *建议所有子类重写此方法
      
    •     返回的字符串包括:类的名字、@、对象的16进制表示的哈希值
      
    • @return
      */
      public String toString() {
      return getClass().getName() + "@" + Integer.toHexString(hashCode());
      }

    /**

    • 唤醒在这个对象的监视器上的 一个等待线程
    •  *如果有线程在等待队列中等待(通过调用wait方法,一个线程在对象的监视器上等待),其中的一个
      
    •  *被选中唤醒。这种选择是任意的,根据算法进行竞争(最着急的线程)
      
    •  唤醒的线程将无法继续(被其他对象使用?在等待) 直到当前线程放弃对这个对象的锁定
      
    •  *被唤醒的线程 以通用的方式 与任何其他(积极竞争同步这个对象的)线程竞争
      
    •  *同步,是说没有特权,都有机会成为能够锁定该对象的线程
      
    •  这个方法只能被一个线程(这个线程是 对象的监视器的所有者)调用
      
    •  *一个线程可以以3种方式 成为这个对象的监视器的所有者
      
    •   1、在调用notify()之前,线程必须获得该对象的对象级别锁
      
    •  * 2、执行完notify()方法后,不会马上释放锁,要直到退出synchronized代码块,当前线程才会释放
      
    •  *锁
      
    •  * 3、notify()一次只随机通知一个线程进行唤醒
      
    •  原则:一次只能有一个线程 拥有一个对象的监视器
      
    •  如果当前线程 不是这个对象的monitor的所有者,抛出IllegalMonitorStateException
      

    */
    public final native void notify();

    //唤醒所有 等待在这个对象的监视器上的线程
    public final native void notifyAll();

    //实现二:使线程进入等待状态,直到被notify or notifyAll调用
    public final native void wait(long timeout) throws InterruptedException;

    //第一种实现:使线程进入等待状态,直到被notify or notifyAll调用 or 等待时间达到限定值
    

    //timeout - 要等待的最长时间(以毫秒为单位)。
    //nanos - 额外时间(以毫微秒为单位,范围是 0-999999)
    //超时时间=1000000*timeout+nanos(毫微秒)。
    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);
    }
    

    //实现二:使线程进入等待状态,直到被notify or notifyAll调用
    public final void wait() throws InterruptedException {
    wait(0);
    }

    //当垃圾回收器将要回收对象所占内存之前被调用
    protected void finalize() throws Throwable { }

  • 相关阅读:
    css文字两端对齐,而且居中
    vue项目做微信分享总结
    js获取url参数
    vue微信支付遇到的坑
    Win7的环境变量下的系统变量path不小心修改了,怎么恢复
    解决ios上滑动不流畅及滚动条隐藏无效问题
    数组更新检测
    列表渲染
    条件渲染
    vue调试工具的安装
  • 原文地址:https://www.cnblogs.com/q1359720840/p/16290521.html
Copyright © 2020-2023  润新知