1. 程式人生 > >Object類(toString equals)

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類