java源码阅读之java.lang.Object
Object是所有类的父类,任何类都默认继承Object。Object类到底实现了哪些方法? 1.clone方法 保护方法,实现对象的浅复制,只有实现了Cloneable接口才可以调用该方法,否则抛出CloneNotSupportedException异常。 2.getClass方法 final方法,获得运行时类型。 3.toString方法 该方法用得比较多,一般子类都有覆盖。 4.finalize方法 该方法用于释放资源。因为无法确定该方法什么时候被调用,很少使用。 5.equals方法 该方法是非常重要的一个方法。一般equals和==是不一样的,但是在Object中两者是一样的。子类一般都要重写这个方法。 6.hashCode方法 该方法用于哈希查找,重写了equals方法一般都要重写hashCode方法。这个方法在一些具有哈希功能的Collection中用到。 一般必须满足obj1.equals(obj2)==true。可以推出obj1.hash-Code()==obj2.hashCode(),但是hashCode相等不一定就满足equals。不过为了提高效率,应该尽量使上面两个条件接近等价。 7.wait方法 wait方法就是使当前线程等待该对象的锁,当前线程必须是该对象的拥有者,也就是具有该对象的锁。wait()方法一直等待,直到获得锁或者被中断。wait(longtimeout)设定一个超时间隔,如果在规定时间内没有获得锁就返回。 调用该方法后当前线程进入睡眠状态,直到以下事件发生。 (1)其他线程调用了该对象的notify方法。 (2)其他线程调用了该对象的notifyAll方法。 (3)其他线程调用了interrupt中断该线程。 (4)时间间隔到了。 此时该线程就可以被调度了,如果是被中断的话就抛出一个InterruptedException异常。 8.notify方法 该方法唤醒在该对象上等待的某个线程。 9.notifyAll方法 该方法唤醒在该对象上等待的所有线程。 ―Object― ClassObjectistherootoftheclasshierarchy.EveryclasshasObjectasasuperclass.Allobjects,includingarrays,implementthemethodsofthisclass.――FromOracle ―释义― Object类是java中所有对象所继承的父类,即便是数组也继承了该父类(可以理解为原始类,所有类的祖先,你也许会想问:詹姆斯第一个写的类是不是Object?)。 所有类对Object类的继承都是隐式继承,所以无法看到。 ―Object― 默认构造方法 ―clone― ―equals― Indicateswhethersomeotherobjectis"equalto"thisone. Theequalsmethodimplementsanequivalencerelationonnon-nullobjectreferences:―FromORacle― 原始类Object的equals比较的是两个变量的非空对象的引用。 源码: public boolean equals(Object obj) { return (this == obj); } 通过源码我们看到,原始类equals其实与“==”是等价的。 ―finalize― ―getClass― ―hashcode― IntheJavaprogramminglanguage,everyclassimplicitlyorexplicitlyprovidesahashCode()method,whichdigeststhedatastoredinaninstanceoftheclassintoasinglehashvalue(a32-bitsignedinteger).ThishashisusedbyothercodewhenstoringormanipulatingtheinstanceCthevaluesareintendedtobeevenlydistributedforvariedinputsforuseinclustering.Thispropertyisimportanttotheperformanceofhashtablesandotherdatastructuresthatstoreobjectsingroups("buckets")basedontheircomputedhashvalues.Technically,inJava,hashCode()bydefaultisanativemethod,meaning,ithasthemodifier'native',asitisimplementeddirectlyinthenativecodeintheJVM. Source:Wikipedia java中每个类都隐式或者显式的实现了Object的hashcode方法。 跟谷歌和官方个人总结,作者为什么要在原始类中存在hashcode呢? ①、类对象的存储优化,便于查找类对象。 ②、配合equals使用。 注意:很多博客表示hashcode方法返回的是该类的物理存储地址或者是逻辑存储地址,这个说法是错误的,按照官方的说法:返回的32位值只是与类对象的存储位置有关。 ―notify― ―notifyall― ―toString― ThetoStringmethodforclassObjectreturnsastringconsistingofthenameoftheclassofwhichtheobjectisaninstance,theat-signcharacter`@',andtheunsignedhexadecimalrepresentationofthehashcodeoftheobject.Inotherwords,thismethodreturnsastringequaltothevalueof: getClass().getName()+'@'+Integer.toHexString(hashCode()) 源码: public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); } 返回一个格式为类名+@+该类的hash值。 ―wait― finalize() 总结 以上就是本文关于java源码阅读之java.lang.Object的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |