public?boolean?equals(Object?obj){
??????if(this==obj)
???????return?ture;
??????if(obj==null)
???????return?false;
??????if(getClass()!=obj.getClass())
???????return?false;
??????Dog?other=(Dog)?obj;
??????if(age!=other.age)
???????return?false;
???????return?ture;??
??}
??這段代碼看不懂,能幫我講下嗎?謝謝。
??著重問題:
??1、進(jìn)行比較的后者是Dog?dog,為什么要用Object?obj呢?
??2、第六行if(getClass()!=obj.getClass())第一個(gè)getClass()前面不用加this嗎?
??3、由getClass()確定為相同類型后,obj轉(zhuǎn)換成Dog類,代碼:Dog?other=(Dog)?obj;還需要用other來代替obj嗎?那么創(chuàng)建Dog?other對象的代碼隱藏在哪里了呢?
??4、第九行if(age!=other.age)前面一個(gè)age不用加this或者dog嗎?
??感謝解答!
2016-01-17
剛看完教程 ?以下內(nèi)容僅代表個(gè)人觀點(diǎn),不保證正確
問題1 ?equals()方法是所有類的共父類Object中的方法,要重載改方法需保持參數(shù)一致,Object中equals原型的參數(shù)就是Obeject,不能特化Dog,因?yàn)檫@里的方法是繼承來的。
問題2 ?感覺和問題4是一個(gè)問題,this指針用于指向該類,之前的課程中有講過,當(dāng)發(fā)生屬性名和構(gòu)造函數(shù)的參數(shù)名重名時(shí),使用“this.屬性名=參數(shù)名”的方法進(jìn)行初始化,這里this可以區(qū)別局部作用域的參數(shù)名。也就是說沒有重名現(xiàn)象,寫this是多余的
問題3 ?這個(gè)貌似和多態(tài)有關(guān),c++里如果接觸過的話會更好理解,基類指針可以指向派生類對象,舉個(gè)例子:假如父親有兩個(gè)兒子,這里父親是基類,兒子是派生類,“父親”這一名詞(不是對象名,是類名)可以代表某個(gè)兒子。
if(getClass()!=obj.getClass())只能證明obj類名和Dog類名相同,有可能涉及到多態(tài)(obj和Dog不是同一類,一個(gè)父親一個(gè)兒子;或者兩個(gè)都是兒子,老大,老二),所以要進(jìn)行強(qiáng)制類型轉(zhuǎn)化。
2016-02-21
這段代碼改為下邊這樣也是沒問題的,這樣容易理解: