CoreJava(第五章)繼承-03

5.2Object:所有類的超類

1)Object類是Java中所有類的始祖,在Java中每個類都是由它擴展而來的。

2)我們可以使用Object類型的變量引用任何類型的對象。

如:

Object obj = new Employee("張三",5000);	// 說明我們可以使用Object類型來作爲Employee類型的對象

3)Object類型的變量只能用於作爲各類值的通用持有者,如果想對裏面的內容進行具體操作,還需要進行相應的類型轉換。

如:

Employee e = (Employee) obj;	// 如果我們想對Employee裏面的內容進行操作,則需要進行類型轉換

4)Java中,只有基本類型不是對象;不管是對象數組還是基本類型的數組,它們都擴展了Object類。

如:

Employee[] staff = new Employee[10];
obj = staff;	// ok;對象數組
obj = new int[10];	// ok;基本類型數組

5.2.1equals方法

1)Object類中的equals方法用於檢測一個對象是否等於另一個對象。

2)Object類中,equals這個方法將判斷兩個對象是否具有相同的引用。

如:兩個員工的姓名、身份證、薪水和入職日期都是一樣的,我們就認爲他們是相等的。

public boolean equals(Object otherObject) {
		// 如果當前和傳入的值一致,返回true
		if (this == otherObject) return true;
		// 如果傳入的值爲null,返回false
		if (otherObject == null) return false;
		// 如果getClass不等於傳入值的getClass,返回false
		if (getClass() != otherObject.getClass()) return false;
		
		// 現在我們可以知道otherObject是一個非空參數
		Employee other = (Employee) otherObject;
		// 測試是否有相同的值
		return name.equals(other.name) && salary == other.salary && hireday.equals(other.hireday);
	}

其中:getClass方法將返回一個對象所屬的類。

5.2.2相等測試與繼承

Java語言規範要求equals方法具有以下特性:

1 ) 自反性 : 對於任何非空引用 x , x.equals(x)應該返回 true。
2 ) 對稱性 : 對於任何引用 x 和 y , 當且僅當 y.equals ( x ) 返回 true , x.equals ( y ) 也應該返
回 true。
3 ) 傳遞性 : 對於任何引用 x 、 y 和 z , 如果 x . equals ( y ) 返 N true, y . equals ( z ) 返回 true ,
x . equals ( z ) 也應該返回 true 。
4 ) 一致性 : 如果 x 和 y 引用的對象沒有發生變化, 反覆調用 x . eqimIS ( y ) 應該返回同樣
的結果。
5 ) 對於任意非空引用 x , x . equals ( null ) 應該返回 false

5.2.3hashCode方法

hashCode叫散列碼,是由對象導出的一個整型值。

如:

String s = "OK";
System.out.println(s.hashCode());	// 散列碼是2524
String t = new String("OK");
System.out.println(t.hashCode());	// 散列碼是2524
System.out.println(s.equals(t));	// true

5.2.4toString方法

toString方法:表示對象值的字符串。

例:一個普通的toString方法

public String toString() {
		return "Employee [name=" + name + ", salary=" + salary + ", hireday=" + hireday + "]";
	}

我們可以將以上代碼通過getClass().getName()獲得類名的字符串,而不用將類名硬加到toString方法中。

public String toString() {
		return getClass().getName() + "[name=" + name + ", salary=" + salary + ", hireday=" + hireday + "]";
	}

如果父類中使用了getClass().getName(),那麼子類只要調用super.toString()就可以了。

public class ObjectTostring extends Employee{
	
	public String toString() {
		return super.toString() + "[salary=" +salary +"]";
	}
}

我這裏之所以可以訪問Employee的salary域,是因爲我將salary聲明爲了protected類型,這樣子類ObjectTostring就可以直接訪問父類裏面的域了。

protected double salary;

Java中規定:在調用如x.toString()的地方可以用""+x替代。

x.toString(); // 可以用""+x替代

表示:這條語句將一個空串與x的字符串表示相連接。

5.3泛型數組列表

1.一旦我們確定了數組的大小,想要改變它就不是很容易的?

解決這個問題最簡單的就是:ArrayList類。

2.ArrayList是一個採用類型參數的泛型類,如

ArrayList<Employee>

3.JDK1.7之後省去了右邊的類型參數,如

// 1.7以前的寫法
ArrayList<Employee> staff = new ArrayList<Employee>();
// 1.7之後的寫法,省去了右邊的類型參數
ArrayList<Employee> staff = new ArrayList<>();

4.數組列表的操作魅力:

如果我們在調用ArrayList中的add方法時,內部數組已經滿了,這時數組就會自動地創建出一個更大的數據,並將所有的對象從較小的數組中拷貝到較大的數組中。

其中size()方法將返回數組列表中包含的實際元素數目。等價於數組的length。

5.3.1訪問數組列表元素

1.數組列表自動擴展容器的便利的同時,增加了訪問元素語法的複雜程度。

2.小技巧:

既可以靈活擴展數組,又可以方便的訪問數組的元素。

1)首先,創建一個數組,並添加所有的元素。

ArrayList<X> list = new ArrayList<>();
		while(...) {
			x= ...;
			list.add(x);
		}

2)使用toArray方法將數組元素拷貝到另一個數組中。

X[] a = new X[list.size()];
list.toArray(a);

3.注意事項

不必指出數組的大小 。

• 使用 add將任意多的元素添加到數組中。
• 使用 size ()替代 length 計算元素的數目。
• 使用 a.get(i)替代 a[i]訪問元素。

發佈了92 篇原創文章 · 獲贊 285 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章