第一篇博文—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