Object源码解析

0、写在正文前

用了几年Java,你是否去看过Object中的源码,是否知道其中方法各自的实现过程及用途呢,今天就一起来学习Object的源码吧~~~

1、带着问题看源码
  • Object中有哪些方法?
  • hashCode方法是不是本地方法?
  • equals比较的是什么?怎么比较的?
  • clone方法的作用?
  • 讲一下toString方法?
  • 讲一下wait方法?
  • 讲一下notify、notifyAll方法?
2、Object中有哪些方法?
  • hachCode
  • equals
  • clone
  • toString
  • notify
  • notifyAll
  • wait
  • finalize
3、hashCode方法是不是本地方法?

看过源码的应该都知道是native方法

	public native int hashCode();
4、equals比较的是什么?怎么比较的?

指示其他某个对象是否与此对象“相等”。

源码如下:

    public boolean equals(Object obj) {
        return (this == obj);
    }
5、clone方法的作用?

源码:

	protected native Object clone() throws CloneNotSupportedException;

作用:

clone方法是用来复制一个对象。不同于“=”。

对于值类型的数据是可以通过“=”来实现复制的。但是对于引用类型的对象,“=”只能复制其内存地址,使对象的引用指向同一个对象,而不会创建新的对象。clone则可以创建与原来对象相同的对象。
 
看源码可知clone是一个native方法并且用protected修饰,所以我们不能直接调用object类的clone方法

使用方式:

  • 实体类实现Cloneable接口
  • 重写clone方法

例子:

	      TestClone obj = new TestClone();
        //使用 clone 复制
        Object objClone = obj.clone();
        System.out.println(obj.toString());
        System.out.println(objClone.toString());
        System.out.println(obj == objClone);

        //使用 = 复制
        TestClone objObj = obj;
        System.out.println(obj.toString());
        System.out.println(objObj.toString());
        System.out.println(obj == objObj);

测试结果:
testClone测试结果

6、讲一下toString方法?

源码:

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

看源码得知调用tostring方法后输出一串字符串,类名+@+该对象hashcode的16进制字符串

7、讲一下wait方法

wait()的作用是让当前线程进入等待状态,同时,wait()也会让当前线程释放它所持有的锁。“直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法”,当前线程被唤醒(进入“就绪状态”)

8、讲一下notify、notifyAll方法

notify()和notifyAll()的作用,则是唤醒当前对象上的等待线程;notify()是唤醒单个线程,而notifyAll()是唤醒所有的线程。