文章目录
- 1. public final native Class<?> getClass()
- 2. public native int hashCode()
- 3. public boolean equals(Object obj)
- 4. protected native Object clone() throws CloneNotSupportedException
- 5. public String toString()
- 6. public final native void notify()
- 7. public final native void notifyAll()
- 8. public final native void wait(long timeout) throws InterruptedException
- 9. public final void wait(long timeout, int nanos) throws InterruptedException
- 10. public final void wait() throws InterruptedException
- 11. protected void finalize() throws Throwable()
- 文章参考于
- 首先说明两点
- Object 是一个特殊的类,是所有类的父类;它提供了11个方法
- native(本地的)方法:一个java调用 非java 代码的接口,也就是该方法的实现并不是java代码实现的,比如使用c或者c++实现的。native关键字说明其修饰的方法是一个原生态方法,方法对应的实现不是在当前文件,而是在用其他语言(如C和C++)实现的文件中。Java语言本身不能对操作系统底层进行访问和操作,但是可以通过JNI接口调用其他语言来实现对底层的访问。(附一链接: JAVA中的native是什么?)
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个规则
- 自反性。对于任何非 null 的引用值 x,x.equals(x) 应该返回 true
- 对称性。对于任何非 null 引用值 x 和 y ,当且仅当: y.equals(x) 返回 true时,x.equals(y)才返回 true
- 传递性。对于任何非 null 引用值 x y 和 z,如果 y.equals(x)返回 true,y.equals(z)返回 true,那么 x.equals(z)也应该返回true
- 一致性。对于任何非 null 引用值 x 和 y,假设对象上 equals 比较中的信息没有被修改,则多次调用 x.equals(y) 始终返回 true 或者 始终返回false
- 对于任何非 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 方法,只能在同步方法或同步块中使用。