自学内容网 自学内容网

【JavaSE】图书系统

目录

当我们学习完Java的语法后,可以写一个简单的项目进行总结梳理一下,这个项目也会用到我们所学过的Java所有的语法知识:目录是咱们用文件夹包装起来的类。

1.book

在面向对象体系中,提出了一个软件包的概念,即:为了更好的管理类,把多个类收集在一起成为一组,称为软件包。

图书系统无非就是由使用者,工具,被使用者组成,谁被使用呢,无非就是图书,那图书又是存放在哪里呢,那就是书架,所以我们把书和书架可以归类为被使用者,用一个包来封装它们。

我们在进行下一步前先得学一个知识点,那就是类。

类是用来对一个实体(对象)来进行描述的,主要描述该实体(对象)具有哪些属性(外观尺寸等),哪些功能(用来干 啥),描述完成后计算机就可以识别了。

类中包含的内容称为类的成员。属性主要是用来描述类的,称之为类的成员属性或者类成员变量。方法主要说明类 具有哪些功能,称为类的成员方法。

就比如一个洗衣机可以做类,里面成员有它的属性,也有它的功能

class WashMachine{
    public String brand;   // 品牌
    public String type;    // 型号
    public double weight;  // 重量
    public double length;  // 长
    public double width;  // 宽
    public double height;  // 高
    public String color;   // 颜色
    
    public void washClothes(){   // 洗衣服
        System.out.println("洗衣功能");
   }
    
    public void dryClothes(){    // 脱水
        System.out.println("脱水功能");
   }
    
    public void setTime(){       // 定时
        System.out.println("定时功能");
   }
}

当我们简单了解了一下类之后,接下来,咱们在这个包底下创建俩个类,名字分别是书和书架。


1.1Book

如下代码,我们先定义书的属性,名字,作者,价格,类型。这里的isBorrow是用来判断书是否被借出的标记变量。

下面的public Book是构造函数,就是当book被创建时,需要对这些变量进行初始化。

下面的所有方法都是对咱们的属性成员进行基本操作的方法,可以用快捷键一键生成,可以节约很多时间。

以下代码运用到的第一个知识点就是继承(往下滑会有简单描述)中的this。

this引用指向当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过该引用去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。

package book;

public class Book {
    private String name;
    private String author;
    private int price;
    private String tyle;
    private boolean isBorrow;

    public Book(String name, String author, int price, String tyle) {
        this.name = name;
        this.author = author;
        this.price = price;
        this.tyle = tyle;
    }


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public int getPrice() {
        return price;
    }

    public void setPrice(int price) {
        this.price = price;
    }

    public String getTyle() {
        return tyle;
    }

    public void setTyle(String tyle) {
        this.tyle = tyle;
    }

    public boolean isBorrow() {
        return isBorrow;
    }

    public void setBorrow(boolean borrow) {
        isBorrow = borrow;
    }

    @Override
    public String toString() {
        return "Book{" +
                "name='" + name + '\'' +
                ", author='" + author + '\'' +
                ", price=" + price +
                ", type='" + tyle + '\'' +
                ((isBorrow == true) ? " 已经借出" : " 未被借出") +
                /*", isBorrowed=" + isBorrowed +*/
                '}';
    }
}

这里最后一个方法是重写方法,因为我们所有的类都默认继承Object类,toString是该类底下的一种方法,我们只需要对其进行重写即可使用这个方法,这里运用的了对isBorrow进行三目运算来判断书是否被借出。

继承(inheritance)机制:是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特 性 的基础上进行扩展,增加新功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构, 体现了 由简单到复杂的认知过程。继承主要解决的问题是:共性的抽取,实现代码复用。 例如:狗和猫都是动物,那么我们就可以将共性的内容进行抽取,然后采用继承的思想来达到共用。

1.2BookList

这里我们创建一个可以放十本书的书架,默认先放好三本书,下面方法同样是对我们的成员进行操作的方法。

package book;

public class BookList {
    private Book[] books;
    private int useSize;
    public BookList() {
        this.books = new Book[10];
        //放好树!!
        this.books[0] = new Book("三国演义","罗贯中",10,"小说");
        this.books[1] = new Book("西游记","吴承恩",9,"小说");
        this.books[2] = new Book("红楼梦","曹雪芹",19,"小说");

        this.useSize = 3;
    }

