zoukankan      html  css  js  c++  java
  • 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
    " +
                  "书名:" + bookName + "
    " +
                  "作者:" + author + "
    " +
                  "出版社:" + press + "
    " +
                  "出版时间:" + pubDate + "
    ";
    }
    

    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应用到给定类型,实际参数列表和形式参数列表长度不同 。解决的办法是直接赋值,即不定义参数,在构造方法中给书的各个变量赋值进行初始化:

    五、代码托管

  • 相关阅读:
    Python startswith()函数 与 endswith函数
    Oracle spool 小结
    表空间(TableSpace)
    Python logger模块
    Mysql rpm安装
    Python json与pickle
    Python 生成器总结
    Python 装饰器的总结
    eclipse 乱码问题总结
    Eclipse 中出现红色下划波浪线与红色感叹号
  • 原文地址:https://www.cnblogs.com/xicyannn/p/10653168.html
Copyright © 2011-2022 走看看