Java初学者也可以实现的图书系统小练习

这篇具有很好参考价值的文章主要介绍了Java初学者也可以实现的图书系统小练习。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

       大家好呀,我是小戴🙌🙌🙌

       最近大家不是快期末了嘛,有没有泡图书馆呀?今天的学习内容跟图书馆有关,没错,就是图书管理系统,但是目前所学知识水平有限,这是一个很简单的图书系统小练习。不要急,我们的目的是在于如何使用已知学过的知识进行实践,这里将带大家用基本的Java语法和面向对象的思想来实现这个小程序~冲冲冲🥳🥳🥳 

Java初学者也可以实现的图书系统小练习

下面是我们今天要学习的内容🥳🥳🥳

🌕一、需求分析

🌕二、具体实现过程

🥝2.1 代码目录

🥝2.2 book包

🍊1.Book类

🍊2.BookList类

 🥝2.3 operation包

🍊1.接口IOperation

🍊2.AddOperation类

🍊3.BorrowOperation类

🍊4. DelOperation类

🍊5. DisplayOperation类

🍊6. ExitOperation类

🍊7.FindOperation类

 🍊8.ReturnOperation类

🥝2.4 user包

🍊1. User类

🍊2. AdminUser类

🍊3. NormalUser类

🥝2.4 Main类

🌕 三、效果展示

🥝示例一

 🥝示例二

🌕四、小戴想说的话


🌕一、需求分析

图书馆书籍系统的用户分为管理员普通用户两种,两种用户之间所能实现的功能是不同的。例如我理解想要实现的业务是这样子的:

管理员:

Java初学者也可以实现的图书系统小练习

普通用户:

Java初学者也可以实现的图书系统小练习

 业务实现内容不是重点,大家可以根据自己的喜好去进一步完善~


🌕二、具体实现过程

🥝2.1 代码目录

Java初学者也可以实现的图书系统小练习

 建立一个叫booktest的项目,在src下新建book、operation、user 三个包,分别将跟书有关的类、跟操作有关的类、跟用户有关的类存储起来即很好地应用了包的作用。

包的作用:

1.提供了类似于操作系统树状文件夹的组织形式,能分门别类地存储、管理类,易于查找并使用类;

2.解决了类命名时相同的冲突。在Java中,不能在一个同一个包中定义两个类名相同的类,但在不同包中可以;

3.保护类中成员变量和方法。该成员变量和方法的使用范围取决于访问修饰符。

src下还新建了一个叫Main的类,这个类有一个main方法,并且该类将所有东西进行整合,来实现我们想要完成的功能。 

在Java中,main方法是Java应用程序的入口方法。

程序运行时,要执行的第一个方法是main()方法。  

🥝2.2 book包

🍊1.Book类

Book类用来具体存放图书信息,

包括书名、作者、价格、类型、是否被借出这些基本信息

由于这些属性是用private修饰的,这不就体现了Java语言面向对象封装的特点吗?除了设置带参的构造方法、重写toString()方法,要想在其他类中调用图书属性,需要为每个属性设置Getter和Setter方法

封装:

将一些细节信息隐藏- CSDN搜索起来,对外界不可见

用private修饰的属性,只能在本类中随意访问,要想在其他类中调用,需要在类中设置赋值或获取的成员方法。

package book;

public class Book {
    private String name;//书名
    private String author;//作者
    private double price;//价格
    private String type;//类型
    private boolean isBorrowed;//是否被借出

    //Getter  Setter方法
    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 double getPrice() {
        return price;
    }

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

    public String getType() {
        return type;
    }

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

    public boolean isBorrowed() {
        return isBorrowed;
    }

    public void setBorrowed(boolean borrowed) {
        isBorrowed = borrowed;
    }
    //提供一个4个参数的构造方法
    public Book(String name, String author, double 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 + '\'' +
                ", "+((isBorrowed==true)?"已借出":"未借出") +
                '}';
    }
}

🍊2.BookList类

存放书的地方,是魔幻小书架,书架上的书可不止只有一本哦~

创建一个Book类型的数组,并实时记录当前数组存放了多少本书,

设置一个构造方法,将一些书先存放进去

getBook()和setBook()方法分别相当于从书架上拿书和放书在书架上

package book;

public class BookList {
    //书架容量为10本
    private Book[] books = new Book[10];
    private int usedSize;//实时记录 当前Books这个数组放了多少本书

    //构造方法
    public BookList(){
        books[0] = new Book("把时间当做朋友","李笑来",59,"励志");
        books[1] = new Book("云边有个小卖部","张嘉佳",46,"青春、成长");
        books[2] = new Book("山茶文具店","小川糸",52,"治愈");
        usedSize = 3;
    }

