零基礎(chǔ)入門學(xué)習(xí)java第十五節(jié):對(duì)象的比較

最近一直有事誉简,博客也停筆了一段時(shí)間,十分抱歉回梧。

這一篇主要講講對(duì)象的比較废岂,什么是對(duì)象的比較,我們知道兩個(gè)數(shù)值類型只需要用“==”符號(hào)即可進(jìn)行相等判斷狱意,但如果是兩個(gè)Goods對(duì)象呢湖苞?如何進(jìn)行比較?這時(shí)候详囤,我們的equals方法就派上用場(chǎng)了财骨。equals方法是類的祖先Object類的另一個(gè)protected方法,既然是protected方法(能被同一個(gè)包里的所有類所訪問, 能被該類的子類所訪問藏姐,子類可以和父類不在一個(gè)包中)隆箩,子類是可以直接訪問的,但如果沒有覆蓋該方法羔杨,那么使用的只是Object的原始比較方法捌臊,return(this==obj) ,僅僅比較兩個(gè)對(duì)象的地址是否一致兜材。

對(duì)于String類型理澎,已經(jīng)設(shè)計(jì)好了equals方法,所以我們只需要拿來用就可以了曙寡,如果是我們自定義的類糠爬,那就得重寫該方法來進(jìn)行覆蓋,下面還是用Goods類來舉一個(gè)小栗子:

public class Goods {

private String title;

private double price;

public String getTitle() {

return title;

}

public void setTitle(String title) {

this.title = title;

}

public double getPrice() {

return price;

}

public void setPrice(double price) {

this.price = price;

}

//構(gòu)造器

public Goods(String title, double price) {

this.title = title;

this.price = price;

}

}

這是簡(jiǎn)化版的Goods類举庶,有兩個(gè)私有成員變量以及它們的設(shè)置器秩铆,訪問器,還有一個(gè)構(gòu)造器灯变,下面我們來重寫父類的equals方法殴玛,判斷兩個(gè)Goods是否相等,邏輯上添祸,我們只需要兩者標(biāo)題和價(jià)格一致即可認(rèn)為兩個(gè)商品是相等的(當(dāng)然可以根據(jù)實(shí)際情況進(jìn)行調(diào)整)滚粟,下面我們來設(shè)計(jì)一下equals方法:

/**

* @author Frank

* @create 2017/11/20

* @description 被測(cè)試類,測(cè)試equals方法

*/

public class Goods {

private String title;

private double price;

public String getTitle() {

return title;

}

public void setTitle(String title) {

this.title = title;

}

public double getPrice() {

return price;

}

public void setPrice(double price) {

this.price = price;

}

//構(gòu)造器

public Goods(String title, double price) {

this.title = title;

this.price = price;

}

//覆蓋equals方法

@Override

public boolean equals(Object obj) {

Goods tmp = (Goods) obj;

if (price == tmp.getPrice() && title.equals(tmp.getTitle())){

return true;

}else {

return false;

}

}

}

這里我們覆蓋了父類的equals方法刃泌,在equals方法中將obj強(qiáng)制類型轉(zhuǎn)換為Goods類凡壤,再比較兩者價(jià)格和標(biāo)題是否相等署尤,只要都相等,則返回true亚侠,否則返回false曹体,這也符合我們的需求,下面測(cè)試一下:

/**

* @author Frank

* @create 2017/11/20

* @description 測(cè)試類硝烂,用于測(cè)試equals方法

*/

public class Test {

public static void main(String[] args) {

Goods a = new Goods("Java",100);

Goods b = new Goods("C++",100);

Goods c = new Goods("Java",100);

System.out.println(a.equals(b));

System.out.println(a.equals(c));

}

}

輸出結(jié)果為:false ture

這樣我們就簡(jiǎn)單的實(shí)現(xiàn)了equals方法箕别,但是,這個(gè)equals方法并不完美滞谢,首先串稀,由于我們傳入的是Object對(duì)象,所以并不知道它原本的類型是否為Goods類型狮杨,如果不是Goods類型母截,當(dāng)然不能拿來比較,于是我們得先進(jìn)行一下類型判斷:

@Override

public boolean equals(Object obj) {//類型判斷

if (obj.getClass() != this.getClass()){

return false;

}else {

Goods tmp = (Goods) obj;

if (price == tmp.getPrice() && title.equals(tmp.getTitle())){

return true;

}else {

return false;

}

}

}

仍舊不完美橄教,如果比較的對(duì)象就是自身或者兩者指向同一個(gè)對(duì)象的話清寇,直接返回true即可:

@Override

