java.lang.Object类 步骤(转)
java.lang.Object类 方法(转)
Object类的方法
构造方法:public Object()
在Object的源代码中并没有Object的构造方法,而是采用了java内置的默认构造方法。即在编译时由编译器完成这项工作。
值得注意的是在Object源码的开始,有这样一段:
private static native void registerNatives();
static {
registerNatives();
}
使用JNI特性(有其他语言实现这个功能)来做的这样一个方法,这个方法由Java虚拟机在创造对象时调用,其功能是初始化一个对象:分配内存空间,定义变量,产生this指针等等。
紧接着下面的静态代码块(当该类被实例化、继承、构造方法调用时都优先执行该代码块):也就是说,java中所有代码执行前都要执行这一个JNI实现的方法。
public final native Class<?> getClass();
native方法,返回当前对象的运行时类。(运行时类是指在程序运行时所确定的类型)
public native int hashCode();
native方法,返回对象的hash码值,支持此方法是为了提供hash表的性能。
这里需要特别注意:
在object类中,一般情况下不同的实例对象调用hashCode方法返回不用的哈希码值,但当对象数量太多时就会出现重复。所以不建议使用比较哈希码值的方法来判断实例对象是否同一。
public boolean equals(Object obj)
源码如下:
public boolean equals(Object obj) {
return (this == obj);
}
可以发现,此处使用了关系运算符"=="所判断的是实例对象而不是实例对象的取值.这里我们不难推测关系运算符判断引用数据类型都是从实例对象出发的。
其实就是,Object中的equals方法等价于”==”操作。当继承类复写了equals方法时才会有equal()与”==”不等的说法。
equals()方法需要具有如下特点:
u 自反性(reflexive):任何非空引用x,x.equals(x)返回为true。
u 对称性(symmetric):任何非空引用x和y,x.equals(y)返回true当且仅当y.equals(x)返回true。
u 传递性(transitive):任何非空引用x和y,如果x.equals(y)返回true,并且y.equals(z)返回true,那么x.equals(z)返回true。
u 一致性(consistent):两个非空引用x和y,x.equals(y)的多次调用应该保持一致的结果,(前提条件是在多次比较之间没有修改x和y用于比较的相关信息)。
u 约定:对于任何非空引用x,x.equals(null)应该返回为false。
并且覆写equals()方法时,应该同时覆写hashCode()方法,反之亦然。
protected native Object clone() throws CloneNotSupportedException
native方法,创建并且返回该对象的一个副本。要调用这个方法必须实现cloneable接口。该方法的注释有这样一个描述:
x.clone() != x
x.clone().getClass() == x.getClass()
x.clone().equals(x)
都为真
notify()方法
方法申明如下:
public final native void notify ();
唤醒在此对象监视器上等待的单个线程。如果所有线程都在此对象上等待,则会选择唤醒其中一个线程。选择是任意性的,并在对实现做出决定时发生。线程通过调用其中一个 wait 方法,在对象的监视器上等待。
notifyAll()方法
方法申明:
public final native void notifyAll();
唤醒在此对象监视器上等待的所有线程。线程通过调用其中一个wait 方法,在对象的监视器上等待。
wait(long timeout)方法
源码:
public final native void wait(long timeout) throws InterruptedException;
在其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过指定的时间量前,导致当前线程等待。
也就是说wait方法要在其他线程调用对象的 notify方法或notifyAll方法或超过指定的时间量前调用才有意义。
9. String toString()方法
源码如下:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
返回该对象的字符串表示。通常,toString 方法会返回一个“以文本方式表示”此对象的字符串。结果应是一个简明但易于读懂的信息表达式。建议所有子类都重写此方法。
10. protected void finalize() throws Throwable
源码:
注释说的是:当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。子类重写 finalize 方法,以配置系统资源或执行其他清除。
也就是说:
子类如果想在释放该对象的同时释放掉其他对象的话就重写该方法,但要注意如释放的对象仍然有引用的话容易出现错误,抛出异常
Object类的方法
构造方法:public Object()
在Object的源代码中并没有Object的构造方法,而是采用了java内置的默认构造方法。即在编译时由编译器完成这项工作。
值得注意的是在Object源码的开始,有这样一段:
private static native void registerNatives();
static {
registerNatives();
}
使用JNI特性(有其他语言实现这个功能)来做的这样一个方法,这个方法由Java虚拟机在创造对象时调用,其功能是初始化一个对象:分配内存空间,定义变量,产生this指针等等。
紧接着下面的静态代码块(当该类被实例化、继承、构造方法调用时都优先执行该代码块):也就是说,java中所有代码执行前都要执行这一个JNI实现的方法。
public final native Class<?> getClass();
native方法,返回当前对象的运行时类。(运行时类是指在程序运行时所确定的类型)
public native int hashCode();
native方法,返回对象的hash码值,支持此方法是为了提供hash表的性能。
这里需要特别注意:
在object类中,一般情况下不同的实例对象调用hashCode方法返回不用的哈希码值,但当对象数量太多时就会出现重复。所以不建议使用比较哈希码值的方法来判断实例对象是否同一。
public boolean equals(Object obj)
源码如下:
public boolean equals(Object obj) {
return (this == obj);
}
可以发现,此处使用了关系运算符"=="所判断的是实例对象而不是实例对象的取值.这里我们不难推测关系运算符判断引用数据类型都是从实例对象出发的。
其实就是,Object中的equals方法等价于”==”操作。当继承类复写了equals方法时才会有equal()与”==”不等的说法。
equals()方法需要具有如下特点:
u 自反性(reflexive):任何非空引用x,x.equals(x)返回为true。
u 对称性(symmetric):任何非空引用x和y,x.equals(y)返回true当且仅当y.equals(x)返回true。
u 传递性(transitive):任何非空引用x和y,如果x.equals(y)返回true,并且y.equals(z)返回true,那么x.equals(z)返回true。
u 一致性(consistent):两个非空引用x和y,x.equals(y)的多次调用应该保持一致的结果,(前提条件是在多次比较之间没有修改x和y用于比较的相关信息)。
u 约定:对于任何非空引用x,x.equals(null)应该返回为false。
并且覆写equals()方法时,应该同时覆写hashCode()方法,反之亦然。
protected native Object clone() throws CloneNotSupportedException
native方法,创建并且返回该对象的一个副本。要调用这个方法必须实现cloneable接口。该方法的注释有这样一个描述:
x.clone() != x
x.clone().getClass() == x.getClass()
x.clone().equals(x)
都为真
notify()方法
方法申明如下:
public final native void notify ();
唤醒在此对象监视器上等待的单个线程。如果所有线程都在此对象上等待,则会选择唤醒其中一个线程。选择是任意性的,并在对实现做出决定时发生。线程通过调用其中一个 wait 方法,在对象的监视器上等待。
notifyAll()方法
方法申明:
public final native void notifyAll();
唤醒在此对象监视器上等待的所有线程。线程通过调用其中一个wait 方法,在对象的监视器上等待。
wait(long timeout)方法
源码:
public final native void wait(long timeout) throws InterruptedException;
在其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过指定的时间量前,导致当前线程等待。
也就是说wait方法要在其他线程调用对象的 notify方法或notifyAll方法或超过指定的时间量前调用才有意义。
9. String toString()方法
源码如下:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
返回该对象的字符串表示。通常,toString 方法会返回一个“以文本方式表示”此对象的字符串。结果应是一个简明但易于读懂的信息表达式。建议所有子类都重写此方法。
10. protected void finalize() throws Throwable
源码:
注释说的是:当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。子类重写 finalize 方法,以配置系统资源或执行其他清除。
也就是说:
子类如果想在释放该对象的同时释放掉其他对象的话就重写该方法,但要注意如释放的对象仍然有引用的话容易出现错误,抛出异常