【JAVA类】利用接口的多继承实现———图书管理系统【附源码】

引言

      在我们学习了一些java的基础语法之后,需要把这些知识点可以串起来,这里使用一个简单的小项目可以很好的帮助我们牢记这些知识点,今天就带大家学习一个有关java的小项目,很多学校也经常把这个项目作为他们的课程设计——经典的图书管理系统。(ps:不懂的知识可以看往期文章)

       这里必须提前给大家说一下,要想看懂这篇文章,必须得掌握我往期的文章:带你玩转java封装和继承(上),JAVA如何利用接口实现多继承问题。只有看明白这些文章,才能理解本次图书管理系统的代码。链接给大家放这里了~~

http://t.csdnimg.cn/vYS14

http://t.csdnimg.cn/DQynp

图书管理系统界面:

普通用户界面菜单:

1.查找图书

2.新增图书

3.删除图书

4.显示图书

0.退出系统

---------------------------------------------------------------------------------------------------------------------------------

管理员界面菜单:

1.查找图书

2.借阅图书

3.归还图书

0.退出系统

如何搭建基本框架:

首先我们先创建一些项目里一些我们需要用到基础的类来完善我们整个逻辑框架,

 

       首先右击src按步骤创建一个User的包,这个包里首先放的就是我们的的用户类的一些功能和管理员类的一些功能。根据我们上面的需求两者都需要对应的功能菜单。

AdminUser:

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("*****************************");
        System.out.println("请输入你的操作:");
        Scanner scanner=new Scanner(System.in);
        int choice=scanner.nextInt();
        return choice;
    }

NormalUser:

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);
        int choice=scanner.nextInt();
        return choice;
    }

      这里有一个细节,不知道你有没有发现,这两段代码的菜单打印我都使用的是int返回值,这是为什么呢,原因其实仔细思考一下就可以得出答案,由于二者的菜单内容的不同我们需要根据不同的对象,打印不同的菜单,为了区分这两个对象我们根据返回值的不同进行区分。现在看不懂没关系,看到后面的代码你就明白了。

User

      添加这个类的原因是在AdminUser和NormalUser中有许多共性的部分,我们可以把这些部分抽取出来,创建一个新的类User,只需要继承就好了。

我们还需要一个main方法来测试我们代码的正确性,这里创建一个main类:

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

       那么我们有了用户的编写,接下来就得管理图书了,同样的,我们新建一个Book包里面存放有关书的一些类,大体上是book类和bookList类,

book:

public class book {
    private String name;
    private String author;
    private int price;
    private String type;
    private boolean isLend;

    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 getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public boolean isLend() {
        return isLend;
    }

    public void setLend(boolean lend) {
        isLend = lend;
    }

    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 + '\'' +
                (isLend==true ? "已借出"  :  "未借出")+
//                ", isLend=" + isLend +
                '}';
    }

}

 

好了,有了书我们还得有一个书架把书管理起来,这里我们创建一个bookList类:

我们给这里直接放了三本书,并且设置了此时书的个数usedSize,这样操作起来比较方便。

      好了,上面把基础的一些信息打印好了,现在我们需要实现具体的功能了即:查找图书,添加图书...,那么我如何写这些功能呢,由于用户与管理员的不同,直接以类的形式写比较麻烦,我们这里将所有的功能都以接口的形式实现,你需要哪个功能直接引用就好了。

这里我们创建一个IOperation接口里面实现一个抽象方法(work),当每个功能类引用这个接口之后,都可以用这个work方法来对书架上的书进行操作。

package Operation;
import book.BookList;
public interface IOperation {
    void work(BookList bookList);
}

实现业务:

接下来就实现每个功能了:

AddOperation:

public class AddOperation implements IOperation{
    public void work(BookList bookList){
        System.out.println("新增图书.....");
        if (bookList.isFull()) {
            System.out.println("书架满了,不能新增图书了!!!");
            return;
        }
        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入你要新增的书名:");
        String  bookName=scanner.nextLine();

        System.out.println("请输入你要新增的图书的作者:");
        String author=scanner.nextLine();

        System.out.println("请输入你要新增的图书价格:");
        int  price=scanner.nextInt();

        System.out.println("请输入你要新增的图书的类型:");
        String  type=scanner.nextLine();

        book book1=new book(bookName,author,price,type);
        int currentSize= bookList.getUsedSize();

        bookList.setBook(currentSize,book1);

        bookList.setUsedSize(currentSize+1);
        System.out.println("新增图书成功!");
    }
}

       这里提前给大家说一下,为了管理方法方便,我们将所有的功能都引用一个IOperation接口,后面创建一个IOperation数组,你的对象需要什么功能直接方到数组里面就好了,这样就完成了不同对象不同功能的实现。

