IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Java图书管理系统 -> 正文阅读

[Java知识库]Java图书管理系统

目录

功能

功能实现

Book包

Book类

?BookList类

Operation包

User包

user类

?Administrator类

Normaluser类

Main包

初步调试

方法实现

AddOperation(增添)

DisplayOperation(打印)

FindOperation(查找)

BorrowOperation(借书)

ReturnOperation(还书)

DelOperation(删除)

ExitOperation(退出 )

运行截图

完整代码


功能

面向不同对象有不同的功能选择,分为管理员和普通用户。管理员登录需要密码,普通用户则不需要。管理员能增加图书或删除图书,其余与普通用户一样,普通用户则有查阅图书信息,借阅和归还图书等。前提:需要了解java面向对象编程的一些应用。

可以参考:java面向对象编程

功能实现

Book包

首先我们需要建一个存储图书基本信息的Book类,里面有名称,作者,价格,类型,是否被借出。在建立一个Booklist类,作为类似书架的东西存储书,Booklist存储每本书的基本信息,书的最大容量,书的现有容量。再将它们一起装在一个Book包下。

Book类

考虑到后续需要增添或删除图书,我们为Book类搭建一个构造方法为图书基本信息赋值。为了让图书信息按照我们所需求的格式输出,我们需要重写toString方法。不了解toString的如下图所示:

?

?

?我们通过将鼠标放在方法上按住ctrl点过去,到达toString方法,它是返回一个“类名+符号@+对象所包含哈希值”,其实就是返回一串字符串。我们通过重写让其按照我们所需的格式输出即可,具体信息有兴趣的可以去查阅资料,博主在此不在多说了。

?BookList类

为了合理我们首先为书架存储四本书--四大名著。建立一个Book类型的数组,为其赋予最大容量值10,以及现有容量4,因为考虑后面需要增删,因此我们将usedSize设置为static型。

因为涉及查找,我们为书架构造几个方法,一个知道现有容量额方法,一个能通过下标访问图书信息。还有增添和删除,因此还要构造改变现有容量的方法,为书架改变书的方法(其实是按照下标给书赋值,增添一本书,但后续的这个方法有妙用)。

Operation包

这是一个方法包,我们将所有的方法都写在这个包里,如:增添图书,删除图书,查找图书,显示图书,借阅图书,归还图书,退出系统等。我们先简单实现一下这些方法,之后等系统完善后再来为这些方法写入逻辑。因为这些方法都是在一个书架上实现的嘛,所以我们为这些方法传入一个BookList类型的参数。

public class AddOperation{
       public void work(BookList bookList) {
           System.out.println("增添成功!");
       }
}

?把所有方法基本都先写成这个样,之后再完善。

因为我们之后要面向对象--管理员和用户,所以不同对象的功能肯定要不同,那我们又怎样在不同对象时调用不同的方法呢。这就是我们需要考虑的多态了,我们知道只要一个类实现了一个接口,那么就可以通过接口的引用调用这个类重写接口的方法,那么为这些类都实现一个共同的接口IOperation,让这个接口定义一个work方法,其他的类都去重写这个方法,那么我们就可以通过接口调用这些方法了,而在接口内实例化了一个scanner对象,那么实现这个接口的类也同样继承了这个对象,所以免去了冗余代码。

public interface IOperation {
    public void work(BookList bookList);
    Scanner scanner = new Scanner(System.in);
}

public class AddOperation implements IOperation{
    public void work(BookList bookList) {
          System.out.println("增添成功!");
    }
}


......

等等

......

User包

有了接口,我们能通过接口调用这些方法了,但是怎么面向对象呢?

我们定义一个user类作为父类,Administrator类作为管理员类,Normaluser作为普通用户类。

接口有一个很大的好处,那就是可以建造一个接口数组,而数组里的成员则可以是实现这个接口的类,这就意味着当我们数组里的成员不同时,可以调用的方法也将不同。

user类

