类定义(课下选作)
要求
- 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