ShowOperation

思路:给方法的参数传一个书架类型bookList,获取当前的书的个数,利用for循环进行打印,总体来说比较简单。

package Operation;

import book.BookList;
import book.book;

public class ShowOperation implements IOperation{
    public void work(BookList bookList){
        System.out.println("显示图书.....");
        int currentSize= bookList.getUsedSize();
        for (int i=0;i<currentSize;i++) {
            book book1 = bookList.getbooks(i);
            System.out.println(book1);
        }
    }
}

 BorrowOperation

        思路:首先还是得获取一个书架,这样才可以操作数组里的书,然后输入你要查找的书名,获取书架上书的个数,使用for循环找到你要的书,然后我们这里是将你借走后的书的状态改为true代表这本书被借走。(这里说一下寻找书的时候我们使用equls函数,用于判别两个字符串是否相同)。

package Operation;

import book.BookList;

import java.util.Scanner;

import book.book;
public class BorrowOperation implements IOperation{
    public void work(BookList bookList){
        System.out.println("借阅图书.....");
        System.out.println("请输入你要借阅图书的书名:");
        Scanner scanner=new Scanner(System.in);
        String bookName=scanner.nextLine();

        int currentSize= bookList.getUsedSize();
        for(int i=0;i<currentSize;i++){
            book book1=bookList.getbooks(i);
            if(bookName.equals(book1.getName())){
                book1.setLend(true);
                System.out.println("找到你要借阅的图书了");
              System.out.println(book1);
              return;
            }
        }
        System.out.println("没有你要借阅的图书!");

    }
}

DelOperation

这里我们对于删除的理解是在这个书架上找到删除的书的下一本,然后依次往上面覆盖,这样完成的删除操作,同时,别忘了删除后一定要将图书的个数减一哦~

 比如此时我们要删除红楼梦:

package Operation;

import book.BookList;
import book.book;

import java.util.Scanner;

public class DelOperation implements IOperation{
    public void work(BookList bookList){
        System.out.println("删除图书.....");
        System.out.println("请输入你要删除的书名:");
        Scanner scanner=new Scanner(System.in);
        String bookName=scanner.nextLine();

        int currentSize= bookList.getUsedSize();
        int pos=-1;
        for (int i=0;i<currentSize;i++) {
            book book1=bookList.getbooks(i);
            if(book1.getName().equals(bookName)){
                pos=i;
                break;
            }
            if(i>=currentSize){
                System.out.println("没有你要删除的图书!");
                return;
            }
            for (int j=pos;j<currentSize-1;j++) {
                book book2=bookList.getbooks(j+1);
                bookList.setBook(j,book2);
            }
            bookList.setUsedSize(currentSize-1);

            bookList.setBook(currentSize-1,null);
            System.out.println("删除成功!");
        }
    }
}

FindOperation

找书的业务有很多种按书名找,按作者找.....这里我们统一采用按书名去找,那么我们选择一个for循环,找到我们需要的书名,最后打印出来。

package Operation;

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



public class FindOpertion implements IOperation{

    public void work(BookList bookList) {
        System.out.println("查找图书.....");
        System.out.println("请输入你要查找的图书名:");
        Scanner scanner = new Scanner(System.in);
        String bookName = scanner.nextLine();

        int currentSize = bookList.getUsedSize();
        for (int i = 0; i < currentSize; i++) {
            //Book book = bookList[i];
            book book1 = bookList.getbooks(i);
            if (book1.getName().equals(bookName)) {
                System.out.println("找到了这本书:");
                System.out.println(book1);
                return;
            }

        }
        System.out.println("没有你要找的书....");
    }
}

ReturnOperation

其实这里和借书的操作基本一致,都是先找到你要操作的书名,后面将书的状态改为false,代表这本书仍然在书架上。

package Operation;

import book.BookList;
import book.book;

import java.util.Scanner;