    /**
     *
     * @param pos 此时 pos位置一定是合法的
     * @return 是你想要借的一本书
     */
    public Book getBook(int pos){
        return books[pos];
    }

    /**
     *
     * @param pos 此时 pos位置一定是合法的
     * @param book 是你想要放的一本书
     */
    public void setBooks(int pos,Book book){
        books[pos] = book;
    }

    /**
     * 实时获取当前书架上 书的个数
     * @return
     */
    public int getUsedSize(){
        return usedSize;
    }

    /**
     * 实时修改当前书架上 书的个数
     * @param size
     */
    public void setUsedSize(int size){
        usedSize = size;
    }
}

 🥝2.3 operation包

跟操作有关的类都在这里啦~

🍊1.接口IOperation

这个接口中的抽象方法都会在后面实现该接口的类中进行重写

package operation;

import book.BookList;

public interface IOperation {
    void work(BookList bookList);//抽象方法
}

🍊2.AddOperation类

实现新增图书

package operation;

import book.Book;
import book.BookList;

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("请输入图书的价格:");
        double price = sc.nextDouble();
        sc.nextLine();//使用nextLine()接收上面键盘输入的'\n'

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

        Book book = new Book(name,author,price,type);
        int currentSize = bookList.getUsedSize();
        bookList.setBooks(currentSize,book);

        bookList.setUsedSize(currentSize+1);

        System.out.println("《"+name+"》"+"已新增!");
    }
}

🍊3.BorrowOperation类

实现借阅图书

package operation;

import book.Book;
import book.BookList;

import java.util.Scanner;

public class BorrowOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("借阅图书!");

        Scanner sc = new Scanner(System.in);
        System.out.println("请输入你想要借阅书的名字:");
        String name = sc.nextLine();

        int currentSize = bookList.getUsedSize();

        int i=0;
        for(i=0;i<currentSize;i++){
            Book book = bookList.getBook(i);
            if(book.getName().equals(name)){
                book.setBorrowed(true);
                System.out.println("《"+name+"》借阅成功,祝畅游阅读世界!");
                return;
            }
        }
        if(i>=currentSize){
            System.out.println("抱歉,本书架中没有此书,我们会尽快联系图书管理员新增此书!");
        }
    }
}

🍊4. DelOperation类

实现删除图书

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 sc = new Scanner(System.in);
        System.out.println("请输入你想要删除书的名字:");
        String name = sc.nextLine();

        int i=0;
        int index = 0;
        int currentSize = bookList.getUsedSize();
        for (i=0;i<currentSize;i++){
            Book book = bookList.getBook(i);
            if(book.getName().equals(name)){
                index = i;
                break;
            }
        }
        if(i>=currentSize){
            System.out.println("没有你想要删除的这本书");
            return;
        }

        for(i=index;i<currentSize-1;i++){
            Book book = bookList.getBook(i+1);
            bookList.setBooks(i,book);
        }

        bookList.setBooks(currentSize,null);
        bookList.setUsedSize(currentSize-1);
        System.out.println("《"+name+"》"+"已删除");
    }
}

🍊5. DisplayOperation类

实现显示图书

package operation;

import book.Book;
import book.BookList;

public class DisplayOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("显示图书!");

        int currentSize = bookList.getUsedSize();

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

🍊6. ExitOperation类

实现退出系统

package operation;

import book.BookList;

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

🍊7.FindOperation类

实现查找图书

package operation;

import book.Book;
import book.BookList;

import java.util.Scanner;

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

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

        int currentSize = bookList.getUsedSize();

        int i=0;
        for(i=0;i<currentSize;i++){
            Book book = bookList.getBook(i);
            if(book.getName().equals(name)){
                System.out.println("找到这本书了!");
                System.out.println(book);
                return;//找到这本书,查找程序提前结束
            }
        }
        if(i>=currentSize) {
            //说明没有找到
            System.out.println("没有你要找的这本书!");
        }
    }
}

 🍊8.ReturnOperation类

实现归还图书

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 sc = new Scanner(System.in);
        System.out.println("请输入你想要归还书的名字:");
        String name = sc.nextLine();

        int currentSize = bookList.getUsedSize();

        int i=0;
        for(i=0;i<currentSize;i++){
            Book book = bookList.getBook(i);
            if(book.getName().equals(name)){
                book.setBorrowed(false);
                System.out.println("《"+name+"》"+"归还成功,祝每天都有好心情");
                return;
            }
        }
    }
}

🥝2.4 user包

前文提到,用户类型分为管理员普通用户两种,这两种类型都有相同的name属性,都要有一个功能菜单,功能菜单中有相同的操作方法也有各自才有的特殊操作方法,既然重合度这么高,但又有区别,好喔,这里需要用一个父类更加方便。

