Object源码

Object源码学习笔记

​ 一、Object类拥有的方法:

  1. registerNatives():注册本地方法 在Object的Static块里,说明类加载时要加载本地方法

  2. getClass():获取Class对象 注意和类名.class的区别

    @Test
    public void testClass(){
        Parent p = new Son();
        System.out.println(p.getClass()); // class com.ys.test.Son 运行时对象
        System.out.println(Parent.class); // class com.ys.test.Parent 编译时对象
    }
    
    
  3. hashCode():获取对象的哈希码

    hashCode的要求:
    
      两个对象相等,其 hashCode 一定相同;
    
     两个对象不相等,其 hashCode 有可能相同;
    
     hashCode 相同的两个对象,不一定相等;
    
     hashCode 不相同的两个对象,一定不相等;
    
    对于 Map 集合,我们可以选取Java中的基本类型,还有引用类型 String 作为 key,
    因为它们都按照规范重写了 equals 方法和 hashCode 方法。但是如果你用自定义对象作为 key,
    那么一定要覆写 equals 方法和 hashCode 方法,不然会有意想不到的错误产生。
    
  4. equals():比较方法 在Object里equals和==等价,都是比较对象的引用地址,如果两个对象的引用相等,那么这两个对象一定是相等的

    这里可以看下String类重写的equals方法

        public boolean equals(Object anObject) {
            // 如果引用相同,则2个对象一定相同
            if (this == anObject) {
                return true;
            }
            // 如果另一个对象是String才比较
            if (anObject instanceof String) {
                String anotherString = (String)anObject;
                int n = value.length;
                // 2个对象长度相等才比较
                if (n == anotherString.value.length) {
                    char v1[] = value;
                    char v2[] = anotherString.value;
                    int i = 0;
                    // 比较每个字符,每个字符都相等才返回true
                    while (n-- != 0) {
                        if (v1[i] != v2[i])
                            return false;
                        i++;
                    }
                    return true;
                }
            }
            return false;
        }
    
  5. clone():克隆方法,这里可以配合浅拷贝和深拷贝理解

    	浅拷贝(Shallow Copy):基本类型值传递,引用类型传递引用(拷贝与被拷贝对象修改都会影响到对方)
    	深拷贝:引用对象的值等信息,复制一份一样的。
    	
    	直接调用super.clone()方法是浅拷贝,如果想实现深拷贝,可以对内部的对象变量再次调用clone方法
    
  6. toString() :Object中的toString():类名+hashCode,大多数的集合类都重写了toString方法

       public String toString() {
            return getClass().getName() + "@" + Integer.toHexString(hashCode());
        }
    
    
  7. notify():随机唤醒一个在等待队列的线程

  8. notifyAll():唤醒在等待队列的全部线程

  9. wait():让当前线程加入等待队列

  10. finalize():释放资源方法(在GC的时候会自动调用) 不建议手动调用

猜你喜欢

转载自blog.csdn.net/shy1449/article/details/89489339