我们在父类user下设立一个IOperation接口的引用,那么在管理员类和普通用户类下面则可以实现这个接口数组。因为需要对象知道他有哪些功能,于是我们在user类下面构造了一个菜单界面,方便对象使用功能。而有了菜单后,对象怎么调用功能就是通过 接口数组了,而数组需要传下标,所以加入了choice作为选择功能。

public abstract class User {
    protected IOperation[] iOperations;
    abstract public int Menu();
    abstract public void DoWork(int choice, BookList bookList);
}

?Administrator类

管理员继承了user类,需要重写user的方法,菜单界面很简单,将功能写上即可。

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.退出系统");
 }

至于功能调用方法则稍复杂了点。我们首先需要为管理员类构造一个构造方法,这样才可以真正有了接口的引用,然后再通过这个引用实例化一个接口数组,并为其写入成员。

public Administrator(){
        super();
        this.iOperations = new IOperation[]{
                new AddOperation(),
                new FindOperation(),
                new DelOperation(),
                new DisplayOperation(),
                new ExitOperation()
        };
    }

这样分行写只是为了好看,也可以一行写。

而要调用这个数组里的方法,我们写了一个Dowork方法,为其传入下标及书架。

调用就很简单了,通过接口数组的下标引用指向了这个类,在通过类下的work方法真正的实现方法。

public void DoWork(int choice, BookList bookList) {
        iOperations[choice].work(bookList);
    }

Normaluser类

普通用户类与管理员类大同小异,只是改了数组成员的顺序。

 public NormalUser(){
        super();
        this.iOperations = new IOperation[]{
                new BorrowOperation(),
                new FindOperation(),
                new ReturnOperation(),
                new DisplayOperation(),
                new ExitOperation()
        };
    }
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.退出系统");
        Scanner scanner = new Scanner(System.in);
        int choice = scanner.nextInt();
        return choice;
    }
 public void DoWork(int choice, BookList bookList) {
        iOperations[choice].work(bookList);
    }

Main包

有了这么多包后,我们需要进入这个系统,那么就需要建立一个新的包了。

Main包下只有一个Test类。而这个类需要对象来使用。

登录系统之前我们需要输入姓名及身份,当是管理员时,需要输入登录密码,而登录密码我们可以设在管理员类里,只要对象输入的密码与管理员密码匹配时,则登录成功,不然则重新输入。

如果登录成功后则给他返回一个user类型的参数,管理员就是new Administrator();,普通用户则是new Normaluser();这其中又发生了向上转型。

public static User Login() {
        System.out.println("请输入你的姓名:");
        Scanner user = new Scanner(System.in);
        String name = user.nextLine();
        System.out.println("请输入你的身份->> 1.管理员    0.用户");
        int choice = user.nextInt();
        if (choice == 1) {
            System.out.println("请输入管理员密码:");
            String on = user.nextLine();
            int in = user.nextInt();
            if (in == Administrator.password) {
                System.out.println("hello " + name + " 欢迎回来!");
                return new Administrator();
            } else {
                System.out.println("密码错误!");
                return null;
            }
        } else {
            System.out.println("hello " + name + " 欢迎回来!");
            return new NormalUser();
        }
    }

我们在test类下建立一个书架类,在用一个user类型的引用接收Login。

在通过一个循环可以调用这些方法,直至退出系统。

BookList bookList = new BookList();
        User user = Login();
while(true) {
            int choice = user.Menu();
            user.DoWork(choice, bookList);
        }

可别小看这几行代码,这几行代码可以说是整个系统的精髓,发生了向上转型、动态绑定,也就是多态。

初步调试

当我们写完了如上这些代码后,我们的登录界面基本就搞定了,面向对象也行的通了。那么我们来进行初步调试系统:

运行结构后为如下界面:

?

?调试结果很成功,那么接下来就是完成这些类里面的方法了。

方法实现