User类就是user这个包中的父类,AdminUser和NormalUser是子类。

继承的作用:

通过继承可以快速创建新的类,实现代码的重用,提高程序的可维护性,节省大量创建新类的时间,提高开发效率和开发质量

允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类

🍊1. User类

package user;

import book.BookList;
import operation.IOperation;

public abstract class User {
    protected String name;//用户名
    protected IOperation[] iOperations;//此时并没有初始化和分配大小
    public User(String name) {
        this.name = name;
    }
    public abstract int menu();
    public void doOperation(int choice, BookList bookList){
        this.iOperations[choice].work(bookList);
    }
}

🍊2. AdminUser类

package user;

import book.BookList;
import operation.*;

import java.util.Scanner;

public class AdminUser extends User{

    public AdminUser(String name) {
        super(name);
        this.iOperations = new IOperation[]{
                new ExitOperation(),
                new FindOperation(),
                new AddOperation(),
                new DelOperation(),
                new DisplayOperation()
        };
    }
    public int menu(){
        System.out.println("hello "+this.name+" 欢迎来到魔幻小书架!");
        System.out.println("1.查找书籍");
        System.out.println("2.新增书籍");
        System.out.println("3.删除书籍");
        System.out.println("4.显示书籍");
        System.out.println("0.退出系统");
        System.out.println("请输入你的操作:");
        Scanner sc = new Scanner(System.in);
        int choice = sc.nextInt();
        return choice;
    }
}

🍊3. NormalUser类

package user;

import operation.*;

import java.util.Scanner;

public class NormalUser extends User{

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

    }
    public int menu(){
        System.out.println("hello "+this.name+" 欢迎来到魔幻小书架!");
        System.out.println("1.查找书籍");
        System.out.println("2.借阅书籍");
        System.out.println("3.归还书籍");
        System.out.println("4.显示书籍");
        System.out.println("0.退出系统");
        System.out.println("请输入你的操作:");
        Scanner sc = new Scanner(System.in);
        int choice = sc.nextInt();
        return choice;
    }
}

🥝2.4 Main类

Main类用于将这些功能属性整合起来,也是整个小项目的执行入口,

用户登录之后,可选择自己的身份——(管理员/普通用户)

菜单用循环实现多次打印

login()函数将AdminUser或者NormalUser向上转型为父类User

在main()方法中,用一个父类user调用menu()方法,根据user是管理员还是普通用户,向下转型调用各自不同的菜单

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

import java.util.Scanner;

public class Main {

    public static User login(){
        System.out.println("请输入用户名:");
        Scanner sc = new Scanner(System.in);
        String name = sc.nextLine();
        System.out.println("请选择用户身份:1.管理员 2.普通用户");

        int choice = sc.nextInt();
        if(choice==1){
           return new AdminUser(name);
        }else {
            return new NormalUser(name);
        }

    }
    public static void main(String[] args) {
        //开始整合
        BookList bookList = new BookList();//图书准备
        //登录
        User user = login();
        int temp = 0;
        do{
        int choice = user.menu();//动态绑定
        user.doOperation(choice,bookList);
        temp = choice;
        }while (temp!=0);
    }
}

🌕 三、效果展示

psss:因操作过长,长截图无法截全,为了保证展示完整性,特意用几张小图截的,如果给您带来阅读不适,请见谅~给你花花🌹🌹

🥝示例一

Java初学者也可以实现的图书系统小练习

Java初学者也可以实现的图书系统小练习

Java初学者也可以实现的图书系统小练习

 🥝示例二

Java初学者也可以实现的图书系统小练习

Java初学者也可以实现的图书系统小练习

Java初学者也可以实现的图书系统小练习

Java初学者也可以实现的图书系统小练习


🌕四、小戴想说的话

学习一个知识可能很简单,但将学到的知识进行整合应用绝对比学那个知识要难,但如果相信自己可以做到,那绝对可以学下去保持良好的心态是提高学习效率的利器

咱们一起加油💪💪💪

目前,小戴备考四级和期末考中,有什么学习心理各方面问题欢迎uu们私信后台踢我,会的我会用心解答~

晚安,唔西迪西!——写于2022/5/23早1:10

Java初学者也可以实现的图书系统小练习

日常秃发,那就明天早上见咯~要是对你有帮助有启发的话,就浅浅点个赞支持一下吧🌹🌹文章来源地址https://www.toymoban.com/news/detail-407381.html

