用Java实现简单的图书管理系统

news2024/11/24 13:39:32

目录

1.总体框架

2.book包

 Books类

booklist类

3.operation包

IO接口:

addbooks类:

borrowbooks类:

delbooks类:

returnbooks类:

exit类:

4.user包

user类

Adminuser类(难点,有解析)

commonuser类(和上面的一样,不做解析了)

5.Main类

6.操作结果

 7.总结:


 

        此系统主要涉及到了java基础的语法,其中包括类和对象、继承、封装、多态、包、抽象类、接口和数组等,体现了对象之间如何交互。

1.总体框架

简单示意图:

 构成:

 

解释:分为三步操作。

1.书的内容和存取书的书架。

2.用户登录,分为管理员登录和普通用户登录。

3.对书架的相关操作。


2.book包

 Books类

         使用java的封装的特点用私有化的权限定义一些书的属性。这些属性创建后,需要进行初始化,可以使用构造方法,访问这些属性时可以用getter和setter,同时要打印实例化后的对象是,可以重写tostring方法。        

详细见下代码,有详细的注解:

package book;
public class Books {
        //只是写了一些简单的属性,有想法的还可以添加
    private String name;    //书名
    private int price;      //价格
    private String Author;  //作者
    private boolean Beborrow;  //判断是否被借出的标志


//构造函数,初始化成员,没有Beborrow是因为Beborrow未被初始化是默认值为false,
//表示未借出,所以不用写在构造函数中。

    public Books(String name, int price, String author) {
        this.name = name;
        this.price = price;
        this. Author = author;
    }

//下面是成员变量的getter和setter函数,后期访问的时候都会使用到

    public String getName() {
        return name;
    }

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

    public int getPrice() {
        return price;
    }

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

    public String getAuthor() {
        return Author;
    }

    public void setAuthor(String author) {
        Author = author;
    }

    public boolean isBeborrow() {
        return Beborrow;
    }

    public void setBeborrow(boolean beborrow) {
        Beborrow = beborrow;
    }

//重写过tostring方法

    @Override
    public String toString() {
        return "Book{" +
                "name='" + name + '\'' +
                ", price=" + price +
                ", Author='" + Author + '\'' +
                ", Beborrow=" + ((Beborrow==true)?"已被借出":"未被借出")+
           //用三目运算符表示是否被借出
                '}';
    }
}

booklist类

booklist是用来存储书的,相当于一个书架,这一个类包含了 书籍的数量和存储书的数组,该数组的类型是Books类型的,其中使用java的封装的特点,用私有化的权限定义booklist中 booklistsize(书的个数)这个成员。

详细见以下代码,有详细的注解:

package book;

public class Booklist {
    private int booklistsize;  //私有成员,表示书的个数
    Books[] books = new Books[10];  //用来存储书的数组,类型为Books

  //构造函数,初始化成员,同时让数组中先存在这三本书
    public Booklist() {   
        this.booklistsize = booklistsize;
        books[0] = new Books("三国演义",14,"罗贯中");
        books[1] = new Books("西游记",11,"施耐庵");
        books[2] = new Books("红楼梦",17,"曹雪芹");
        this.booklistsize =3;
    }

 // 该函数的作用是能够得到pose位置的书,且返回类型为Books,
//这个getBooks与编译器生成的 不一样,要改变一下,后期的操作会使用到

    public Books getBooks(int pose) {  
        return books[pose];
    }

//该函数的功能是让第pose位置上有上books(意思就是在数组里面的pose位置上添加上books)
//后期会使用到

    public void setBooks(Books books,int pose) {
        this.books[pose] = books;
    }

//因为booklistsize是私有的,体现了封装的特点,要想使用他,必须要调用getBooklistsize
//后期会使用到

    public int getBooklistsize() {
        return booklistsize;
    }

//给booklistsize设置值,要想访问也是要调用set...

    public void setBooklistsize(int booklistsize) {
        this.booklistsize = booklistsize;
    }
}

总结:写这个包里面的类,先写Books类再写booklist类,难点在于对封装成员的访问(使用getter和setter)以及一些函数的重写(后期在写一些类的时候可以一步一步地完善)。


3.operation包

 这个包包括一些功能操作,其中设置一个接口,通过不同的类来实现接口的操作(体现了java实现多继承的特点)。

详细见下代码,有详细的注释:

IO接口:

package opertion;
import book.Booklist;

public interface IO {
        //不同的类来实现这个接口,其中接收的参数为booklist这个对象,用于后期对这个对象的操作
         void work(Booklist booklist);
}

addbooks类:

package opertion;

import book.Booklist;
import book.Books;

import java.awt.print.Book;
import java.util.Scanner;


//写这个操作的思路是先判断这个书架是否还可以添加书籍,可以的话就输入书籍的信息,输入后在判断
 //添加的书籍是否与书架里的书籍重复,
//不重复的话就用booklist.setBooks()函数来添加书籍
//然后booklistsize加一

public class addbooks implements IO{
    @Override
    public void work(Booklist booklist) {
        int szie = booklist.getBooklistsize();
        System.out.println("添加书籍");

//判断是否满

        if(szie==9){                               
            System.out.println("书架已满,无法添加!!");
            return;
        }
        System.out.println("请输入书名:");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();

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

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

        Books book = new Books(name,price,Author);
   
    //判断是否重复

     for(int i = 0;i<szie;i++){
            
                //先用getBooks获取这本书,然后用getname获取这本书的名字

            if(book.getName().equals(booklist.getBooks(i).getName())){
                System.out.println("存在这本书,无法重复添加!!");
                return;
            }
            booklist.setBooks(book,szie);
            booklist.setBooklistsize(szie+1);
        }
        System.out.println("添加成功!!");
    }
}

borrowbooks类:


package opertion;

import book.Booklist;

import java.util.Scanner;

//对于借书,先执行要借书书的名字,判断是否被借阅了以及有没有这本书,如未被借阅,
//使用setBeborrow来改变Beborrow的值

public class borrowbooks implements IO{

    @Override
    public void work(Booklist booklist) {
        System.out.println("借阅书籍!!");
        for (int i = 0; i < booklist.getBooklistsize(); i++) {
            System.out.println(booklist.getBooks(i));
        }
        System.out.println("请输入要借阅书籍的名称:");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();

        int i = 0;
        for(;i<booklist.getBooklistsize();i++){
            if(name.equals(booklist.getBooks(i).getName())){
                if(booklist.getBooks(i).isBeborrow()) {
                    System.out.println("该书籍已经被借阅了!!");
                }
            else {
                    System.out.println("借阅成功!!");

                    //用setBeborrow来改变Beborrow的值
                    booklist.getBooks(i).setBeborrow(true);
                }
            }
        if(i ==booklist.getBooklistsize()){
            System.out.println("没有该本书!!");
        }
        }

    }
}

delbooks类:

package opertion;

import book.Booklist;
import book.Books;

import java.util.Scanner;

//删除书的主要思路是自己所输入的书是否在书架上有,如果没有就删除该书,同时size减一

public class delbooks implements IO{
    @Override
    public void work(Booklist booklist) {
        System.out.println("删除书籍!!");
        System.out.println("请输入要删除的书籍:");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();

        int index = 0;
        int size = booklist.getBooklistsize();
        int i = 0;

       //先找到要删掉的书籍的位置,记下要该书的位置

        for(;i<size-1;i++){
            if(name.equals(booklist.getBooks(i).getName())){
              i = index;
              break;
            }
        }
        if(i == size-1){
            System.out.println("找不到该书籍,无法删除!!");
            return;
        }

        //删除的步骤,后面的往前面覆盖
        for(i = index;i<size-1;i++){
            Books books = booklist.getBooks(i+1);
            booklist.setBooks(books,i);
        }
        
        //书的个数减一
        booklist.setBooklistsize(size-1);
        System.out.println("删除成功!!");
    }
}

returnbooks类:

package opertion;

import book.Booklist;

import java.util.Scanner;

//主要思路和借书一样,代码跟借书的代码差不多,还书判断有没有该本书