public boolean equals(Object obj) {

//先檢測(cè)是否為自比較

if ( this == obj || obj == null){

return true;

}

//類型判斷

if (obj.getClass() != this.getClass()){

return false;

}else {

Goods tmp = (Goods) obj;

if (price == tmp.getPrice() && title.equals(tmp.getTitle())){

return true;

}else {

return false;

}

}

}

現(xiàn)在就好很多了,那么此時(shí)我們調(diào)用equals方法跟使用”==“比較符號(hào)有什么區(qū)別呢护蝶,來看一個(gè)栗子:

public class Test {

public static void main(String[] args) {

Goods a = new Goods("Java",100);

Goods b = new Goods("C++",100);

Goods c = new Goods("Java",100);

Goods d = a;

System.out.println(a.equals(b));

System.out.println(a.equals(c));

System.out.println(a.equals(d));

System.out.println(a==b);

System.out.println(a==c);

System.out.println(a==d);

}

}

輸出如下:

false

true

true

false

false

true

對(duì)于前三個(gè)輸出應(yīng)該沒什么問題华烟,主要看后三個(gè),這里用相等比較符時(shí)滓走,判斷的僅僅是兩個(gè)變量存儲(chǔ)的內(nèi)容是否一致,由于a帽馋、b搅方、c、d均為引用類型绽族,所以比較的僅僅是它們是否指向相同的對(duì)象姨涡,這里只有a跟d指向的是相同的對(duì)象,c雖然title和price都與a相同吧慢,但是跟a是兩個(gè)完全不同的對(duì)象涛漂,因此沒有返回的是false。

另外检诗,有人也許會(huì)問匈仗,做類型判斷的時(shí)候,為什么不用instanceof或者isInstance方法逢慌,這里簡(jiǎn)單說明一下原因悠轩。instance判斷的是a對(duì)象是否和b對(duì)象屬于同一個(gè)類,或者有同一個(gè)父類攻泼,或者實(shí)現(xiàn)了同一個(gè)接口火架。isinstance方法則判斷兩種類型是否可以進(jìn)行強(qiáng)轉(zhuǎn)鉴象。

由于這個(gè)小栗子并沒有相關(guān)上下文,所以還是直接用getClass方法進(jìn)行判斷比較穩(wěn)妥何鸡,當(dāng)然纺弊,以后可以根據(jù)具體實(shí)際情況進(jìn)行修改。

至此骡男,equals方法講解完畢淆游,很簡(jiǎn)單吧。之后還是會(huì)繼續(xù)更新的洞翩,歡迎大家繼續(xù)關(guān)注稽犁!

真正重要的東西,用眼睛是看不見的骚亿。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末已亥,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子来屠,更是在濱河造成了極大的恐慌虑椎,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,406評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件俱笛,死亡現(xiàn)場(chǎng)離奇詭異捆姜,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)迎膜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,395評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門泥技,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人磕仅,你說我怎么就攤上這事珊豹。” “怎么了榕订?”我有些...
    開封第一講書人閱讀 167,815評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵店茶,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我劫恒,道長(zhǎng)贩幻,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,537評(píng)論 1 296
  • 正文 為了忘掉前任两嘴,我火速辦了婚禮丛楚,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘憔辫。我一直安慰自己鸯檬,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,536評(píng)論 6 397
  • 文/花漫 我一把揭開白布螺垢。 她就那樣靜靜地躺著喧务,像睡著了一般赖歌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上功茴,一...
    開封第一講書人閱讀 52,184評(píng)論 1 308
  • 那天庐冯,我揣著相機(jī)與錄音,去河邊找鬼坎穿。 笑死展父,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的玲昧。 我是一名探鬼主播栖茉,決...
    沈念sama閱讀 40,776評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼孵延!你這毒婦竟也來了吕漂?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,668評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤尘应,失蹤者是張志新(化名)和其女友劉穎惶凝,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體犬钢,經(jīng)...
    沈念sama閱讀 46,212評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡苍鲜,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,299評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了玷犹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片混滔。...
    茶點(diǎn)故事閱讀 40,438評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖歹颓,靈堂內(nèi)的尸體忽然破棺而出坯屿,到底是詐尸還是另有隱情,我是刑警寧澤晴股,帶...
    沈念sama閱讀 36,128評(píng)論 5 349
  • 正文 年R本政府宣布愿伴,位于F島的核電站肺魁,受9級(jí)特大地震影響电湘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜鹅经,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,807評(píng)論 3 333
  • 文/蒙蒙 一寂呛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧瘾晃,春花似錦贷痪、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,279評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽肉津。三九已至,卻和暖如春舱沧,著一層夾襖步出監(jiān)牢的瞬間妹沙,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,395評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工熟吏, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留距糖,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,827評(píng)論 3 376
  • 正文 我出身青樓牵寺,卻偏偏與公主長(zhǎng)得像悍引,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子帽氓,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,446評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容