20175310 类定义
20175310 类定义
一、题目要求
1.设计并实现一个Book
类,定义义成Book.java
,Book
包含书名,作者,出版社和出版日期,这些数据都要定义getter
和setter
。
2.定义至少三个构造方法,接收并初始化这些数据。
3.覆盖(Override)toString
方法,返回良好的含有多行的书的描述信息。
4.覆盖equals
方法,书名,作者,出版社和出版日期完全一致才说明两本书是一样的。
5.创建一个测试类Bookshelf
, 其中的main
方法创建并更新几个Book
对象。
6.Book
至少包含三本本学期教材内容。
二、设计思路
这次任务的设计思路主要是按照题目要求来的,将一个大问题分解成一个个小问题,逐个击破,大问题也就解决了。主要思路如下:
1.设计并实现一个Book
类,定义义成Book.java
,Book
包含书名,作者,出版社和出版日期,这些数据都要定义getter
和setter
。
这一步是需要设置书名,作者,出版社和出版日期这四个成员变量,并用getter
和setter
定义这四个变量。这一部分比较简单,代码如下:
String bookName;
String author;
String press;
String pubDate;
public String getName() {
return bookName;
}
public void setName(String name) {
bookName= name;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getPress() {
return press;
}
public void setPress(String press) {
this.press = press;
}
public String getPubDate() {
return pubDate;
}
public void setPubDate(String date) {
pubDate = date;
}
2.定义至少三个构造方法,接收并初始化这些数据。
用自定义构造方法,给四个变量的值进行初始化,代码如下:
Book (){ //自定义构造方法
bookName = "xxx";
author = "qwerty";
press ="xx出版社";
pubDate = "20xx.x";
}
3.覆盖(Override)toString
方法,返回良好的含有多行的书的描述信息。
覆盖是方法覆盖的简称,也叫作方法重写。在这道题里,父类是Object
类,子类是Book
类,也就是Book
类要覆盖Object
类的toString
方法,通过查看Object
类中toString
方法的写法,在Book
类中重写了toString
方法。
下图是Object
类中toString
方法的写法:
下面是Book
类中重写toString
方法的代码:
public String toString() { //覆盖了父类Object中的toString方法。
return "Book\n" +
"书名:" + bookName + "\n" +
"作者:" + author + "\n" +
"出版社:" + press + "\n" +
"出版时间:" + pubDate + "\n";
}
4.覆盖equals
方法,书名,作者,出版社和出版日期完全一致才说明两本书是一样的。
equals
方法的重写之前没有学过,书上的和之前做的练习主要都是讲怎么用equals
方法,对于怎么重写没有提到。我在网上参考了《重写equals方法》这篇博客,完成了这部分的代码:
public boolean equals(Object obj) { //覆盖了父类Object中的equlas方法。
if (this == obj) //判断是否为同一对象
return true;
if (obj == null ) //判断是否为空
return false;
if (getClass() != obj.getClass()) //判断是否属于同一个类
return false;
Book book = (Book) obj; ////如果类型相同,比较内容
if (bookName == null) {
if (book.bookName != null)
return false;
} else if (!bookName.equals(book.bookName))
return false;
if (author == null) {
if (book.author != null)
return false;
} else if (!author.equals(book.author))
return false;
if (press == null) {
if (book.press != null)
return false;
} else if (!press.equals(book.press))
return false;
if (pubDate == null) {
if (book.pubDate != null)
return false;
} else if (!pubDate.equals(book.pubDate))
return false;
return true;
}
public int hashCode() { //重写hashcode
final int prime = 31;
int result = 1;
result = prime * result + ((bookName == null) ? 0 : bookName.hashCode());
result = prime * result + ((author == null) ? 0 : author.hashCode());
result = prime * result + ((press == null) ? 0 : press.hashCode());
result = prime * result + ((pubDate == null) ? 0 : pubDate.hashCode());
return result;
}
这里需要注意的一点是:在这篇博客里,作者有提到重写equals
方法一定要重写hashcode
方法。因为散列码(hashcode)是由对象导出的一个整数值,它是没有规律的。每个对象基本上对应唯一的一个散列码。因此重写equals
与hashcode
定义必须一致:如果a.equals(b)
返回true
,那么a.hashcode()
和b.hashcode()
必须具有相同的值。
5.创建一个测试类Bookshelf
, 其中的main
方法创建并更新几个Book
对象。
这一部分比较简单,写一个main
方法,然后创建三个Book
对象就可以了:
public static void main(String[] args){
Book book1 = new Book();
Book book2 = new Book();
Book book3 = new Book();
6.Book
至少包含三本本学期教材内容。
最后就是定义每本书的各种信息并输出:
book1.setName ( "数据结构与算法" );
book1.setAuthor ( "aaa" );
book1.setPress ( "浙江大学出版社" );
book1.setPubDate ( "2019.4" );
book2.setName ( "JAVA" );
book2.setAuthor ( "bbb" );
book2.setPress ( "清华大学出版社" );
book2.setPubDate ( "2019.4" );
book3.setName ( "密码学" );
book3.setAuthor ( "ccc" );
book3.setPress ( "金城出版社" );
book3.setPubDate ( "2019.4" );
System.out.println(book1.toString ());
System.out.println(book2.toString ());
System.out.println(book3.toString ());
三、运行结果截图
四、问题及解决方案
-
问题1:
在做题目要求第二步时出现了错误,我在Book.java
中构造方法时加了String
类型的参数m
,编译时报错:
-
问题1解决方案:
之前加参数m
是想把m
赋值给bookName
,但是在主类创建Book
的对象时,没有给参数,所以提示说无法将类Book中的构造器Book应用到给定类型,实际参数列表和形式参数列表长度不同
。解决的办法是直接赋值,即不定义参数,在构造方法中给书的各个变量赋值进行初始化: