20175310 类定义

20175310 类定义

一、题目要求

1.设计并实现一个Book类,定义义成Book.java,Book 包含书名,作者,出版社和出版日期,这些数据都要定义gettersetter
2.定义至少三个构造方法,接收并初始化这些数据。
3.覆盖(Override)toString方法,返回良好的含有多行的书的描述信息。
4.覆盖equals方法,书名,作者,出版社和出版日期完全一致才说明两本书是一样的。
5.创建一个测试类Bookshelf, 其中的main方法创建并更新几个Book对象。
6.Book至少包含三本本学期教材内容。

二、设计思路

这次任务的设计思路主要是按照题目要求来的,将一个大问题分解成一个个小问题,逐个击破,大问题也就解决了。主要思路如下:

1.设计并实现一个Book类,定义义成Book.java,Book 包含书名,作者,出版社和出版日期,这些数据都要定义gettersetter

这一步是需要设置书名,作者,出版社和出版日期这四个成员变量,并用gettersetter定义这四个变量。这一部分比较简单,代码如下:

   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)是由对象导出的一个整数值,它是没有规律的。每个对象基本上对应唯一的一个散列码。因此重写equalshashcode定义必须一致:如果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应用到给定类型,实际参数列表和形式参数列表长度不同 。解决的办法是直接赋值,即不定义参数,在构造方法中给书的各个变量赋值进行初始化:

五、代码托管

posted @ 2019-04-04 16:21  20175310xcy  阅读(230)  评论(0编辑  收藏  举报