AddOperation(增添)

        System.out.println("请输入书的姓名");
        String name = scanner.nextLine();
        System.out.println("请输入书的作者");
        String author = scanner.nextLine();
        System.out.println("请输入书的类型");
        String type = scanner.nextLine();
        System.out.println("请输入书的价格");
        int price = scanner.nextInt();

这几行没什么难度,但有个注意点,将int类型最后写,否则你会写的很难受,这就是java不好的一个点了,输入输出做的很差劲。

其次因为java的输入输出会将我们的增添方法搞乱,就是当我们连续增加两本书时,第一本输完的price后的那个回车会被我们第二次增加书的name接收,导致第二本书的名字为空。于是我们又设计了一个scanner去将这个回车接收掉,使它不在被我们需要的接收。

String in = scanner.nextLine();

最后在给书架上增添一本书:

        int size = bookList.getusedSize();
        Book book = new Book(name,author,price,type);
        bookList.setBooks(size,book);
        bookList.setusedSize(size+1);

那么增添的逻辑就完全了。

DisplayOperation(打印)

打印有点小难度,主要是数组里的成员怎么打印?

我们发现数组里的成员都是Book类型,那么我们再通过Book创建一个对象指向这个成员,再输出呗!于是我们之前埋下的伏笔就应验了,通过下标访问书架类的书的信息。

for(int i = 0;i<bookList.getusedSize();i++){
            Book book = bookList.getBook(i);
            System.out.println(book);
        }

那么这三行代码想到就不难了吧。

那么打印逻辑也好了。

FindOperation(查找)

打印都完成了,那么查找其实和打印也差不多,都是创建一个Book类对象指向书架上的书。然后将对象指向的书的名称与要查找的书的名称进行比较,逻辑不又通了吗!

int i;
        System.out.println("请输入书名");
        String name = scanner.nextLine();
        for(i = 0;i<bookList.getusedSize();i++){
            Book book = bookList.getBook(i);
            if(book.name.equals(name)){
                System.out.println("查找成功!");
                System.out.println(bookList.getBook(i));
                break;
            }
        }
        if(i>=bookList.getusedSize()){
            System.out.println("查找失败");
        }

BorrowOperation(借书)

借书又和上面的查找有点类似,当我们查到这本书后,直接将书的一个属性是否被借出改为true就行了。

 public void work(BookList bookList) {
        System.out.println("请输入要借的的书名");
        String name = scanner.nextLine();
        int size = bookList.getusedSize();
        for (int i = 0; i < size; i++) {
            Book book = bookList.getBook(i);
            if(book.name.equals(name)){
                book.isBorrow = true;
                System.out.println("借阅成功!");
                return;
            }
        }
        System.out.println("没有你要借的书");
    }

ReturnOperation(还书)

还书直接和借书一模一样,将true改为false即可。

public void work(BookList bookList) {
        System.out.println("请输入要归还的的书名");
        String name = scanner.nextLine();
        int size = bookList.getusedSize();
        for (int i = 0; i < size; i++) {
            Book book = bookList.getBook(i);
            if(book.name.equals(name)){
                book.isBorrow = false;
                System.out.println("归还成功!");
                return;
            }
        }
    }

DelOperation(删除)

删除与上述类似,但略有不同。首先要找出要删除书的下标,与查找类似,接着借用之前BookList的一个方法插入方法setBook():这个方法有两个参数,下标和Book类型,那么在回忆顺序表的删除是怎样删的?后一个的数据等于前一个,进行覆盖删除,那么这个setBook直接将后一个位置的下标和信息赋给前一个,直接就相当于边插入边删除了。逻辑通了,直接上代码:

public void work(BookList bookList) {
        System.out.println("请输入要删除的书名");
        String name = scanner.nextLine();
        int i = 0;
        int size = bookList.getusedSize();
        for (i = 0;i<size;i++){
            Book book = bookList.getBook(i);
            if(book.name.equals(name)){
                break;
            }
        }
        if(i < size ){
            for (int j = i; j < size-1; j++) {
                Book book = bookList.getBook(j+1);
                bookList.setBooks(j,book);
            }
            System.out.println("删除成功!");
            bookList.setBooks(size,null);
            bookList.setusedSize(size-1);
        }else if(i>=size){
            System.out.println("没有你要删除的书");
        }
    }

