学了好久Java,却还没仔细研读过Object类,实为遗憾,今日读下,在此记之。
java.lang.Object 即Object类位于java.lang包。
public class Object
Object类是一切类的根(始祖),即Object类是每个类的超类(父类),所有的类,包括数组都实现了该类中的方法。此类自JDK1.0就有了。
构造对象,只提供了一个空参构造对象(没有重载),去看源码,发现源码中没有给出。这似乎符合Java的规则,Java中构造函数不可以被继承(只是隐式或显式调用),而当某个类没有自定义构造函数时,java会默认添加一个空参构造函数,这应该就是隐式地调用了父类的构造函数。
protected Object clone() 创建并返回此对象的一个副本。
protected native Object clone() throws CloneNotSupportedException;
boolean equals(object obj) 判断其他对象是否等于当前对象,一般子类都会重写此方法来实现自己的功能。
public boolean equals(Object obj) {
return (this == obj);
}
有一些面试题会问到equals()方法与==有什么不同。
protected void finalize() 被GC(垃圾收集器)调用,当GC发现该对象没有引用时。这个地方,有两个很有趣的地方,一是告诉了我们GC的工作原理,当一个对象不再有引用时,GC就将其回收,二是体现了面向对象的思想,只有对象本身知道自己的情况,外部想要实现功能,就要通过对象来调用。
protected void finalize() throws Throwable { }
Class<?> getClass(),返回此对象的运行时类。这个方法跟泛型有点关系(<?>),而且返回值类型就是Class。详细Class类介绍请看深入理解Class类。
public final native Class<?> getClass();
int hashCode() 返回当前对象的哈希值。equals方法比较就是比较的哈希值,更多hashCode请参考wikipedia之java hashCode。
public native int hashCode();
void notify() 唤醒一个等待当前对象监视器的线程。当某个线程以此对象为锁时,调用notify方法,可将其唤醒,给予其竞争执行权的资格。
public final native void notify();
void notifyAll() 唤醒所有
等待当前对象监视器的线程,字面意思理解即可。
public final native void notifyAll();
String toString() 返回该对象的字符串表达式。当我们打印一个对象时,打印的内容即时调用此方法后得到的字符串表达式。
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
它就是返回“类名@hashCode(十六进制)”。
void wait()
void wait(long timeout)
void wait(long timeout, int nanos)
重载了三个不同参数列表的wait()方法,用来使当前线程停下来,直到notify()或者notifyAll()信号发出。
去参照源码,发现还是有些地方API document里面没提到的。
private static native void registerNatives();
static {
registerNatives();
}
首先声明了一个私有的,静态的,本地的方法,然后调用静态代码块执行,注意本地方法是与平台有关的,与其他编程语言有关的。静态代码块的执行顺序优于构造函数,原因是静态代码块随类加载而执行,构造函数只有实例化对象的时候才开始执行。
还有一个很有趣的地方是,Object类是非abstract类,而Object类是所有类的超类,说明abstract类也继承了Object类,进而说明abstract类可以继承具体类。
希望能做个有心人,从不同角度看问题,发现问题的多维面。