Object-源码

Object的结构

类构造器

一个类必须要有一个构造器的存在 , Object类源码中,是看不到构造器的,系统会自动添加一个无参构造器。

Object obj = new Object();

equals()

/**
 * 判断两个对象是否相等
 * 主要比较的是内存地址,如果我们要比较两个对象里面的内容是否相等,那么我们就会重写这个方法。
 * 注意:重写equals()方法的时候,也一定要重写hashcode()方法。
 * 因为java规定:两个对象相等,那么它们的hashcode也一定要相等。
 */   
	public boolean equals(Object obj) {
        return (this == obj);
    }

getClass()

/**
 * 这个方法被final修饰,不能被子类重写,返回的是这个对象运行的类
 */
public final native Class<?> getClass();

hashCode()

/**
 * 主要用来判断两个对象是否相等
 * 1:如果两个对象相等,那么它们的hashcode一定相等 
 * 2:hashcode相等的,这两个对象不一定相等 
 * 3:hashcode不相等,那么这两个对象一定相等 
 */
public native int hashCode();

toString()

public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }

getClass().getName()是返回对象的全类名(包含包名),

Integer.toHexString(hashCode()) 是以16进制无符号整数形式返回此哈希码的字符串表示形式。

打印某个对象时,默认是调用 toString 方法。

notify()

/**
 * final修饰,不能被重写,唤醒一个正在等待对象锁的线程,该方法只能用于同步方法。
 */
public final native void notify();

notifyAll()

/**
 * final修饰,不能被重写,唤醒所有正在等待对象锁的线程,该方法只能用于同步方法。
 */
public final native void notifyAll();

wait()

/**
* 在其他线程调用此对象的notify()方法或notifyAll()方法前,导致当前线程等待。
* 当前线程必须拥有此对象监视器。
* 该线程发布对此监视器的所有权并等待,直到其他线程通过调用notify方法或notifyAll方法通知在此对象的监视器上等待的线程醒来,
* 然后该线程将等到重新获得对监视器的所有权后才能继续执行。
*/
public final void wait() throws InterruptedException {
    wait(0);
}

finalize()

/**
 * 用于对象被回收的时候这个由JVM支持,Object的finalize方法默认是什么都没有做,
 * 如果子类需要在对象被回收时执行一些逻辑处理,则可以重写finalize方法。
 */
protected void finalize() throws Throwable {     
}

registerNatives()

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

这是一个本地方法,中我们知道一个类定义了本地方法后,想要调用操作系统的实现,必须还要装载本地库.

看到上面的代码,这就明白了吧。静态代码块就是一个类在初始化过程中必定会执行的内容,所以在类加载的时候是会执行该方法的,通过该方法来注册本地方法。

参考链接

https://www.cnblogs.com/ysocean/p/8419559.html

https://www.zhihu.com/question/21574535

posted @ 2021-08-08 14:27  Ricardo_ML  阅读(42)  评论(1编辑  收藏  举报