「Object类有哪些方法?每个方法分别有什么作用?」 是面试「Java开发工程师」过程中的高频问题,我在参加海康威视和VIVO的秋招面试中均被问到过,在此进行一个系统的总结与梳理。
参考答案
Object类位于java.lang包下,是Java中所有类的始祖,其包含的方法列表如下:
各方法的具体说明如下:
Object(): Object类中并没有显式声明该构造方法,其是由编译器自动为其创建的一个不带参数的默认构造器。
registerNatives(): 用于注册本地方法,即将本地用C/C++实现的方法映射到Java中的本地(native)方法,实现方法命名的解耦。
getClass(): 用于获取此Object的运行时类对象,运行时类是 Java 反射机制的源头。
hashCode(): 用于返回对象的哈希值,哈希值是一个可正可负的整数值。
equals(): 用于判断两个对象的引用是否相等,而实际开发中常需要重写该方法以比较两个对象的具体内容是否相等。
clone(): 用于创建并返回此对象的一个副本,其实质上是一种「浅拷贝」。
toString(): 用于返回该对象的字符串表示,建议所有子类均重写该方法,以返回该对象中各属性值的字符串表示。
notify(): 用于唤醒一个在此对象监视器上等待的线程,由JVM决定唤醒哪个等待线程,与线程的优先级无关。
notifyAll(): 用于唤醒所有在此对象监视器上等待的线程,该方法并不是将对象的锁给所有线程,而是让它们竞争,只有获得锁的线程才能进入就绪状态。
wait(long timeout): 导致当前线程释放所持有对象的锁(线程暂停执行),进入在对象监视器上等待的状态,直到达到最长等待时间(timeout)或其他线程调用notify()或notifyAll()方法。
wait(long timeout, int nanos): 最长等待时间为「1000000 * timeout + nanos」。
wait(): 未指定最长等待时间。
finalize(): 垃圾回收器在准备回收对象前,会先调用该方法;子类可通过重写该方法,以在垃圾回收前整理系统资源或执行其他清理操作。
源码阅读
package java.lang;
public class Object {
/**
* 私有的,在静态代码块中执行,且仅在Object类首次被加载时执行一次。
*/
private static native void registerNatives();
static {
registerNatives();
}
/**
* final方法:不能被子类所重写
*/
public final native Class<?> getClass();
/**
* 在子类中重写该方法时,可直接调用Objects.hash(Object...)来获取对象的哈希值
*/
public native int hashCode();
/**
* 默认实现中,仅比较两个对象是否引用的同一个对象
* 实际开发中,需要重写该方法来比较两个对象的具体内容是否相等
*/
public boolean equals(Object obj) {
return (this == obj);
}
/**
* 仅对本包下的所有类和当前类的子类可见。
* 只有实现Cloneable接口的类的对象才能调用该方法,否则会抛出异常
*/
protected native Object clone() throws CloneNotSupportedException;
/**
* 返回:运行时类名@十六进制哈希值字符串
*/
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
/**
* 唤醒单个线程,但不确定具体唤醒的是哪个线程
*/
public final native void notify();
/**
* 唤醒所有线程,但并不是所有线程都可以拿到对象锁而进入就绪状态
*/
public final native void notifyAll();
/**
* 使当前线程释放对象锁,即线程暂停执行,直到其他线程调用notify()/notifyAll()方法或达到timeout
*/
public final native void wait(long timeout) throws InterruptedException;
/**
* 最大等待时间:1000000*timeout+nanos
*/
public final void wait(long timeout, int nanos) throws InterruptedException {
if (timeout < 0) {
throw new IllegalArgumentException("timeout value is negative");
}
if (nanos < 0 || nanos > 999999) {
throw new IllegalArgumentException(
"nanosecond timeout value out of range");
}
if (nanos > 0) {
timeout++;
}
wait(timeout);
}
/**
* 未设定最大等待时间,即只能被notify()/notifyAll()唤醒
*/
public final void wait() throws InterruptedException {
wait(0);
}
/**
* 子类可通过重写该方法,以在垃圾回收前整理系统资源或执行其他清理操作
* 在该方法中,若将该对象重新与引用链建立关联关系,则会逃离本次垃圾回收
*/
protected void finalize() throws Throwable { }
}
推荐阅读
欢迎关注
Java名企面试吧,每天10点24分,我们不见不散!
丙子先生的宗旨是,每天以短篇幅讲高频面试题,不增加太多负担,但需要持之以恒。
能力有限,欢迎指教!