ExitOperation(退出 )

退出更简单了,直接借用system的方法

public void work(BookList bookList) {
        System.out.println("退出系统!");
        System.exit(0);
    }

运行截图

系统的所有逻辑已经实现了,那么直接看结果:

管理员:

?

?普通用户:

?

完整代码

Book包

package Book;

public class Book {
    public String name;//图书名称
    private String author;//图书作者
    private int price;//图书价格
    private String type;//图书类型
    public boolean isBorrow;//是否借出

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

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

import java.util.Arrays;

public class BookList {
    private Book[] books = new Book[10];
    public static int usedSize;
    public BookList(){
        books[0] = new Book("三国演义","罗贯中",20,"小说");
        books[1] = new Book("水浒传","施耐庵",20,"小说");
        books[2] = new Book("西游记","吴承恩",20,"小说");
        books[3] = new Book("红楼梦","曹雪芹",20,"小说");
        usedSize = 4;
    }
    public Book getBook(int pos){
        return this.books[pos];
    }
    public int getusedSize(){
        return usedSize;
    }
    public void setusedSize(int size){
        usedSize = size;
    }
    public void setBooks(int size,Book book){
        this.books[size] = book;
    }
}

?Operation包

package Operation;

import Book.Book;
import Book.BookList;

import java.util.Scanner;

public class AddOperation implements IOperation{
    public void work(BookList bookList) {
        System.out.println("请输入书的姓名");
        String name = scanner.nextLine();
        System.out.println("请输入书的作者");
        String author = scanner.nextLine();
        System.out.println("请输入书的类型");
        String type = scanner.nextLine();
        System.out.println("请输入书的价格");
        int price = scanner.nextInt();
        String in = scanner.nextLine();
        int size = bookList.getusedSize();
        Book book = new Book(name,author,price,type);
        bookList.setBooks(size,book);
        bookList.setusedSize(size+1);
        System.out.println("增添成功!");
    }
}
package Operation;

import Book.Book;
import Book.BookList;

public class BorrowOperation implements IOperation{
    public void work(BookList bookList) {
        System.out.println("请输入要借的的书名");
        String name = scanner.nextLine();
        int size = bookList.getusedSize();
        for (int i = 0; i < size; i++) {
            Book book = bookList.getBook(i);
            if(book.name.equals(name)){
                book.isBorrow = true;
                System.out.println("借阅成功!");
                return;
            }
        }
        System.out.println("没有你要借的书");
    }
}
package Operation;

import Book.Book;
import Book.BookList;

public class DelOperation implements IOperation{
    public void work(BookList bookList) {
        System.out.println("请输入要删除的书名");
        String name = scanner.nextLine();
        int i = 0;
        int size = bookList.getusedSize();
        for (i = 0;i<size;i++){
            Book book = bookList.getBook(i);
            if(book.name.equals(name)){
                break;
            }
        }
        if(i < size ){
            for (int j = i; j < size-1; j++) {
                Book book = bookList.getBook(j+1);
                bookList.setBooks(j,book);
            }
            System.out.println("删除成功!");
            bookList.setBooks(size,null);
            bookList.setusedSize(size-1);
        }else if(i>=size){
            System.out.println("没有你要删除的书");
        }
    }
}
package Operation;

import Book.Book;
import Book.BookList;

public class DisplayOperation implements IOperation{
    public void work(BookList bookList) {
        System.out.println("打印图书!");
        for(int i = 0;i<bookList.getusedSize();i++){
            Book book = bookList.getBook(i);
            System.out.println(book);
        }
    }
}
package Operation;

import Book.BookList;

public class ExitOperation implements IOperation{
    public void work(BookList bookList) {
        System.out.println("退出系统!");
        System.exit(0);
    }
}
package Operation;

import Book.Book;
import Book.BookList;


public class FindOperation implements IOperation{
    public void work(BookList bookList) {
        int i;
        System.out.println("请输入书名");
        String name = scanner.nextLine();
        for(i = 0;i<bookList.getusedSize();i++){
            Book book = bookList.getBook(i);
            if(book.name.equals(name)){
                System.out.println("查找成功!");
                System.out.println(bookList.getBook(i));
                break;
            }
        }
        if(i>=bookList.getusedSize()){
            System.out.println("查找失败");
        }
    }
}
package Operation;

import Book.Book;
import Book.BookList;

public class ReturnOperation implements IOperation{
    public void work(BookList bookList) {
        System.out.println("请输入要归还的的书名");
        String name = scanner.nextLine();
        int size = bookList.getusedSize();
        for (int i = 0; i < size; i++) {
            Book book = bookList.getBook(i);
            if(book.name.equals(name)){
                book.isBorrow = false;
                System.out.println("归还成功!");
                return;
            }
        }
    }
}
package Operation;

import Book.BookList;

import java.util.Scanner;

public interface IOperation {
    public void work(BookList bookList);
    Scanner scanner = new Scanner(System.in);
}

?user包

package User;

import Book.BookList;
import Operation.*;

import java.util.Scanner;


public class Administrator extends User{
    public static int password = 123456;
    public Administrator(){
        super();
        this.iOperations = new IOperation[]{
                new ExitOperation(),
                new AddOperation(),
                new FindOperation(),
                new DelOperation(),
                new DisplayOperation()
        };
    }

