java溫習*(6):關於Object的常見問題

1、==到底比較的是值還是地址呢?

==比較的是變量裏存儲的值,不過,對於基本數據類型而言(例如:int、float、double等),變量裏存儲的是數值,因此,==比較的是數值是否相等;而對於引用數據類型(例如String、自定義類等),變量裏存的是對象的內存地址,因此,==默認比較的是是否指向同一內存空間,也就是地址是否相同。

2、下面代碼中:
A) 如果是比較one和two的,那麼,哪一個是當前對象哪一個是傳入對象?
B) 爲什麼obj需要強制轉化?
C) if語句中,爲什麼第一個表達式用到 equals 而第二個用到 == 呢?
D) if語句中,可以兩個都用equals 或者兩個都用 == 進行比較嗎?

圖片描述

A) 如果是one.equals(two)那麼,this就代表one,two就是傳入的參數obj,也就是轉換後的temp。

B) 因爲傳入的obj是Object類型的對象,不能直接獲取Animal類型的成員屬性,因此需要先強轉爲Animal。

C) if語句中,實現的是分別針對name和month的值進行比較。因爲name屬性是String類型,因此推薦用equals比較兩個字符串的值是否相等;month屬性是int類型,更推薦用==比較兩個整數值是否相等。

D) 對於基本數據類型而言,沒有equals方法,因此不能兩處都用equals;

如果測試類中,構造Animal時傳入的都是常量“花花”,如下圖(a)所示,則兩處都可以用==進行比較,因爲此時通過getName( )獲取到的是同一個的字符串常量,內存地址必然相同。

圖片描述

圖(a)
如果測試類中,構造Animal時傳入參數如下圖(b)所示,則兩處不能都用==,因爲此時通過getName( )獲取到的是一個是字符串常量,一個是通過new構造的字符串,他們的內存地址必然不同。

圖片描述

圖(b)

3、下圖代碼中:
A) 如果僅保留第二個equals方法,把第一個equals方法刪除,這樣的情形下,這個所寫的equals方法還是重寫了Object的equals方法麼?
B) 如果僅保留第二個方法,當調用Animal的equals方法的時候,是會先調用該類自己寫的equals方法還是Object的呢?

圖片描述

如果只保留第二個equals方法

A)只能算作子類對父類派生下來的equals方法進行了重載,因爲重寫的要求是:方法名和參數列表要求完全相同。一旦參數類型發生改變,則就不能算作方法重寫,只能算作重載。

B)調用時,會依據傳入參數類型進行自動判斷,如果傳入的時Animal類型,則會調用以Animal做參數的equal方法,這個判斷是會自動執行的。

4、toString方法重寫我搞不懂有什麼用,可以隨便寫個方法也一樣能有那樣的效果啊,爲什麼要重寫toString方法?

自定義一個新方法的確也可以實現同樣的功能,只是,toString方法有幾點先天優勢:他是在Object中定義;默認所有子類可以直接使用;當只輸出對象名時,會默認調用,無論方法是否在子類中重寫。

5、子類中方法可以不經過重寫,就可以重載父類的方法嗎?

可以,子類中默認繼承父類非私有普通成員方法,如果無需重寫,可以直接重載。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章