第一篇博文—Object源码知识点


Object源码

1.代码执行顺序

  1.1 先执行父类的static代码块

  1.2 执行子类的static代码块

  1.3 执行父类的非静态代码块(初始化才会执行)

  1.4 执行父类的构造器

  1.5 执行子类的非静态代码块(初始化才会执行)

  1.6 执行子类的构造器

 

2.擦除带来的问题

  2.1. 在类里面不可以new,不可以instanceof

 

3.Object.hashCode()源码

  

  3.1. 无论什么时候在一个Java应用里hashCode方法被调用多少次,hashCode方法都返回相同的integer,而同一个应用被执行两次,hashCode返回值不需要相同。

  

  3.2. 如果两个对象用equal方法比较返回想等的结果,那么分别调用hashCode方法会返回相同的值。

  

  3.3. 如果两个对象用equals方法比较不相等,那么hashCode方法不必产生相同的结果。然而程序员应该意识到,不相等的对象hashCode方法产生不相等的integer值,会改善提高hash tables的性能。

  

  3.4 通常来说,不同的对象产生不同integer值,hashCode返回的integer值由对象的地址转化而来,但不是Java实现的。

 

4.Object.equals()方法

 

  4.1 自身相等性:对于任意非null引用,x.equals(x)应该返回true。

    

  

  4.2 对称性:对于任意非null引用,当且仅当y.equals(x)返回true的时候,x.equals(y)返回true。

    

  

  4.3 传递性:

 

 

 

  

  4.4 一致性:

 

  

  4.5 任何非null引用x,x.equals(null)应该返回false。

 

  

  4.6 值得注意的是:equals()方法被重写,一般重写hashcode()方法是必要的,为了维护共同的约定(如果equals方法返回true,则必须有相等的hash codes)。

5.clone()

  

  5.1  意思就是说clone方法返回的对象要独立于原对象,为了完成这种独立性,更改一个或者多个属性是很有必要的(在调用super.clone()方法之后和返回之前)

    就是拿原来的对象被拷贝的引用并且修改之后填充到新的对象中。

    如果一个类只包含原始的属性,或者引用就不需要被修改。

  

  

  5.2 首先所有的数组都实现了Cloneable这个接口

    浅复制不是深复制

 

  

   5.3 如果这个引用的类没有实现Cloneable这个接口就会抛出这个异常。

 6.notify()方法

  6.1  唤醒一个正在等待这个对象的监控的线程,如果有多个线程在等待,他们其中的一个被唤醒。被唤醒的线程是随机的。

    可以通过调用wait()方法来等待这个对象的监控。(关键词,被唤醒是任意的,可以调用wait方法等待)

  6.2 被唤醒的线程直到放弃这个对象的锁,才会停止运行。被唤醒的线程下次会以正常的方式竞争对象锁,比如,这个线程在下次竞争过程中,没有优势或者劣势。

  

  

  6.3 notify()方法只有锁的监控的拥有者才可以调用,以下三种可以成为对象的监控的所有者。

    同一时间对象的监控只有一个所有者。

 

  

7.wait()方法

  

  这里参考:https://www.jianshu.com/p/be7d5f1460c1