public class returnbooks implements IO{
    @Override
    public void work(Booklist booklist) {
        System.out.println("返还书籍!!");
        System.out.println("请输入要归还书籍的名称:");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();

        int i = 0;
        for(;i<booklist.getBooklistsize();i++){
            if(name.equals(booklist.getBooks(i).getName())){
                System.out.println("归还成功!!");
                booklist.getBooks(i).setBeborrow(false);
            }
            if(i ==booklist.getBooklistsize()){
                System.out.println("没有该本书!!");
            }
        }
    }
}

exit类:

package opertion;

import book.Booklist;


//代码很简单,关键是能会运用System.exit(0)这个操作
public class exit implements IO{

    @Override
    public void work(Booklist booklist) {
        System.out.println("退出系统!!");
        System.exit(0);
    }
}

4.user包

user包主要包含了Adminuser,commonuser和User这几个类,其中User为抽象类,Adminuser和commonuser这两个类通过继承来实现menu(菜单)这个抽象方法,以此来展示不同的界面。

详细见下代码,有注释:

user类

package user;

import book.Booklist;

//抽象方法
abstract public class User {

    //包含了私有的成员变量,用户名
    private String name;
    //构造函数
    public User(String name){
        this.name = name;
    }
    //获取名字
    public String getName() {
        return name;
    }
    //抽象方法
    abstract public void menu(Booklist booklist);

}

Adminuser类(难点,有解析)

package user;

import book.Booklist;
import opertion.*;

import java.util.Scanner;

//继承User类

public class Adminuser extends User{
    
    //难点:接口为引用类型,定义和初始化一个接口类型的数组,
   // 且成员为实现接口的类的实例,此处发生了向上转型,下面使用会用到    
   //利用接口类型的数组,巧妙的的解决了实现不同功能的问题
     IO[] io = new IO[]{new exit(),
            new delbooks(),
            new addbooks()};

    //构造函数,先初始化父类的,用super
    public Adminuser(String name){
        super(name);
    }

    public void menu(Booklist booklist) {
            int i;

             //用getname来获取封装后的name,可以用super也可以不用    
            System.out.println(super.getName()+" "+"你好!!"+"欢迎来到管理员界面**********");
            System.out.println("1.删除书籍");
            System.out.println("2.添加书籍");
            System.out.println("0.退出系统");
            System.out.println("请选择:");
            Scanner scanner = new Scanner(System.in);
            int choice = scanner.nextInt();
            for (i = 0;  i< io.length ; i++) {
                if(i == choice){
                    
                    //接上面的难点 ,向上转型,一个对象面对不同对象会有不同的作用
                    io[i].work(booklist);
                }
            }
    }
}

commonuser类(和上面的一样,不做解析了)

package user;

import book.Booklist;
import opertion.*;

import java.util.Scanner;



public class commonuser extends User{
    IO[] io = new IO[]{new exit(),
            new borrowbooks(),
            new findbooks(),
            new returnbooks()
            };
    public commonuser(String name){
        super(name);
    }

    @Override
    public void menu(Booklist booklist) {
        int i;
        System.out.println(super.getName()+" "+"你好!!"+"欢迎来到普通用户界面*********");
            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);
            int choice = scanner.nextInt();
            for (i = 0;  i< io.length; i++) {
                if(i == choice){
                    io[i].work(booklist);
                }
            }
    }
}

5.Main类

Main类用于写主函数用来执行执行登录的操作。

详细代码见下,有解析:

import book.Booklist;
import book.Books;
import user.Adminuser;
import user.User;
import user.commonuser;
import java.util.Scanner;

public class Main {

    //使用静态函数,登录操作,不用实例化直接调用
    //User为返回值类型,
    public static User login(){
        System.out.println("请输入你的姓名:");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();
        System.out.print("请输入你的身份:1.管理员  2.普通用户 --》");
        int num = scanner.nextInt();
        if(num == 1){
        
           //注意,发生向上转型,因为User为返回值类型且为父类
          return new Adminuser(name);
        }
        else {
           return new commonuser(name);
        }
    }
    public static void main(String[] args) {

        //实例化对象booklist,后面的传参都会用到
        Booklist booklist = new Booklist();
        User user = login();
        while(true){
            //体现了多态的特点,面对不同对象会发生不同的状态
            user.menu(booklist);
        }
    }
}