public class ReturnOPeration implements IOperation{
    public void work(BookList bookList){
        System.out.println("归还图书.....");
        System.out.println("请输入你要归还图书的书名:");
        Scanner scanner=new Scanner(System.in);
        String bookName=scanner.nextLine();

        int currentSize= bookList.getUsedSize();
        for(int i=0;i<currentSize;i++){
            book book3=bookList.getbooks(i);
            if(bookName.equals(book3.getName())){
                book3.setLend(false);
                return;
            }
        }
        System.out.println("没有你要归还的图书!");
        return;
    }
}

Showoperation

查看图书也是比较简单的,我们使用for循环,将书架上面的书依次打印出来就好了。

package Operation;

import book.BookList;
import book.book;

public class ShowOperation implements IOperation{
    public void work(BookList bookList){
        System.out.println("显示图书.....");
        int currentSize= bookList.getUsedSize();
        for (int i=0;i<currentSize;i++) {
            book book1 = bookList.getbooks(i);
            System.out.println(book1);
        }
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HTML5+CSS3小实例:按钮边框动效

实例:按钮边框动效 技术栈:HTML+CSS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.…

git入门到精通

第3章 Git常用命令 3.1 设置用户签名 3.2 初始化本地库 3.3 查看本地 状态 3.3.1 首次查看&#xff08;工作区没有任何文件&#xff09; 3.3.2 新增文件&#xff08;hello.txt&#xff09; 3.3.3 再次查者&#xff08;检測到末追踪的文件&#xff09; 3.4添加暫存区 3…

System Verilog学习笔记(二十)——TCL基础

TCL简介 TCL&#xff08;Tool Command Language&#xff09;是一种解释执行的脚本语言。它提供了通用的编程能力&#xff1a;支持变量、过程和控制结构&#xff1b;同时TCL还拥有功能强大的固有的核心命令集 由于TCL的解释器是用C/C语言的过程库实现的&#xff0c;因此可以把T…

Unity笔记:C#基础(1)

杂项 虚函数 CSDN - C虚函数详解 cnblog - C#中的虚函数virtual 常量池与new 在C#中&#xff0c;string是不可变的&#xff0c;这意味着对string对象的操作通常会返回一个新的string对象&#xff0c;而不会修改原始的string对象。因此&#xff0c;几乎所有涉及更改string内…

现在可以在Mac桌面上快速打开C知道进行AI提问

看&#xff0c;我的Mac桌面有个C知道组件&#xff0c;点击即可快速打开C知道页面进行提问使用&#xff0c;再也不需要先打开浏览器&#xff0c;再输入csdn.net访问网站&#xff0c;然后点击页面上的C知道入口。 这是如何实现的呢&#xff1f; 首先&#xff0c;我们来做一些准…

微信聊天助手

最近我在负责公司的招聘工作时&#xff0c;真是深感繁琐与困扰。每当新添加求职者的微信&#xff0c;为了了解他们的基本情况以及求职意向&#xff0c;不得不反复地提出一系列固定的问题。比如询问他们的教育背景、工作经验、擅长技能、期望职位等等&#xff0c;这些必不可少却…

东京工业大学最新!一种具有多周期特征描述的精确ORB提取器

作者&#xff1a;小柠檬 | 来源&#xff1a;3DCV 在公众号「3DCV」后台&#xff0c;回复「原论文」可获取论文pdf 添加微信&#xff1a;dddvision&#xff0c;备注&#xff1a;3D高斯&#xff0c;拉你入群。文末附行业细分群 详细内容请关注3DCV 3D视觉精品课程&#xff1a;…

【每日一题】2834. 找出美丽数组的最小和-2024.3.8

题目&#xff1a; 2834. 找出美丽数组的最小和 给你两个正整数&#xff1a;n 和 target 。 如果数组 nums 满足下述条件&#xff0c;则称其为 美丽数组 。 nums.length n.nums 由两两互不相同的正整数组成。在范围 [0, n-1] 内&#xff0c;不存在 两个 不同 下标 i 和 j &…

P5266 【深基17.例6】学籍管理题解

题目 您要设计一个学籍管理系统&#xff0c;最开始学籍数据是空的&#xff0c;然后该系统能够支持下面的操作&#xff08;不超过条&#xff09;&#xff1a; 插入与修改&#xff0c;格式1 NAME SCORE&#xff1a;在系统中插入姓名为NAME(由字母和数字组成不超过20个字符的字符…

博客系统(SSM)

前端页面http://t.csdnimg.cn/zwKyG以上是之前写过的博客前端页面的内容&#xff0c;下面是通过SSM实现的后端内容。 目录 一.准备工作 1.1数据准备 1.2修改配置版本文件 1.3配置数据库 二.项目公共模块 2.1实体类 2.2操作数据库部分 三.功能开发 3.1博客列表 获取博…

【2024】使用Vuetifi搭建vue3+Ts项目,并使用tailwind.css

目录 使用Vuetifi搭建项目使用tailwind.css 只要跟着官方文档来就不会出错。 使用Vuetifi搭建项目 npm create vuetifyyarn create vuetifypnpm create vuetifybun create vuetify在终端运行一个就行&#xff0c;之后就可以选配置了。 使用tailwind.css 先运行&#xff1a; …

最大的单入口空闲区域

最大的单入口空闲区域 问题描述输入输出代码实现 问题描述 找到最大的单入口空闲区域。 空闲区域是由连通的’O’组成的区域&#xff0c;位于边界的’O’可以是入口&#xff0c; 单入口空闲区域即有且只有一个位于边界的’O’作为入口的由连通的’O’组成的区域。 如果两个元素…

救命!RPA隐藏的高效办公秘密居然被我发现了

在这个快节奏的社会&#xff0c;办公效率的重要性日益凸显。如何提升工作效率&#xff0c;成为了许多公司和个人思考的问题。RPA&#xff0c;即机器人流程自动化技术&#xff0c;正以其独特的优势&#xff0c;成为提升办公效率的重要工具。 RPA的核心是模拟人类在计算机系统中进…

哈希表|434.四数相加II

力扣题目链接 struct hashTable {int key;int val;UT_hash_handle hh; };int fourSumCount(int* A, int ASize, int* B, int BSize, int* C, int CSize, int* D, int DSize) {struct hashTable* hashtable NULL;for (int i 0; i < ASize; i) {for (int j 0; j < BSiz…

jdk1.8安装步骤及环境配置

jdk1.8安装步骤及环境配置 1.1&#xff1a;安装步骤 在Oracle官网下载jdk1.8&#xff0c;下载链接 &#xff0c;如果之前没有注册过还需要注册。下载好之后会得到如下的图标&#xff0c; 双击下载好的exe文件&#xff0c;选择更改安装路径&#xff1a;D:\Java\jdk1.8&#xf…

Facebook商城号为什么被封?如何防封?

由于Facebook商城的高利润空间&#xff0c;越来越多的跨境电商商家注意到它的存在。Facebook作为全球最大、用户量最大的社媒平台&#xff0c;同时也孕育了一个巨大的商业生态&#xff0c;包括广告投放、商城交易等。依托背后的大流量&#xff0c;Facebook商城起号较快&#xf…

MyBatis3源码深度解析(九)MyBatis常用工具类(二)ScriptRunnerSqlRunner

文章目录 3.2 使用ScriptRunner执行脚本3.2.1 ScriptRunner工具类简介3.2.2 ScriptRunner工具类示例3.2.3 ScriptRunner工具类源码 3.3 使用SqlRunner操作数据库3.3.1 SqlRunner工具类简介3.3.2 SqlRunner工具类示例3.3.3 SqlRunner工具类源码解读 3.2 使用ScriptRunner执行脚本…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的火焰检测系统(Python+PySide6界面+训练代码)

摘要&#xff1a;本研究详述了一种采用深度学习技术的火焰检测系统&#xff0c;该系统集成了最新的YOLOv8算法&#xff0c;并与YOLOv7、YOLOv6、YOLOv5等早期算法进行了性能评估对比。该系统能够在各种媒介——包括图像、视频文件、实时视频流及批量文件中——准确地识别火焰目…

RESTful API学习

RESTful API REST&#xff08;英文&#xff1a;Representational State Transfer&#xff0c;简称REST&#xff0c;直译过来表现层状态转换&#xff09;是一种软件架构风格、设计风格&#xff0c;而不是标准&#xff0c;只是提供了一组设计原则和约束条件。它主要用于客户端和…

大数据开发-Hive介绍以及安装配置

文章目录 数据库和数据仓库的区别Hive安装配置Hive使用方式Hive日志配置 数据库和数据仓库的区别 数据库&#xff1a;传统的关系型数据库主要应用在基本的事务处理&#xff0c;比如交易&#xff0c;支持增删改查数据仓库&#xff1a;主要做一些复杂的分析操作&#xff0c;侧重…
最新文章