Object類是Java中所有類的始祖歌焦,在Java中每個類都擴(kuò)展了Object,但不需要顯式繼承extends它。盡管也允許繼承Object類擅羞,但因?yàn)镴ava是單繼承的,且不繼承Object類也可以像使用父類一樣使用它义图,默認(rèn)是繼承Object類减俏,所以顯式繼承Object類沒有意義。
由于Java中每個類都是由Object類擴(kuò)展而來碱工,所以熟悉這個類的相關(guān)方法和服務(wù)很重要娃承。
1奏夫、Object類型的變量
????可以使用Object類型的變量引用任何類型的對象:Object obj = new 自定義類名();
? ? 但Object類型的變量历筝,只能用于作為各種值的一個泛型容器酗昼,不能直接訪問原類型的成員,還需要知道對象的原始類型梳猪,并進(jìn)行強(qiáng)制轉(zhuǎn)換才可以使用麻削。
? ? 自定義類名 變量名 = (自定義類名)obj;
2春弥、getClass() 方法
? ? getClass()方法會返回泛型Class類對象呛哟,代表正在運(yùn)行中的類和接口的實(shí)例,用于支持反射的操作類型惕稻。
3竖共、equals() 方法
? ? Object類中的equals() 方法用于檢測一個對象是否等于另外一個對象。Object類中實(shí)現(xiàn)的equals方法將確定兩個對象引用是否相等俺祠。對象被創(chuàng)建時,如果不賦值給變量借帘,被稱為臨時對象使用完就會被JVM回收(可能不是立即)蜘渣。如果聲明變量并把創(chuàng)建對象賦值給新建變量: A a = new A();
這里 A a 是聲明了一個A類型的名字為a的變量肺然,與值類型賦值不同蔫缸,這里a變量實(shí)際上獲得了新創(chuàng)建的A類型對象的堆內(nèi)存地址,而不是對象本身际起。因此當(dāng)兩個對象的變量在做==判斷時拾碌,實(shí)際上是判斷兩者變量所指向的堆內(nèi)存地址是否相同。
對于很多類來說這就足夠了街望,但實(shí)際開發(fā)中經(jīng)常需要基于屬性和狀態(tài)檢測對象的相等性校翔,比如兩個員工對象的姓名、薪水和入職日期一致灾前,就可以認(rèn)為是相等的防症。因此,我們在一些情況下經(jīng)常需要重寫equals方法哎甲。
4、hashCode() 方法
散列碼hashcode是由對象導(dǎo)出的一個整形值炭玫。散列碼是沒有規(guī)律的奈嘿。如果a和b是兩個不同的對象,a.hashCode()和b.hashCode()基本不會相同(存在相同的可能即hash碰撞)吞加。Object類的默認(rèn)hashCode方法會從對象的存儲地址得出散列碼裙犹。
String類使用以下算法計(jì)算散列碼:
int hash = 0;
for (int i = 0; i < length(); i++)
? ? hash = 31 * hash + charAt(i)尽狠;
幾個java提供的hashcode():
Objects:
所有的封裝類:
Arrays類:
5心赶、toString() 方法
? ? 在Object類中還有一個重要的方法,就是toString()方法缺猛,它會返回代表對象值的一個字符串缨叫。
? ? 只要一個對象與字符串通過操作符"+"連接起來,jvm會自動調(diào)用該對象的toString()方法來獲得這個對象的字符串描述荔燎。
? ? toString()方法是一種非常有用的調(diào)試工具耻姥,可以重寫它便于實(shí)際開發(fā)中調(diào)試。
? ??