6.操作结果

 

 7.总结:

写这个系统首先要有一个框架,要知道有哪个对象、对象在那个包、怎么合理的利用接口,抽象类等知识。这个系统的难点主要在利用接口类型的数组来实现不同功能以及利用向上转型实现来实现一个对象面向另一个对象所产生的不同的功能;此外还有封装,如怎样访问私有的成员等。详细请看每个代码的注释。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1452655.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

阅读笔记(BMSB 2018)Video Stitching Based on Optical Flow

参考文献 Xie C, Zhang X, Yang H, et al. Video Stitching Based on Optical Flow[C]//2018 IEEE International Symposium on Broadband Multimedia Systems and Broadcasting (BMSB). IEEE, 2018: 1-5. 摘要 视频拼接在计算机视觉中仍然是一个具有挑战性的问题&#xff0…

StarRocks表设计——分区分桶与副本数

目录 一、数据分布 1.1 概述 1.2 数据分布方式 1.2.1 Round-Robin 1.2.2 Range 1.2.3 List 1.2.4 Hash 1.3 StarRocks的数据分布方式 1.3.1 不分区 Hash分桶 1.3.2 Range分区Hash分桶 三、分区 3.1 分区概述 3.2 创建分区 3.2.1 手动创建分区 3.2.2 批量创建分区…

2.1.1 摄像头

摄像头 更多内容&#xff0c;请关注&#xff1a; github&#xff1a;https://github.com/gotonote/Autopilot-Notes.git 摄像头是目前自动驾驶车中应用和研究最广泛的传感器&#xff0c;其采集图像的过程最接近人类视觉系统。基于图像的物体检测和识别技术已经相当成熟&#…

探讨深度学习

深度学习 深度学习概述进展崛起框架 主页传送门&#xff1a;&#x1f4c0; 传送 深度学习 概述 深度学习是机器学习领域的一个分支&#xff0c;它是一种基于人工神经网络的学习方法&#xff0c;旨在让 计算机模仿人类大脑的神经结构和学习方式&#xff0c;从大量数据中学习并…

SIFT 2D/3D检测原理

一、SIFT 2D 二、SIFT 3D SIFT 3D关键点检测以及SAC-IA粗配准-CSDN博客

人脸关键点标注工具

做人脸关键点时&#xff0c;发现网上的标注工具大部分都不好用&#xff0c;把好用的记录一下&#xff0c;给大家推荐一下&#xff1a; 人体关键点ai自动标注工具_哔哩哔哩_bilibili 人脸关键点数据集300w&#xff0c; https://download.csdn.net/download/u011385476/12344931…

mysql 执行update操作 记录未修改

问题 mysql 执行update操作 记录未修改 详细问题 笔者进行SpringBootMybatis项目开发&#xff0c;确认执行update操作 控制台内容如下 Creating a new SqlSession SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession3cbe9459] was not registered for sync…

视频号小店怎么做?新手必须掌握的三点核心步骤,建议收藏

大家好&#xff0c;我是电商花花。 现在短视频的快速发展&#xff0c;电商和直播、短视频不断结合发展&#xff0c;在去年视频号小店也迎来了大爆发&#xff0c;有不少朋友都靠着做视频号小店赚到了自己做电商的第一捅金&#xff0c;直接让很多朋友接触视频号小店&#xff0c;…

SHERlocked93 的 2020 年终总结

在下 SHERlocked93&#xff0c;两年半的南京前端打字员&#xff0c;慕课专栏《JavaScript 设计模式精讲》作者&#xff0c;公众号「前端下午茶」博主。 往年大家都是春节前写年终总结&#xff0c;今年好像都提前到了元旦。但我还是和往年一样&#xff0c;总结发的又晚了一点&am…

1.初识Tauri

