Object

Object

提出问题

  • Object的方法?
  • == 和 equals区别?
  • hashCode 作用?
  • Class<?> 的作用?

解决问题

Object 的继承关系

  • Object 类是所有类的根类。
  • 每个类都使用 Object 作为超类。
  • 所有对象(包括数组),都实现了这个类的方法。

Object 的属性

Object 的构造方法

public Object() {}

Object 的静态方法

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

Object 的实例方法

/**
* native 方法;被 final 修饰,不允许子类重写;返回当前运行对象的 Class 对象
*/
public final native Class<?> getClass();
/**
* native 方法;返回当前对象的哈希码,支持此方法是为了有利于哈希表
*/
public native int hashCode();
/**
* 用于比较两个对象的内存地址是否相等
*/
public boolean equals(Object obj)
/**
* native 方法;创建并返回此对象的副本
*/
protected native Object clone() throws CloneNotSupportedException;
/**
* 返回 类名 + @ + 对象哈希码的无符号十六进制
*/
public String toString() 
/**
* native 方法;被 final 修饰,不允许子类重写;唤醒一个在此对象监视器(锁)上等待的线程。若有多个线程在等只会任意唤醒一个。
*/
public final native void notify(); 
/**
* native 方法;被 final 修饰,不允许子类重写;唤醒在此对象监视器上等待的所有线程。
*/
public final native void notifyAll();
/**
* native 方法;被 final 修饰,不允许子类重写;使当前线程等待,timeout – 等待的最长时间(以毫秒为单位)
*/
public final native void wait(long timeout) throws InterruptedException;
/**
* 被 final 修饰,不允许子类重写;nanos – 额外时间,以纳秒为单位,范围 0-999999。
*/
public final void wait(long timeout, int nanos) throws InterruptedException
/**
* 被 final 修饰,不允许子类重写;该方法一直等待,没有超时时间这个概念
*/
public final void wait() throws InterruptedException
/**
* 通常目的是在对象被不可撤销地丢弃之前执行清理操作
*/
protected void finalize() throws Throwable    

延伸问题

Class<?>

  • 实际返回类型为 Class<? extends |X|>。
  • |X|是调用getClass方法时的静态类型。
  • 此种写法不需要强制转换。

hashCode 和 equals

  • 如果两个对象equals的结果相等,则两个对象中的每一个调用hashCode必产生相同的整数结果。
  • 如果两个对象equals的结果不等,则不需要对两个对象中的每一个调用hashCode方法都必须产生不同的整数结果。但是,为不相等的对象生成不同的整数结果可能会提高哈希表的性能。
  • hashCode 方法可以为不同的对象返回不同的整数。(这通常通过将对象的内部地址转换为整数来实现)。
  • 对于任何非空引用值x和y ,当且仅当x和y引用同一个对象时,此方法才返回true 。
  • 每当重写equals方法时,通常都需要重写hashCode方法。

clone

  • clone 方法执行此对象的浅拷贝。
  • 若该对象的类没有实现接口Cloneable ,则抛出CloneNotSupportedException。
  • 所有数组都被认为实现了Cloneable接口。
  • 通过super.clone调用,若对象内部仍有对象,则需要再次调用super.clone。
  • 若当前线程不是此对象监视器的所有者,抛出IllegalMonitorStateException。

给对象上锁的方式

  • 通过执行该对象的同步实例方法。
  • 通过执行在对象上同步的synchronized语句的主体。
  • 对于Class,通过执行该类的同步静态方法。

唤醒线程的方式

  • 其他线程为此对象调用notify方法,而当前等待线程恰好是要被唤醒的线程。
  • 其他线程为此对象调用notifyAll方法。
  • 其他线程中断等待线程 。
  • 过了指定的等待时间。

虚假唤醒

  • 多线程环境下,有多个线程执行了wait()方法,需要其他线程执行notify()或者notifyAll()方法去唤醒它们,假如多个线程都被唤醒了,但是只有其中一部分是有用的唤醒操作,其余的唤醒都是无用功;对于不应该被唤醒的线程而言,便是虚假唤醒。
  • 虚假唤醒使用if判断会产生错误的数据。
  • 因为存在虚假唤醒现象,推荐使用while进行循环判断,避免错误数据的产生。

registerNatives

  • 该方法的功能是,先定义registerNatives()方法,然后当该类被加载的时候,调用该方法完成对该类中本地方法的注册。
  • 注册的方法就是该类所包含的除了registerNatives()方法以外的所有本地方法。
posted @ 2022-07-23 22:41  加油,每天一点小进步!  阅读(52)  评论(0)    收藏  举报