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]訪問元素。