文章目录 一、前言二、基本认识三、js与rust通信四、构建应用 一、前言 原文以及后续文章可点击查看&#xff1a;初识Tauri。 Tauri是一款比较新的跨平台桌面框架&#xff0c;也是我目前最喜欢的一个框架&#xff0c;其官网为&#xff1a;Tauri 它的作用其实和Electron很像&…

人工智能学习与实训笔记(十四):Langchain之Agent

人工智能专栏文章汇总&#xff1a;人工智能学习专栏文章汇总-CSDN博客 本篇目录 0、概要 1、Agent整体架构 2、langchain中agent实现 3、Agent业务实现逻辑 0、概要 Agent是干什么的&#xff1f; Agent的核心思想是使用语言模型&#xff08;LLM&#xff09;作为推理的大脑…

VitePress-17- 配置- appearance 的作用详解

作用说明 appearance : 是进行主题模式的配置开关&#xff0c;决定了是否启用深色模式。 可选的配置值&#xff1a; true: 默认配置&#xff0c;可以切换为深色模式&#xff1b; false: 禁用主题切换&#xff0c;只使用默认的配置&#xff1b; dark: 默认使用深色模式&#xff…

【Linux网络编程六】服务器守护进程化Daemon

【Linux网络编程六】服务器守护进程化Daemon 一.背景知识&#xff1a;前台与后台二.相关操作三.Linux的进程间关系四.自成会话五.守护进程四步骤六.服务器守护进程化 一.背景知识&#xff1a;前台与后台 核心知识就是一个用户在启动Linux时&#xff0c;都会给一个session会话&a…

基于Springboot的社区物资交易互助平台(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的社区物资交易互助平台&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系…

leetcode刷题(罗马数字转数字)

1.题目描述 2.解题思路 这时候已经给出了字母对应的数字&#xff0c;我们只需要声明一个字典&#xff0c;将罗马数字和数字之间的对应关系声明即可。其中可能涉及到会出现两个连续的罗马字母代表一个数字&#xff0c;这时候我们需要判断遍历的字符和将要遍历的下一个字符是否存…

pytorch 实现线性回归(深度学习)

一 查看原始函数 初始化 %matplotlib inline import random import torch from d2l import torch as d2l 1.1 生成原始数据 def synthetic_data(w, b, num_examples):x torch.normal(0, 1, (num_examples, len(w)))y torch.matmul(x, w) bprint(x:, x)print(y:, y)y tor…

Mysql第二关之存储引擎

简介 所有关于Mysql数据库优化的介绍仿佛都有存储引擎的身影。本文介绍Mysql常用的有MyISAM存储引擎和Innodb存储引擎&#xff0c;还有常见的索引。 Mysql有两种常见的存储引擎&#xff0c;MyISAM和Innodb&#xff0c;它们各有优劣&#xff0c;经过多次优化和迭代&#xff0c;…

【STM32 CubeMX】SPI HAL库编程

文章目录 前言一、CubeMX配置SPI Flash二、SPI HAL编程2.1 查询方式函数2.2 使用中断方式2.3 DMA方式 总结 前言 STM32 CubeMX 是一款由 STMicroelectronics 提供的图形化配置工具&#xff0c;用于生成 STM32 微控制器的初始化代码和项目框架。在 STM32 开发中&#xff0c;使用…

JDBC查询操作

目录 加载驱动获取连接创建会话发送SQL处理结果关闭资源测试 加载驱动 // 加载驱动Class.forName("com.mysql.cj.jdbc.Driver");获取连接 // 获取连接String url "jdbc:mysql://127.0.0.1:3306/book";String username "root" …

2024全新领域,适合新手发展的渠道,年后不愁资金问题!

我是电商珠珠 如今年已经过完了&#xff0c;不少人还在迷茫自己开工后要做些什么&#xff0c;部分人还在想着去做一些不用吃力就能赚钱的工作&#xff0c;或是一份能兼顾自己日常生活的兼职。 其实&#xff0c;任何赚钱的工作要么动脑要么费力。 费力的工作有很多&#xff0…