說明:
?????????? object是類層次的根類人乓,所有類的父(超)類
一拨扶、registerNatives()
private static native void registerNatives();
? ? static {
? ? ? ? registerNatives();
? ? }
? ?? native表明一個java接口調(diào)用非java接口
? ?? 為了讓JVM找到本地函數(shù)句伶,以某種規(guī)則命名稳懒,將java方法注冊到本地
? ?? 例如:java.lang.Object.registerNatives()對應(關聯(lián))本地函數(shù)C語言的Java_java_lang_Object_registerNatives方法
二儡羔、getClass()
public final native Class getClass();? ?
? ?? 返回該對象運行時的類的對象
? ?? 例如 定義一個類Person 程癌,創(chuàng)建一個Person對象嘴瓤, Person p= new Person()扫外;
? ?? 此時調(diào)用p.getClass() 返回值即為Person類的對象即: Class c=p.getClass();
? ?? 可通過方法獲取該類的名稱等信息:c.getName() ,結果為"Person"
? ?? 此方法常用于反射
三、hashCode()
public native int hashCode();
? ?? 返回當前對象的哈希值 本地方法
? ?? hashCode常規(guī)協(xié)定:
? ?? 在java應用執(zhí)行期間廓脆,對同一對象多次調(diào)用haseCode方法筛谚,必須返回相同的整數(shù)(前提:equals比較時信息沒有被修改)
? ??? 通過equals方法比較,兩個對象相等停忿,返回的值必須相同整數(shù)
? ??? 通過equals方法比較驾讲,兩個對象不同,不一定生成不同的整數(shù)席赂,但是不同對象生成不同的整數(shù)可以提高哈希表的性能
四吮铭、equals(Object obj)
public boolean equals(Object obj) {
? ? ? ? return (this == obj);
? ? }
? ?? 返回布爾值,表示其他對象是否與本對象相等
? ?? 參數(shù):Object類型
? ?? 返回值:
? ?? 特點:
? ??? ? 自反性:對于任何非空引用值X颅停,自己和自己比較即:X.equals(x)谓晌,結果都為true
? ??? ? 對稱性:對于任何非空引用值X和Y,當X.equals(Y)結果為true時癞揉,Y.equals(X)的結果一定為true
? ??? ? 傳遞性:對于任何非空引用值X纸肉、Y和Z溺欧,當X.equals(Y)結果為true,Y.equals(Z)的結果為true時毁靶,X.equals(Z)的值一定為true
? ??? ? 一致性:對于任何非空引用值X和Y胧奔,多次調(diào)用X.equals(Y)始終返回相同的值true或者false (前提equals對比的信息沒有修改)
? ??? ? 對于任何非空引用值X,X.equals(null) 的結果都為false
? ?? 注意:
? ??? ? Object中對于任何非空引用值X和Y预吆,當且僅當X和Y指向同一對象時龙填,返回值為true
? ??? ? 重寫equals方法時建議要重寫hashCode()方法以便維護haseCode的常規(guī)協(xié)定
五、clone()
protected native Object clone() throws CloneNotSupportedException;
? ?? 此方法為淺拷貝拐叉,本地方法
? ?? 返回值:返回當前對象的“副本”
? ?? 作用:需要獲取到一個對象的拷貝用戶某些處理岩遗,可以用此方法復制
? ?? 注意:
? ?? 淺拷貝:當對象中含有可變的引用類型屬性時,復制得到的新對象對自己引用類型屬性進行修改時凤瘦,原始對象的引用類型屬性也會跟著改變
? ??? ? ? ? 原因:復制時宿礁,對象的屬性是基本類型是,對該字段進行復制蔬芥,對象的屬性是引用類型時梆靖,復制該字段的引用而不復制該引用指向的對象
? ??? ? ? 深拷貝:當對象中含有可變的引用類型屬性時,復制得到的新對象對自己引用類型屬性進行修改時笔诵,原始對象的引用類型屬性不會跟著改變
? ??? ? ? ? ? ? 適用于引用類型變量比較少的情況
? ??? ? ? ? ? ? 需要自己改寫返吻,缺點:一個類當中有很多引用類型時,實現(xiàn)的代碼比較復雜
? ??? ? ? 當引用類型變量較多時乎婿,建議使用序列化和反序列化實現(xiàn)
? ??? ? ? 使用clone()方法時测僵,如果此對象的類不能實現(xiàn)Cloneable接口,會拋出CloneNotSupportedException
? ??? ? ? 由于Object類本身不實現(xiàn)Cloneable接口谢翎,所以對于Object對象調(diào)用clone方法會拋出異常
六捍靠、toString()
public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); }
?????? 返回值:對象的類名+@+對象的哈希碼無符號十六進制表示,即對象的字符串表示形式
?????? 解讀:getClass().getName()
?????? ? ? ???? 調(diào)用本類方法可以不使用對象調(diào)用省略this. * 此處獲取該對象所屬的類名
?????? 解讀:Integer.toHexString(hashCode())
??????????????? 表示此對象的哈希碼無符號十六進制表示
????? 舉例說明森逮,傳入的int=123456 * 1.toHexString(int i)
???? 1. public static String toHexString(int i) { return toUnsignedString0(i, 4); }
??????????????? 參數(shù):要轉(zhuǎn)換成字符串的整數(shù)榨婆,此處傳入的是對象的哈希碼
???? 2.toUnsignedString0(i, 4); //此時toUnsignedString0(123456,4)
???????? private static String toUnsignedString0(int val, int shift) {
??????????????????? // assert shift > 0 && shift <=5 : "Illegal shift value";
??????????????????? int mag = Integer.SIZE - Integer.numberOfLeadingZeros(val); //mag=32-Integer.numberOfLeadingZeros(123456)=32-15=17
??????????????????? int chars = Math.max(((mag + (shift - 1)) / shift), 1); //chars=Math.max(((17+(4-1))/4),1)=Math.max(5,1)=5
??????????????????? char[] buf = new char[chars]; //char[] buf =new char[chars]=new char[5]
?????????????????? formatUnsignedInt(val, shift, buf, 0, chars); //formatUnsingedInt(123456褒侧,4纲辽,buf,0,5)
????????????????? // Use special constructor which takes over "buf".
???????????????? return new String(buf, true); }
??????????? 私有方法:
????????????????? 參數(shù):
??????????????????????? val 表示傳入的整數(shù) 此處傳入的是對象的哈希碼;
??????????????????????? shift 表示進制4代表16進制
?????????????????????? Integer.SIZE 為32
???????? 3.Integer.numberOfLeadingZeros(int i) //即Integer.numberOfLeadingZeros(123456),執(zhí)行結果返回n=15
???????????? public static int numberOfLeadingZeros(int i) {
????????????????????? // HD, Figure 5-6
???????????????????? if (i == 0) return 32;
???????????????????? int n = 1;
???????????????????? if (i >>> 16 == 0) { n += 16; i <<= 16; }
???????????????????? if (i >>> 24 == 0) { n += 8; i <<= 8; }
???????????????????? if (i >>> 28 == 0) { n += 4; i <<= 4; }
???????????????????? if (i >>> 30 == 0) { n += 2; i <<= 2; }
???????????????????? n -= i >>> 31;
???????????????????? return n; }
???????? 參數(shù)璃搜,i 表示傳入整數(shù)拖吼,此處傳入的是對象的哈希碼 如果i的值為0,返回32 如果i不為零这吻,返回i的二進制補碼表示心事重最高位1位之前的零位數(shù)量
4.max(int a, int b)
???????? public static int max(int a, int b) { return (a >= b) ? a : b; } 參數(shù):整數(shù)a和整數(shù)比 返回值:比較a和b吊档,若a>=b,返回a;若a>>= shift;
?5.formatUnsignedInt(val, shift, buf, 0, chars);? //formatUnsingedInt(123456唾糯,4怠硼,buf,0,5)
?? ???? static int formatUnsignedInt(int val, int shift, char[] buf, int offset, int len) {
?????? ??? ??? ??? ?int charPos = len;
?????? ??? ??? ??? ?int radix = 1 << shift; //表示2^shift 若shift=4 鬼贱,則表示2^4
?????? ??? ??? ??? ?int mask = radix - 1;
?????? ??? ??? ??? ?do {
?????????? ??? ??? ??? ?buf[offset + --charPos] = Integer.digits[val & mask];//val & mask =val%(mask+1)
?????????? ??? ??? ??? ?val >>>= shift;
?????? ??? ??? ??? ?} while (val != 0 && charPos > 0);
?????? ??? ??? ??? ?return charPos;
?? ??? ??? ??? ??? ?}
?? ??? ??? ??? ?其中Integer.digits[index] ,是一個集合,可通過index進行取數(shù)
?? ??? ??? ??? ? final static char[] digits = {
?? ??? ???????? '0' , '1' , '2' , '3' , '4' , '5' ,
?? ??? ???????? '6' , '7' , '8' , '9' , 'a' , 'b' ,
?? ??? ???????? 'c' , 'd' , 'e' , 'f' , 'g' , 'h' ,
?? ??? ???????? 'i' , 'j' , 'k' , 'l' , 'm' , 'n' ,
?? ??? ???????? 'o' , 'p' , 'q' , 'r' , 's' , 't' ,
?? ??? ???????? 'u' , 'v' , 'w' , 'x' , 'y' , 'z'
?? ??? ???? };
?? ??? ??? ??? ?formatUnsingedInt(123456香璃,4这难,buf,0,5)
?? ??? ??? ??? ?第一次執(zhí)行結果:charPos=5;radix=16葡秒;mask=15姻乓;buf[4]=Integer.digits[123456%(15+1)]=Integer.digits[0]=0;val==7716;charPos=4
?? ??? ??? ??? ?第二次執(zhí)行結果:buf[3]=Integer.digits[7716%(15+1)]=Integer.digits[4]=4;val=482;charPos=3
?? ??? ??? ??? ?第三次執(zhí)行結果:buf[2]=Integer.digits[482%16]=Integer.digits[2]=2;val=30;charPos=2
?? ??? ??? ??? ?第四次執(zhí)行結果:buf[1]=Integer.digits[30%16]=Integer.digits[14]=e;val=1;charPos=1
?? ??? ??? ??? ?第五次執(zhí)行結果:buf[0]=Integer.digits[1%16]=Integer.gigits[1]=1;val=0眯牧;charPos=0
?? ??? ??? ??? ?val=0停止運行buf={1蹋岩,e,2,4,0}
??? 6.對于標題2中return new String(buf,true)的返回值為1e240
?? ? 7.對于整個方法返回值為String@1e240