面试题
Java 语言是一种单继承结构语言,Java 中所有的类都有一个共同的祖先。这个祖先就是 Object 类。
如果一个类没有用 extends 明确指出继承于某个类,那么它默认继承 Object 类。
Object 的方法我们在平时基本都会用到,但如果没有准备被忽然这么一问,还是有点懵圈的。
分析
Object 类是 Java 中所有类的基类,位于 java.lang 包中,一共有 13 个方法。
具体解答
1. Object()
Object 类的构造方法。(非重点)
2. registerNatives()
为了使 JVM 发现本机功能,它们被一定的方式命名。例如,对于 java.lang.Object.registerNatives,对应的 C 函数命名为 Java_java_lang_Object_registerNatives。
通过使用 registerNatives(或者更确切地说,JNI 函数 RegisterNatives),可以命名任何你想要你的 C 函数。(非重点)
3. clone()
clone() 函数的用途是用来复制一个当前存在的对象。只有实现了 Cloneable 接口才可以调用该方法,否则抛出 CloneNotSupportedException 异常。(注意:回答这里时可能会引出设计模式的提问)
4. getClass()
final 方法,用于获得运行时的类型。该方法返回的是此 Object 对象的类对象/运行时类对象 Class。效果与 Object.class 相同。(注意:回答这里时可能会引出类加载、反射等知识点的提问)
5. equals()
equals 用来比较两个对象的内容是否相等。默认情况下 (继承自 Object 类),equals 和 == 是一样的,除非被覆写 (override) 了。(注意:这里可能引出更常问的'equals 与==的区别'及 HashMap 实现原理的提问)
6. hashCode()
该方法用来返回其所在对象的物理地址(哈希码值),常会和 equals 方法同时重写,确保相等的两个对象拥有相等的 hashCode。(同样,可能引出 HashMap 实现原理的提问)
7. toString()
toString() 方法返回该对象的字符串表示,这个方法没什么可说的。
8. wait()
导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法。(引出线程通信及'wait 和 sleep 的区别'的提问)
9. wait(long timeout)
导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过指定的时间量。(引出线程通信及'wait 和 sleep 的区别'的提问)
10. wait(long timeout, int nanos)
导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者其他某个线程中断当前线程,或者已超过某个实际时间量。(引出线程通信及'wait 和 sleep 的区别'的提问)
11. notify()
唤醒在此对象监视器上等待的单个线程。(引出线程通信的提问)
12. notifyAll()
唤醒在此对象监视器上等待的所有线程。(引出线程通信的提问)
13. finalize()
当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。(非重点,但小心引出垃圾回收的提问),在 JDK 1.9 中已经被注释为方法已过时。
引申常见问题
- equals() 与 == 的区别是什么?
- hashCode() 和 equals() 之间有什么联系?
- wait() 方法与 sleep() 方法的区别
- 为什么重写了 equals 就必须重写 hashCode
- HashMap 的实现原理


