在東方神話體系中,人類是如何來的?
是女媧用泥土捏出來的。
在西方神話體系中,人類是如何來的?
是亞當夏娃的後代。
今天要學的Object類在Java裡面,就好比是和亞當夏娃一樣的存在。
只不過神話終歸只是神話,是虛無縹緲的,但是計算機裡面,Object類是真真實實存在的。
Object類是所有類的根類,頂層父類,就可以理解成是所有類的祖先,也就是說所有的類最終都會繼承至它,包括數組的父類,也是Object類。
用代碼證明:
①getClass():得到類名。
②getSuperClass():得到父類名。
③Class是指類,java.lang這是Java裡面的一個包,類名是Object。
所以數組的父類也就是Object.。
如果一個類沒有特別指定父類,那麼默認繼承自Object類。
既然Object類是頂層父類,那麼按照繼承的規則:子類可以調用父類的方法。
Object類中的方法,所有類都可以使用。Object類當中包含的方法有11個。
今天主要學習其中的2個:
一、Object類的toString方法
①創建Person類,沒有指定父類,那它默認繼承Object類。
②在測試類main方法中,創建對應的person對象並初始化。
③調用toString()方法並列印(注意:Person類中並沒有定義toString()方法,它調用的是父類Object的方法)。
④列印結果為一串字符,前面一大串是我自己在開發工具裡面創建的包名,就可以理解成文件夾:
com是一個總文件夾liuxiaoai946是com裡一個文件夾stud02是liuxiaoai946裡的一個文件夾commonApi又是stud02裡的一個文件夾那麼Person@16e8e0a這串字符到底啥意思呢,這就要看下Object類中的toString()方法是啥樣的了。
下圖為Object類的toString()方法:
①getClass().getName():得到類的名字,類名是Person。
②Integer.toHexString(hashCode()):hashCode得到的是一個地址值,將這個地址值轉化成十六進位,也就是說16e8e0a是一串16進位的數字。
好,現在問題來了,對於開發者來說,地址是沒多大的意義的,我們需要的是你能以字符串的形式展現出來而不是給我一串地址。
前面學過String類,知道它列印出來就是一串字符串,而不是一串地址,怎麼做到的?
因為它將方法重寫了。
下圖為String類的toString()方法
String類的父類是Object類,它將父類的toString方法重寫了。
所以,當我們新建一個類的時候,一般都會將toString()方法重寫,因為地址對於開發者來說意義不大,我們需要的是字符串。
利用開發工具快捷鍵,Alt+Insert,會自動幫重寫toString()方法。
二、Object類的equals方法
作用:判斷其他某個對象是否與此對象「相等」。
提到equals方法,不得不提到一個比較運算符「==」。
「==」的作用是啥?
①如果比較的是基本數據類型
「==」比較的是值是否相等。
②如果比較的是引用數據類型
「==」比較的是引用地址是否相同。
那equals方法和「==」之間有什麼區別呢?
下圖為Object類的equals()方法:
Object類中的equals()方法就是運算符「==」,它們是一回事。
類是引用數據類型,所以Object類中的equals()方法,比較的是引用地址是否相同。
那麼問題又來了,String類中的equals方法為何比較的是值是否相等呢?
因為它將equals方法重寫了。
所以,同toString方法一樣,當我們新建一個類的時候,一般都會將equals方法重寫。
利用開發工具快捷鍵,Alt+Insert,會自動幫重寫equals方法。
三、Objects工具類
Objects是Object的工具類,前面也學習過Arrays類是數組的工具類。
工具類有個特點:方法一般都是靜態方法。
方法可以直接用類名調用,不用創建實例對象。
①直接用Objects工具類類名就可以調用方法。
②Objects中的equals方法。
③這種判斷方式更加安全,不會出現空指針異常。
什麼叫空指針異常呢?
就是如果一個對象為空,它調用方法就會出現空指針異常。
如下圖:
object1為空,調用equals方法就會報錯,如果是用Objects類的方法:
Objects.equals(object1,object2)
這樣寫就不會出現空指針異常。
總結: