類定義(課下選作)
要求
- Book類包含書名,做者,出版社和出版日期
- getter,setter
- 至少三個構造方法,接收並初始化這些數據
- 覆蓋toString方法,返回良好的含有多行的書的描述信息
- 覆蓋equals方法,書名,做者,出版社和出版日期徹底一致才說明兩本書是同樣的。
- 建立一個測試類Bookshelf
設計思路
- 首先在Book類中定義所須要的變量,構造方法
- 定義getter,setter方法
重難點就在於toString,equals方法的重寫,之前在課上測試過
- toString()方法的重寫,返回重寫的字符串便可。
public String toString(){ return str; }
- Object類中的equals方法:用於檢測一個對象是否等於另一個對象,源碼以下:
public boolean equals(Object obj) {
return (this == obj);
}
- 實際處理中,若要比較兩個對象是否相等,通常須要重寫equals方法
- 顯示參數命名爲otherObject, 稍後轉化成other變量
public boolean equals(Object otherObject)
- 檢測this和otherObject是不是同一個對象的引用,是,返回true;
if(this==otherObject){
return true;
}
- 檢測otherObject是否爲null, 是, 返回false;
if(otherObject == null){
return false;
}
- 比較this和otherObject是否屬於同一個類. 若是equals的語義在每一個子類中有所改變,就使用getClass檢測:
if(getClass() != otherObject.getClass()){
return false;
}
- 若是因此子類語義相同,使用instanceof檢測:
if(!(otherObject instanceof Employee)){
return false;
}
- 將otherObject轉化爲相對應的類型變量other
Book bk = (Book)obj
- 對所須要的比較的數據域進行比較. 若是是基本數據類型,使用a==b比較; 若是是對象比較,調用Objects.equals(a, b)進行比較
- 當equals()被重寫時,一般有必要重寫 hashCode 方法,以維護 hashCode 方法的常規協定,該協定聲明相等對象必須具備相等的哈希碼。
- hashcode不相同,用equals()方法判斷的返回的必定爲false。
- hashcode相同,equals()方法返回值不能確認,可能爲true,可能爲false。
- getClass方法,得到當前對象的類型,下面的語句,獲得的就是字符串的類型。
Class theClass="hello".getClass();
測試代碼
public class bookShelf {
public static void main(String[] args) {
Book b1 = new Book("Java實用教程","耿祥義","清華大學出版社","2017年9月");
Book b2 = new Book("密碼學","鄭秀林","金城出版社","2016年8月");
Book b3 = new Book("彙編語言程序設計","錢曉捷","中國工信出版社","2018年6月");
System.out.println(b1.getBookname());
System.out.println(b2.getDate());
System.out.println(b3.getPublisher());
System.out.println(b1.equals(b2));
System.out.println(b2.equals(b2));
}
}
運行結果截圖
參考
重寫equals方法git