Object 中的11个方法简介

1. public final native Class<?> getClass()
  • navtive方法,用于返回当前运行时对象的Class对下你给,使用了 final 关键字修饰,所以不允许子类重写
2. public native int hashCode()
  • native方法,用于返回对象的哈希吗,主要使用在哈希表中,比如jdk中的 HashMap
3. public boolean equals(Object obj)
  • 用于比较两个对象的内训地址是否相等,String 类对该方法进行了重写用于比较字符串的值是否相等
  • 有以下5个规则
    1. 自反性。对于任何非 null 的引用值 x,x.equals(x) 应该返回 true
    2. 对称性。对于任何非 null 引用值 x 和 y ,当且仅当: y.equals(x) 返回 true时,x.equals(y)才返回 true
    3. 传递性。对于任何非 null 引用值 x y 和 z,如果 y.equals(x)返回 true,y.equals(z)返回 true,那么 x.equals(z)也应该返回true
    4. 一致性。对于任何非 null 引用值 x 和 y,假设对象上 equals 比较中的信息没有被修改,则多次调用 x.equals(y) 始终返回 true 或者 始终返回false
    5. 对于任何非 null 引用值x,x.equals(null) 用返回 false
4. protected native Object clone() throws CloneNotSupportedException
  • native 方法,用于创建并返回当前对象的一份拷贝。

  • x.clone() != x //true

  • x.clone().getClass() == x.getClass() //true

  • Object 本身是没有实现Cloneable接口的,所以不重写 0.clone方法并且进行调用的话会发生CloneNotSupportedException异常。

5. public String toString()
  • 返回对象的字符串表示形式。实际上是该符号字符的 ‘类名称的字符串@’ 和 对象的哈希吗的无符号16进制的表示。换句话说就是返回了下列值的字符串:
  • getClass().getName() + “@” + Integer.toHesString(hashCode)
  • 建议 Object 所有子类都重写这个方法
6. public final native void notify()
  • native方法,并且不能重写。
  • 唤醒一个在此对象监视器上等待的线程(监视器相当于就是锁的概念)
  • 如果有多个线程在等待只会唤醒一个。
7. public final native void notifyAll()
  • native方法,并且不能重写。
  • 作用跟 notify() 一样,只不过会唤醒在此对象监视器上等待的所有线程,而不是一个线程。
8. public final native void wait(long timeout) throws InterruptedException
  • native 方法,并且不能重写。
  • 作用是:暂停线程的执行。
  • 注意:sleep() 方法没有释放锁,wait释放了锁。timeout 是等待时间。
9. public final void wait(long timeout, int nanos) throws InterruptedException
  • 比上者多了 nanos参数,表示额外的时间(以毫秒为单位,范围是 0 - 999999)。
10. public final void wait() throws InterruptedException
  • 跟上面两个一样,只不过该方法会一直等下去,没有超时这个概念
11. protected void finalize() throws Throwable()
  • 实例被垃圾回收器回收的时候出发的操作
一些延伸的问题
  • 为什么重写 equals 时必须重写 hashCode方法?

    • 数据机构中有一个Map接口的类会使用到键对象的哈希码,在我们调用 put() 或者 get() 方法对 Map 容器进行操作时,是根据键对象的哈希码来计算存储位置的,因此如果我们对哈希码的获取没有相关保证,就可能得不到预期的结果。
    • 在java中,我们可以使用 hashCode() 来获取对象的哈希码,其值就是对象的存储地址。(hashCode()的值是通过Object对象的地址计算得出的)因为Object对象只与自身相等,所以同一个对象的地址总是相等的,计算得出的哈希码也必然相等们对于不同的独享,由于地址不用,所获取的哈希码自然也不会相等。
  • equals() 与 == 的区别

    • 默认情况下,都是从Object 继承而来的 equals() 与 == 是完全等价的,比较都是对象的内存地址,但我们可以重写 equals(),使其按照我们需求的方式进行比较,如 String 类重写了 equals() ,使其比较的是字符的序列,而不是内存地址。
  • sleep() 和 wait() 的区别

    • sleep():可以使正在执行的线程让出 cpu,然后cpu就可以去执行其他任务了,在sleep指定的时间结束后cpu会再次回到该线程继续往下执行(sleep只是让出了cpu,并不会释放同步资源锁);sleep()属于线程类(Thread)方法,可以在任何地方使用。
    • wait():是当前线程让出同步资源锁,以便其他正在等待该资源的线程得到该资源而运行(进入了等待队列),只有调用了notify()方法,之前调用 wait() 的线程才会解除 wait 状态,重新获得 去竞争同步资源的资格,得到资源后,方可执行;wait() 属于 Object 方法,只能在同步方法或同步块中使用。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值