    public int getUseSize() {
        return useSize;
    }

    public void setUseSize(int useSize) {
        this.useSize = useSize;
    }
    public Book getBooks(int pos) {
        return books[pos];
    }
    public Book setBooks(int pos, Book book) {
        return books[pos]=book;
    }

    public Book[] getBooks() {
        return books;
    }

    public void setBooks(Book[] books) {
        this.books = books;
    }
}

 

2.operation

这个包我们创建过来是为了把所有功能类分装在一起,以便后期的代码扩展性能更好地表达。

2.1AddOperattion

package operation;
import book.BookList;
import book.Book;
import java.util.Scanner;

public class AddOperation implements IOPeration {

    @Override
    public void work(BookList bookList) {
        System.out.println("新增图书!!!");

        Scanner sc=new Scanner(System.in);
        System.out.println("请输入书名:");
        String name=sc.nextLine();

        System.out.println("请输入作者:");
        String author=sc.nextLine();

        System.out.println("请输入类型:");
        String type=sc.nextLine();

        System.out.println("请输入价格");
        int price=sc.nextInt();

        Book book=new Book(name,author,price,type);
        int currentSize=bookList.getUseSize();
        for(int i=0;i<currentSize;i++){
            Book book1=bookList.getBooks(i);
            if(book1.getName().equals(name)){
                System.out.println("有这本书,不进行存放了!");
                return;
            }
        }
        if(bookList.getBooks().length==currentSize){
            System.out.println("书架满了!");
        }
        else{
            bookList.setBooks(currentSize,book);
            bookList.setUseSize(currentSize+1);
        }
    }
}

2.2BorrowOperation

package operation;

import book.BookList;
import book.Book;
import java.util.Scanner;

public class BorrowOperation implements IOPeration {

    @Override
    public void work(BookList bookList) {
        System.out.println("借阅图书!!!");
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你要借的图书:");
        String name = scanner.nextLine();
        int currentSize=bookList.getUseSize();
        for (int i = 0; i < currentSize; i++) {
            Book book=bookList.getBooks(i);
            if(book.getName().equals(name)){
                book.setBorrow(true);
                System.out.println("借阅成功!");
                System.out.println(book);
                return;
            }
        }
        System.out.println("你借阅的图书不存在!!");
     }
}

2.3DelOperation

package operation;
import book.Book;
import book.BookList;
import java.util.Scanner;

public class DelOperation implements IOPeration {

    @Override
    public void work(BookList bookList) {
        System.out.println("删除图书!!!");
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你要删除的图书:");
        String name = scanner.nextLine();
        int pos=0;
        int currentSize=bookList.getUseSize();
        int i = 0;
        for (; i < currentSize; i++) {
            Book book=bookList.getBooks(i);
            if (book.getName().equals(name)) {
                pos=i;
                break;
            }
        }
        if(i==currentSize){
            System.out.println("没有你要删除的书!!");
        }
        for(;pos<currentSize-1;pos++){
            Book book=bookList.getBooks(pos);
            bookList.setBooks(pos,book);
        }
        bookList.setBooks(pos,null);
        bookList.setUseSize(currentSize-1);
    }
}

2.4ExitOperation

package operation;

import book.BookList;

public class ExitOperation implements IOPeration {

    @Override
    public void work(BookList bookList) {
        System.out.println("退出图书!!!");
        System.exit(0);
    }
}

2.5FindOperation

package operation;

import book.BookList;
import book.Book;
import java.util.Scanner;

public class FindOperation implements IOPeration {

    @Override
    public void work(BookList bookList) {
        System.out.println("查找图书!!!");

        Scanner sc=new Scanner(System.in);
        String name=sc.nextLine();
        int currentSize=bookList.getUseSize();
        for(int i=0;i<currentSize;i++){
            Book book=bookList.getBooks(i);
            if(book.getName().equals(name)){
                System.out.println("找到了这本书,信息如下:");
                return;
            }
        }
        System.out.println("没有找到这本书!");
    }
}

2.6IOperation

咱们这里用到了一个接口,可以让主其他类通过这个接口来链接所有功能类,只要其他被链接的类名+implements+接口名,然后重写接口的方法,在其中进行逻辑操作即可串接上这个类。

