package com.lbj.javase18;
/**
* 關於Object中的equals方法:
*
* Object中的equals方法(核心):
* public boolean equals(o2){
* return(this==obj);//相當於return(o1==o2);中間跟的是雙等號==,兩邊引用地址內存相同則true,不同則false
* }
*
* 因此,Object中的equals方法比較的是兩個引用的內存地址
*
* 但是,java對象中的equals方法的設計目的:是判斷兩個對象是否一樣
* @author 14811
*
*/
public class Test01 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Object o1=new Object();//因爲所有類都默認繼承Object類
Object o2=new Object();
boolean b1=o1.equals(o2);
System.out.println(b1);//false
//例2
Star s1=new Star(100,"張三");
Star s2=new Star(100,"張三");
Star s3=new Star(111,"張三");
System.out.println(s1.equals(s2));//false,同時,這裏面調用的是當前對象的equals,所以要在當前對象的類中進行重寫
//但是實際結果我們不想看到這種情況的發生,因爲id號相同就代表是同一個人的意思
//所以Object中的equals方法也要重寫
//再一次編譯後就是true了
System.out.println(s2.equals(s3));//false,id號不一致
}
}
//例2
class Star{//默認繼承object類
int id;
String name;
//構造方法
public Star(int id,String name){
this.id=id;
this.name=name;
}
//開始重寫,到API幫助文檔進行復制重寫
//需求規定:如果身份證號一致,並且名字也一致,則代表同一個人
//s1.equals(s2);
//相當於 this 和 obj 之間的參數傳遞比較
public boolean equals(Object obj){//父類型引用指向子類型對象,如果父類型想調用子類型,需要進行強制轉換
//int id1=this.id;//這個this.id之所以成立是因爲在這個類裏面this代表的是Star,因此this包涵有id這個屬性
//int id2=obj.id;報錯,因爲obj裏面沒有id這個屬性
//改正
//先強制類型轉換
//Star s=(Star)obj;
//int id2=s.id;
//這裏比較內存地址是否相同
if(this==obj)return true;//如果內存地址相同的話,equals也成立的意思
//這裏比較內容是否相同
if(obj instanceof Star){//如果obj是Star
Star s=(Star)obj;//強轉爲同一個類型
if(s.id==this.id&&s.name.equals(name)){//左邊的equals是調用String類型裏面重寫的,比較的是字符串,不是內存地址了
return true;
}
}
return false;
//在java中比較兩個字符串是否一致,不能用"==",只能調用String類的equals方法
}
}