一、java.lang.Object简介
Object 类位于java.lang包中,该包中的类是java最核心、最基础的类,使用时无须手动导入,在编译的时候回自动导入。
Object 是所有类的超类,所有对象(包括数组)都实现了Object的方法。该类的结构图如下图所示:
二、成员方法介绍
1、registerNatives()
private static native void registerNatives(); static { registerNatives(); }
该类使用 static 修饰,是静态方法,同时在静态代码块中调用。同时使用了 native 修饰,表明它是一个本地方法,本地方法与java方法不同的是,本地方法不是由java语言编写,而是由C或C++语言编写,保存于动态链接库中,是各个平台专有的实现方法。java通过虚拟机实现了跨平台,虚拟机加载了包含本地方法的动态链接库,从而能够在java中调用本地方法,java内存结构中有一个本地方法栈专门用于保存本地方法。本地方法是连接java程序和底层主机操作系统的连接方法。
不光在 Object 类中有 registerNatives() 方法,在System、ClassLoader、Thread、Class 等类中也存在 registerNatives() 方法,它的作用是将本地方法直接链接到调用方,java程序调用本地方法时就可以直接使用,不用虚拟机再定位并链接。
2、getClass()
public final native Class<?> getClass();
该方法使用了 final 修饰,表示该方法不能被子类重写。同样它是一个本地方法,返回了该对象的运行时类。
3、hashCode()
public native int hashCode();
该方法是一个本地方法,返回了对象的int型哈希码值(根据对象的内部地址转换得出),这个方法是为了支持哈希表,例如HashMap中的使用。
该方法的原则是:
1.在同一应用程序中同一对象多次调用该方法(不论怎么修改对象的属性),必须返回的相同的整形哈希码值,不同应用程序中没有要求;
2.如果根据equals方法判断对象是否相等,则两个对象调用hashCode() 必须返回相同的整形结果;
3.不要求两个对象通过equals判断不相等,则两个对象hashCode应返回不同值。
4、equals()
public boolean equals(Object obj) { return (this == obj); }
该方法用于比较两个对象是否相等,使用的是“==”,比较的是对象的引用地址。该方法被重写时,hashCode() 也应该被重写。
equals在非空对象使用上存在的等价关系:
1.自反性:对于任何非空对象x、y,,x.equals(x) 应当返回 true;
2.对称性:对于任何非空对象x、y,若 x.equals(y) 为 true,则 y.equals(x) 也为 true;
3.传递性:对于任何非空对象x、y、z,若x.equals(y) 为 true,y.equals(z) 为 true,则x.equals(z) 为 true;
4.一致性:对于任何非空对象x、y,多次调用x.equals(y)的结果始终是一样的;
5.对于任何非空对象x,x.equals(nulll) 为 false。
5、clone()
protected native Object clone() throws CloneNotSupportedException;
该方法是本地方法,用于返回当前对象的副本。
即 y = x.clone(),结果 x != y,但是 x.getClass() = y.getClass()。通常希望是 x.equals() = y.equals(),因此需要重写 equals 方法。
该方法实现的是“浅拷贝”而不是“深拷贝”。对于组合对象来说,其内部对象如(String类型就没有实现Cloneable接口)的拷贝是引用地址的拷贝而不是值得拷贝。
Object 类本身没有实现Cloneable接口,使用该方法需要实现Cloneable接口,否则调用时会报CloneNotSupportedExceptiony异常。
6、toString()
public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); }
该方法返回的是 当前对象所属类的名称 + “@” + 哈希码的十六进制形式 的字符串。
7、toString()
public final native void notify();
8、notify()
public final native void notify();
随机唤醒一个在该对象上等待的线程。
9、notifyAll()
public final native void notifyAll();
唤醒所有在该对象上等待的线程。
10、wait()
public final native void wait(long timeout) throws InterruptedException; public final void wait() throws InterruptedException { wait(0); }
导致当前线程在该对象上等待,知道另一个线程调用该对象的notify()方法或者notifyAll()方法,或者当前时间已过。
11、finalize()
protected void finalize() throws Throwable { }
当垃圾回收器将要回收对象所占内存时被调用。
它的调用具有不确定性,只保证方法会调用,但不保证方法里的任务会被执行完。
原文:https://www.cnblogs.com/guaniu2750/p/13585923.html