    @Override
    public void DoWork(int choice, BookList bookList) {
        iOperations[choice].work(bookList);
    }

    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.退出系统");
        Scanner scanner = new Scanner(System.in);
        int choice = scanner.nextInt();
        return choice;
    }
}
package User;

import Book.BookList;
import Operation.*;

import java.util.Scanner;

public class NormalUser extends User{
    public NormalUser(){
        super();
        this.iOperations = new IOperation[]{
                new ExitOperation(),
                new BorrowOperation(),
                new FindOperation(),
                new ReturnOperation(),
                new DisplayOperation()
        };
    }

    @Override
    public void DoWork(int choice, BookList bookList) {
        iOperations[choice].work(bookList);
    }
    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.退出系统");
        Scanner scanner = new Scanner(System.in);
        int choice = scanner.nextInt();
        return choice;
    }

}
package User;

import Book.BookList;
import Operation.IOperation;

public abstract class User {
    protected IOperation[] iOperations;
    abstract public int Menu();
    abstract public void DoWork(int choice, BookList bookList);
}

?Main包

package Main;

import Book.BookList;
import User.Administrator;
import User.NormalUser;
import User.User;

import java.util.Scanner;

public class Test {
    public static User Login() {
        System.out.println("请输入你的姓名:");
        Scanner user = new Scanner(System.in);
        String name = user.nextLine();
        System.out.println("请输入你的身份->> 1.管理员    0.用户");
        int choice = user.nextInt();
        if (choice == 1) {
            System.out.println("请输入管理员密码:");
            String on = user.nextLine();
            int in = user.nextInt();
            if (in == Administrator.password) {
                System.out.println("hello " + name + " 欢迎回来!");
                return new Administrator();
            } else {
                System.out.println("密码错误!");
                return null;
            }
        } else {
            System.out.println("hello " + name + " 欢迎回来!");
            return new NormalUser();
        }
    }
    public static void main(String[] args) {
        BookList bookList = new BookList();
        User user = Login();
        while(true) {
            if (user == null) {
                user = Login();
            }else if(user !=null){
                break;
            }
        }
        while(true) {
            int choice = user.Menu();
            user.DoWork(choice, bookList);
        }
    }
}

图书管理系统到此结束了,感兴趣的可以继续研究下去哦。

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-11-22 12:12:16  更:2021-11-22 12:14:49 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 2:43:20-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码