接口就是公共的行为规范标准,大家在实现时,只要符合规范标准,就可以通用。 在Java中,接口可以看成是:多个类的公共规范,是一种引用数据类型。

package operation;

import book.BookList;

public interface IOPeration {
    void work(BookList bookList);
}

2.7ReturnOperation

package operation;

import book.Book;
import book.BookList;

import java.util.Scanner;

public class ReturnOperation implements IOPeration {

    @Override
    public void work(BookList bookList) {
        System.out.println("归还图书!!!");
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你要归还的图书:");
        String name = scanner.nextLine();
        int currentSize=bookList.getUseSize();
        for (int i = 0; i < currentSize; i++) {
            Book book=bookList.getBooks(i);
            if(book.getName().equals(name)){
                book.setBorrow(false);
                System.out.println("归还成功!");
                System.out.println(book);
                return;
            }
        }
        System.out.println("你归还的图书不存在!!");
    }
}

2.8ShowOperation

package operation;
import book.Book;
import book.BookList;

public class ShowOperation implements IOPeration {

    @Override
    public void work(BookList bookList) {
        System.out.println("打印图书!!!");
        int currentSize = bookList.getUseSize();
        for (int i = 0; i < currentSize; i++) {
            Book book = bookList.getBooks(i);
            System.out.println(book);
        }
    }
}

3.user

这里我们的使用者分为俩类人:管理员和普通用户

这些人也用一个包集中起来,后续方便拓展。

3.1AdminUser

这里当我们帮助父类的构造方法时,需要运用到super关键字。

由于设计不好,或者因场景需要,子类和父类中可能会存在相同名称的成员,如果要在子类方法中访问父类同名成 员时,该如何操作?直接访问是无法做到的,Java提供了super关键字,该关键字主要作用:在子类方法中访问父类的成员。

package user;
import java.util.Scanner;
import operation.*;
public class AdminUser extends User {
    public AdminUser(String name) {
        super(name);
        this.ioPerations = new IOPeration[]{
                new ExitOperation(),
                new AddOperation(),
                new FindOperation(),
                new DelOperation(),
                new ShowOperation(),
        };
    }
    public int menu() {
        System.out.println("**********管理员用户*****");
        System.out.println("1. 查找图书");
        System.out.println("2. 新增图书");
        System.out.println("3. 删除图书");
        System.out.println("4. 显示图书");
        System.out.println("0. 退出系统");
        System.out.println("**********************");
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你的操作:");
        int choice = scanner.nextInt();
        return choice;
    }
}

3.2NormaUser

package user;
import book.BookList;
import operation.*;
import java.util.Scanner;

public class NormaUser extends User {
    public NormaUser(String name) {
        super(name);
        this.ioPerations = new IOPeration[]{
                new ExitOperation(),
                new FindOperation(),
                new BorrowOperation(),
                new ReturnOperation(),
        };
    }
    public int menu() {
        System.out.println("**********普通用户******");
        System.out.println("1. 查找图书");
        System.out.println("2. 借阅图书");
        System.out.println("3. 归还图书");
        System.out.println("0. 退出系统");
        System.out.println("**********************");
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你的操作:");
        int choice = scanner.nextInt();
        return choice;
    }


}

4.Main

众所周知,每一个项目中都必须有个main函数操作整个项目,这里我们将main单独写一个类会更加方便,因为我们每次运行程序都会有些重复的代码。

import book.BookList;
import user.AdminUser;
import user.NormaUser;
import user.User;

import java.util.Scanner;
public class Main {
    public static User login(){
        System.out.println("请输入你的姓名");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();
        System.out.print("请输入你的身份,1:管理员   2:普通用户->");
        int choice = scanner.nextInt();
        if(choice == 1){
            return new AdminUser(name);
        }
        else{
            return new NormaUser(name);
        }
    }
    public static void main(String[] args) {
        BookList bookList = new BookList();
        User user=login();
        while(true){
            int choice= user.menu();
            System.out.println("choice :"+ choice);
            user.doOperation(choice,bookList);
        }
    }
}

5.总结

在整个图书系统中我们有运用到许多知识,有数组,类和对象,继承,多态,接口,抽象类,还有一些比较灵活的算法,这就是我JavaSE中所学的知识结合起来做的一个小项目。


原文地址:https://blog.csdn.net/2301_80302655/article/details/142934121

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!