Object類(toString equals)
1、即使是沒有寫繼承,其實也是繼承於Object類,是Object類的子類
2、toString方法
(1)返回型別是String型別的
public String toString()
(2)一個引用,經常需要訪問一個字串或者需要當做字串來處理的時候,這個時候,需要呼叫這個引用所指物件的toString方法,也就是說,把引用當字串處理的時候,都會呼叫toString方法。
(3)如果+一邊是字串,一邊是引用的時候,這個時候,需要將引用當成字串來處理,java中一般都是呼叫這個引用所指物件的toString方法
(4)因為沒有重寫toString方法,所以呼叫的是Rectangle類從Object類中繼承來的方法,或者是實現的是Object類中toString類的預設輸出,包名.型別@邏輯地址
(5)但是有時候想要輸出的是比如長、寬等,所以這個時候,需要對toString進行重寫
注意:在System.out.println()中,如果括號中的形參僅僅是一個引用,沒有+的時候,實際上列印的是形參也就是引用的toString
注意:
JAVA非main函式裡不能System.out.println();
這樣是錯誤的。
這樣是正確的。
3、equals方法
(1)a.(equals)b :比較的是內容是否相同
public boolean equals(Object o)
形參必須是Object
(2)== :a==b是判斷a和b的地址是否相同,或者是說a和b是否指向同一個物件,即使有時內容相同,但是指向的邏輯地址不一定相同
(3)equals方法在Object中有預設實現的,但是滿足不了子類的要求,因為預設實現與==類似,滿足不了看內容是否相等的要求。
(4)因為沒有重寫,所以是預設方法,也就是看邏輯地址是否相同(是否指向同一個物件)
因為指向的是兩個物件,所以返回的是false;
(5)重寫equals方法
因為判斷內容是否相同有多種,比如面積相同則相同、長相同則相同等,現在這裡假設是長和寬同時相同的時候才為相同,則如下所示
但是,上面的寫法是有問題的,因為如果沒有Rectangle rec2=new Rectangle(3,4);
這句話,而是Cat c=new Cat();
Sysem.out.println(rec1.equals(c));
這個時候會出錯,編譯沒有問題,因為o是Object型別的,所以可以傳過Cat型別的,強制型別轉換可能也是可以的,但是呼叫屬性的時候會報錯,因為c所指的物件中沒有a和b,所以,貓無法和矩形進行比較,因此執行的時候會報錯。
改進方法:
public boolean equals(Object o)
{
if(o==null) return false;
else
{
boolean result=false;
if(o instanceof Rectangle)
{
Rectangle rec1=(Rectangle)o;
if(this.a==rec1.a&&this.b==rec1.b)
{
result=true;
}
}
return result;
}
}
(6)自動生成equals
右擊——原始碼——生成hashCode()和Equals()
這個是可以直接使用的。
(7)
注意:1、stu1.equals()呼叫的是stu1中重寫的equals方法
pg1.equals()呼叫的是pg1中的equals方法
2、equals中的形參是Object類