到了这里,关于Java初学者也可以实现的图书系统小练习的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 从初学者到专家:Java反射的完整指南

    Java 的反射( reflection )机制是在 运行 状态中,对于任意一个类,都能够知道这个类的 所有属性和方法 ;对于任意一个对象,都能够调用它的任意方法和属性 ,既然能拿到那么,我们就可以修改部分类型信息;这种动态获取信 息以及动态调用对象方法的功能称为java语言的

    2024年03月26日
    浏览(41)
  • Linux-初学者系列——篇幅4_系统运行相关命令

    上篇: Linux-初学者系列——篇幅3_操作界面获取帮助 一、关机重启注销命令 1、重启或者关机命令-shutdown 关闭和重启Linux系统的命令shutdown,系统在关闭重启之前会通知所有的登录用户,系统即将关闭重启时所有的新用户都不可以登录 语法格式: 常用参数: 序号 参数选项 功

    2024年02月05日
    浏览(38)
  • 编程中的信号处理和系统 - 初学者指南

    信号处理是工程和编程的一个重要领域。 基本上,它允许工程师和程序员改进数据,以便人们可以更有效地使用它。 例如,由于信号处理,电话中的大部分背景噪音都被消除了。这样,通话的另一端就只能听到您的声音。 其他例子有: 音频和音乐软件 图像视频处理软件 医

    2024年02月09日
    浏览(27)
  • 【STM32】初学者必读STM32时钟系统详解

    目录 1 前言 2 时钟系统介绍 3 时钟源 3.1 系统时钟源 3.2 次级时钟源 3.3 时钟源特点 4 时钟 4.1 AHB总线时钟 4.2 APB1总线时钟 4.3 APB2总线时钟 5 时钟控制器 6 CubeMx配置时钟系统 6.1 选择单片机型号 6.2 选择时钟源 6.3 配置系统时钟 6.4 时钟系统初始化代码 7 结论         STM32的时

    2024年02月08日
    浏览(37)
  • STM32初学者入门FreeRTOS操作系统,多任务实时系统

            FreeRTOS(Free Real-Time Operating System)是一个开源的嵌入式实时操作系统,它专门设计用于在资源有限的嵌入式系统中运行。FreeRTOS提供了一些用于任务管理、调度、同步和通信的功能,使开发者能够轻松地创建可靠的嵌入式系统。 以下是FreeRTOS的一些特点和功能: 轻量

    2024年02月11日
    浏览(28)
  • 从初学者到专家:Java 数据类型和变量的完整指南

    目录 一、字面常量 1.1什么常量? 1.2常见的六种常量类型 二、数据类型 2.1什么是数据类型? 2.2基本数据类型: 2.3引用数据类型 三、变量 3.1什么是变量? 3.2变量的命名规则 3.3变量的作用域 3.4变量的被final修饰 四.类型转换 4.1什么是类型转换? 4.2自动类型转换 4.3强制类型转

    2024年02月14日
    浏览(27)
  • 从初学者到专家:Java的Lambda表达式完整指南

    概念: Lambda表达式是Java 8引入的一项重要功能,它允许我们以更简洁和灵活的方式编写代码。 可以把Lambda表达式看作是一种更方便的匿名函数,可以像数据一样传递和使用。 使用Lambda表达式可以让我们写出更短、更易读的代码。它可以替代传统的匿名类,使代码更加简洁。

    2024年03月25日
    浏览(41)
  • 初学者思路-实现独立按键检测(以STM32为例)

            本文以初学者角度切入,详细剖析按键检测原理,实现按键短按、短按抬起、首次长按、持续长按次数、长按抬起功能; 目录 前言 波形图分析 抖动原因 为什么要消抖 如何消抖 原理图分析 程序设计思路 代码实践 按键配置 按键检测 实验结果 留下反思         如

    2024年01月16日
    浏览(43)
  • AIGC:初学者使用“C知道”实现AI人脸识别

    从前,我们依靠各种搜索引擎来获取内容,但随着各类数据在互联网世界的爆炸式增长,加上深度学习模型的广泛发展,我们现在不仅可以实现“遇事不决问AI”,还可以利用AI进行创作,关于人工智能生成内容(AIGC)的讨论和应用也是随处可见。 本文记录一下人工智能初学

    2024年02月11日
    浏览(31)
  • 【C语言】代码实现 扫雷 游戏及进阶功能(初学者详解)

    扫雷游戏的起源可以追溯到20世纪60年代,当时这款游戏是由IBM开发出来的。在80年代初,微软公司将其收归旗下,并将其作为Windows操作系统自带的一款游戏。自此以后,扫雷成为了Windows用户最喜欢的休闲游戏之一,也受到了全球范围内的玩家喜爱。 现在,我们使用C语言,来

    2024年01月20日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包