class User { String name; int age; /* *比較過程思路: *1、兩個對象指向位置相同,那么他們就相等,return后跳出函數,不再往下執行 *2、指向位置不同,有3情況 *a:這兩對象類型相同,並且內容相同,也屬於相等 *b:類型相同,內容不同,屬於不等; *c:類型不同,屬於不等 */ public boolean equals(Object obj){ //1、指向位置相同,指定同一對象 if(this == obj){ return true; } //2、指向位置不同 //能調用這里的equals,肯定是生成了User對象的,所以this肯定是User類型 //判斷obj是不是User類型,如果是就跟this為同一類型 boolean b =obj instanceof User; if(b){ /* *類型相同,obj為User類型,而跟this位置不同的對象(第1步已證明) *obj來源可能是: *User obj = new User(); *或 *Object obj =new Object(); //Object是 User的父類 */ //obj向下轉型為User對象,以便一定能調用User里面的值 User u =(User)obj;
//這里的equals是用name調用的(jdk里面String復寫過的equals方法),不是當前類的equals
//基本數據類型用==比,引用數據類型用equals比 if(this.age == u.age && this.name.equals(u.name)){ return true; }else{ return false; } }else { //類型不同,不是user對象,不等 return false; } } }
class Test { public static void main(String args[]){ //測試一:同地址,相等 User u1 = new User(); User u2 = u1; u1.name="sss"; boolean b = u1.equals(u2); System.out.println(b); //測試二:地址不同,類型、內容相同,相等 User u3 = new User(); User u4 = new User(); u3.name="sss"; u4.name="sss"; boolean b2 = u3.equals(u4); System.out.println(b2); } }
其他: