Java Object类的技巧
发布时间:2021-12-10 16:57:11 所属栏目:Linux 来源:互联网
导读:ASP站长网 在Java中,Object类是所有类的超类,所有的类都继承Object类中的方法。 Object类中有12个成员方法,并没有显示声明任何构造方法,而是存在着默认的无
ASP站长网在Java中,Object类是所有类的超类,所有的类都继承Object类中的方法。 Object类中有12个成员方法,并没有显示声明任何构造方法,而是存在着默认的无参的构造函数。 Object类源代码分析: package java.lang; public class Object { //一个本地方法,具体是用C(C++)在DLL中实现的 private static native void registerNatives(); static { registerNatives(); } //返回该Object的运行时类 public final native Class<?> getClass(); /* 对于Object对象来说,返回对象的地址值。但一般在其他类中都会 重写hashCode方法,使其通过计算得到一个int值(hash值)重写 hashcode方法时必须遵循以下几点: 1、在Java应用的同一次执行过程中,同一对象被多次调用,则他们的 hashcode值必然相同。而对于同一个应用的两次不同的调用,它们的 hashcode值可以相同,也有可能不同。 2、对于两个对象来说,如果他们的equals方法比较返回true,那么这 两个对象的hashcode必然相同。这也解释了为什么String类中,如果 两个对象的equals方法相同,则他们的hashcode值一定相同。 3、对于两个对象来说,如果使用equals方法返回为false,则他们的 hashcode的值有可能相等也可能不等,(如果不同会提高性能,因为 在集合中类判断两个对象是否相等,如果其hashcode不等就直接不用 判断equals方法了) 4、对于Object对象来说,不同的Object对象的hashcode是不同的, 它们返回的是对象的地址,equals返回的也是对象的地址。所以在自 己定义的类中如果要添加到集合对象中,最好是要重写hashcode和 equals方法,不然会自动继承自Object类中的两个方法根据对象地址 来判断。在重写自己定义的类时,通常是在类中的根据某个值如 name.hashcode();来进行判断。 */ public native int hashCode(); //Object类中equals方法是比较两个对象的地址是否相同,而一般我们 认为两个对象中只要属性相同,这两个对象就相同。所以一般其他类都 会重写equals方法 public boolean equals(Object obj) { return (this == obj); } //用来另存一个当前存在的对象 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() 方法,或者超 过指定的时间量前,导致当前线程等待 public final native void wait(long timeout) throws InterruptedException; /* 在其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者其他 某个线程中断当前线程,或者已超过某个实际时间量前,导致当前线程 等待 */ 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 >= 500000 || (nanos != 0 && timeout == 0)) { timeout++; } wait(timeout); } /* 在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当 前线程等待。换句话说,此方法的行为就好像它仅执行 wait(0) 调用 一样。 当前线程必须拥有此对象监视器。该线程发布对此监视器的所有权并等 待,直到其他线程通过调用 notify 方法,或 notifyAll 方法通知在此对 象的监视器上等待的线程醒来。然后该线程将等到重新获得对监视器的 所有权后才能继续执行。 */ public final void wait() throws InterruptedException { wait(0); } //当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收 器调用此方法 protected void finalize() throws Throwable { } } (编辑:焦作站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |