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


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

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

    9a6286691b46496ea8f5bef32f093dc7.jpeg

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

    🌕一、需求分析

    🌕二、具体实现过程

    🥝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类

    🌕 三、效果展示

    🥝示例一

     🥝示例二

    🌕四、小戴想说的话


    🌕一、需求分析

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

    管理员:

    f770a843bb324452a42747c862d1c8c1.png

    普通用户:

    d036f193e4594e83a183296d0e5e3d49.png

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


    🌕二、具体实现过程

    🥝2.1 代码目录

    338813b003554e99b23f8c50755eba5d.png

     建立一个叫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修饰的属性,只能在本类中随意访问,要想在其他类中调用,需要在类中设置赋值或获取的成员方法。

    1. package book;
    2. public class Book {
    3. private String name;//书名
    4. private String author;//作者
    5. private double price;//价格
    6. private String type;//类型
    7. private boolean isBorrowed;//是否被借出
    8. //Getter Setter方法
    9. public String getName() {
    10. return name;
    11. }
    12. public void setName(String name) {
    13. this.name = name;
    14. }
    15. public String getAuthor() {
    16. return author;
    17. }
    18. public void setAuthor(String author) {
    19. this.author = author;
    20. }
    21. public double getPrice() {
    22. return price;
    23. }
    24. public void setPrice(double price) {
    25. this.price = price;
    26. }
    27. public String getType() {
    28. return type;
    29. }
    30. public void setType(String type) {
    31. this.type = type;
    32. }
    33. public boolean isBorrowed() {
    34. return isBorrowed;
    35. }
    36. public void setBorrowed(boolean borrowed) {
    37. isBorrowed = borrowed;
    38. }
    39. //提供一个4个参数的构造方法
    40. public Book(String name, String author, double price, String type) {
    41. this.name = name;
    42. this.author = author;
    43. this.price = price;
    44. this.type = type;
    45. }
    46. @Override
    47. public String toString() {
    48. return "Book{" +
    49. "name='" + name + '\'' +
    50. ", author='" + author + '\'' +
    51. ", price=" + price +
    52. ", type='" + type + '\'' +
    53. ", "+((isBorrowed==true)?"已借出":"未借出") +
    54. '}';
    55. }
    56. }

    🍊2.BookList类

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

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

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

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

    1. package book;
    2. public class BookList {
    3. //书架容量为10本
    4. private Book[] books = new Book[10];
    5. private int usedSize;//实时记录 当前Books这个数组放了多少本书
    6. //构造方法
    7. public BookList(){
    8. books[0] = new Book("把时间当做朋友","李笑来",59,"励志");
    9. books[1] = new Book("云边有个小卖部","张嘉佳",46,"青春、成长");
    10. books[2] = new Book("山茶文具店","小川糸",52,"治愈");
    11. usedSize = 3;
    12. }
    13. /**
    14. *
    15. * @param pos 此时 pos位置一定是合法的
    16. * @return 是你想要借的一本书
    17. */
    18. public Book getBook(int pos){
    19. return books[pos];
    20. }
    21. /**
    22. *
    23. * @param pos 此时 pos位置一定是合法的
    24. * @param book 是你想要放的一本书
    25. */
    26. public void setBooks(int pos,Book book){
    27. books[pos] = book;
    28. }
    29. /**
    30. * 实时获取当前书架上 书的个数
    31. * @return
    32. */
    33. public int getUsedSize(){
    34. return usedSize;
    35. }
    36. /**
    37. * 实时修改当前书架上 书的个数
    38. * @param size
    39. */
    40. public void setUsedSize(int size){
    41. usedSize = size;
    42. }
    43. }

     🥝2.3 operation包

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

    🍊1.接口IOperation

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

    1. package operation;
    2. import book.BookList;
    3. public interface IOperation {
    4. void work(BookList bookList);//抽象方法
    5. }

    🍊2.AddOperation类

    实现新增图书

    1. package operation;
    2. import book.Book;
    3. import book.BookList;
    4. import java.util.Scanner;
    5. public class AddOperation implements IOperation {
    6. @Override
    7. public void work(BookList bookList) {
    8. System.out.println("新增图书!");
    9. Scanner sc = new Scanner(System.in);
    10. System.out.println("请输入图书的名字:");
    11. String name = sc.nextLine();
    12. System.out.println("请输入图书的作者:");
    13. String author = sc.nextLine();
    14. System.out.println("请输入图书的价格:");
    15. double price = sc.nextDouble();
    16. sc.nextLine();//使用nextLine()接收上面键盘输入的'\n'
    17. System.out.println("请输入图书的类型:");
    18. String type = sc.nextLine();
    19. Book book = new Book(name,author,price,type);
    20. int currentSize = bookList.getUsedSize();
    21. bookList.setBooks(currentSize,book);
    22. bookList.setUsedSize(currentSize+1);
    23. System.out.println("《"+name+"》"+"已新增!");
    24. }
    25. }

    🍊3.BorrowOperation类

    实现借阅图书

    1. package operation;
    2. import book.Book;
    3. import book.BookList;
    4. import java.util.Scanner;
    5. public class BorrowOperation implements IOperation{
    6. @Override
    7. public void work(BookList bookList) {
    8. System.out.println("借阅图书!");
    9. Scanner sc = new Scanner(System.in);
    10. System.out.println("请输入你想要借阅书的名字:");
    11. String name = sc.nextLine();
    12. int currentSize = bookList.getUsedSize();
    13. int i=0;
    14. for(i=0;i<currentSize;i++){
    15. Book book = bookList.getBook(i);
    16. if(book.getName().equals(name)){
    17. book.setBorrowed(true);
    18. System.out.println("《"+name+"》借阅成功,祝畅游阅读世界!");
    19. return;
    20. }
    21. }
    22. if(i>=currentSize){
    23. System.out.println("抱歉,本书架中没有此书,我们会尽快联系图书管理员新增此书!");
    24. }
    25. }
    26. }

    🍊4. DelOperation类

    实现删除图书

    1. package operation;
    2. import book.Book;
    3. import book.BookList;
    4. import java.util.Scanner;
    5. public class DelOperation implements IOperation{
    6. @Override
    7. public void work(BookList bookList) {
    8. System.out.println("删除图书!");
    9. Scanner sc = new Scanner(System.in);
    10. System.out.println("请输入你想要删除书的名字:");
    11. String name = sc.nextLine();
    12. int i=0;
    13. int index = 0;
    14. int currentSize = bookList.getUsedSize();
    15. for (i=0;i<currentSize;i++){
    16. Book book = bookList.getBook(i);
    17. if(book.getName().equals(name)){
    18. index = i;
    19. break;
    20. }
    21. }
    22. if(i>=currentSize){
    23. System.out.println("没有你想要删除的这本书");
    24. return;
    25. }
    26. for(i=index;i<currentSize-1;i++){
    27. Book book = bookList.getBook(i+1);
    28. bookList.setBooks(i,book);
    29. }
    30. bookList.setBooks(currentSize,null);
    31. bookList.setUsedSize(currentSize-1);
    32. System.out.println("《"+name+"》"+"已删除");
    33. }
    34. }

    🍊5. DisplayOperation类

    实现显示图书

    1. package operation;
    2. import book.Book;
    3. import book.BookList;
    4. public class DisplayOperation implements IOperation{
    5. @Override
    6. public void work(BookList bookList) {
    7. System.out.println("显示图书!");
    8. int currentSize = bookList.getUsedSize();
    9. for(int i=0;i<currentSize;i++) {
    10. Book book = bookList.getBook(i);
    11. System.out.println(book);
    12. }
    13. }
    14. }

    🍊6. ExitOperation类

    实现退出系统

    1. package operation;
    2. import book.BookList;
    3. public class ExitOperation implements IOperation{
    4. @Override
    5. public void work(BookList bookList) {
    6. System.out.println("退出系统!");
    7. System.exit(0);
    8. }
    9. }

    🍊7.FindOperation类

    实现查找图书

    1. package operation;
    2. import book.Book;
    3. import book.BookList;
    4. import java.util.Scanner;
    5. public class FindOperation implements IOperation{
    6. @Override
    7. public void work(BookList bookList) {
    8. System.out.println("查找图书!");
    9. Scanner sc = new Scanner(System.in);
    10. System.out.println("请输入书名:");
    11. String name = sc.nextLine();
    12. int currentSize = bookList.getUsedSize();
    13. int i=0;
    14. for(i=0;i<currentSize;i++){
    15. Book book = bookList.getBook(i);
    16. if(book.getName().equals(name)){
    17. System.out.println("找到这本书了!");
    18. System.out.println(book);
    19. return;//找到这本书,查找程序提前结束
    20. }
    21. }
    22. if(i>=currentSize) {
    23. //说明没有找到
    24. System.out.println("没有你要找的这本书!");
    25. }
    26. }
    27. }

     🍊8.ReturnOperation类

    实现归还图书

    1. package operation;
    2. import book.Book;
    3. import book.BookList;
    4. import java.util.Scanner;
    5. public class ReturnOperation implements IOperation{
    6. @Override
    7. public void work(BookList bookList) {
    8. System.out.println("归还图书!");
    9. Scanner sc = new Scanner(System.in);
    10. System.out.println("请输入你想要归还书的名字:");
    11. String name = sc.nextLine();
    12. int currentSize = bookList.getUsedSize();
    13. int i=0;
    14. for(i=0;i<currentSize;i++){
    15. Book book = bookList.getBook(i);
    16. if(book.getName().equals(name)){
    17. book.setBorrowed(false);
    18. System.out.println("《"+name+"》"+"归还成功,祝每天都有好心情");
    19. return;
    20. }
    21. }
    22. }
    23. }

    🥝2.4 user包

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

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

    继承的作用:

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

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

    🍊1. User类

    1. package user;
    2. import book.BookList;
    3. import operation.IOperation;
    4. public abstract class User {
    5. protected String name;//用户名
    6. protected IOperation[] iOperations;//此时并没有初始化和分配大小
    7. public User(String name) {
    8. this.name = name;
    9. }
    10. public abstract int menu();
    11. public void doOperation(int choice, BookList bookList){
    12. this.iOperations[choice].work(bookList);
    13. }
    14. }

    🍊2. AdminUser类

    1. package user;
    2. import book.BookList;
    3. import operation.*;
    4. import java.util.Scanner;
    5. public class AdminUser extends User{
    6. public AdminUser(String name) {
    7. super(name);
    8. this.iOperations = new IOperation[]{
    9. new ExitOperation(),
    10. new FindOperation(),
    11. new AddOperation(),
    12. new DelOperation(),
    13. new DisplayOperation()
    14. };
    15. }
    16. public int menu(){
    17. System.out.println("hello "+this.name+" 欢迎来到魔幻小书架!");
    18. System.out.println("1.查找书籍");
    19. System.out.println("2.新增书籍");
    20. System.out.println("3.删除书籍");
    21. System.out.println("4.显示书籍");
    22. System.out.println("0.退出系统");
    23. System.out.println("请输入你的操作:");
    24. Scanner sc = new Scanner(System.in);
    25. int choice = sc.nextInt();
    26. return choice;
    27. }
    28. }

    🍊3. NormalUser类

    1. package user;
    2. import operation.*;
    3. import java.util.Scanner;
    4. public class NormalUser extends User{
    5. public NormalUser(String name) {
    6. super(name);
    7. this.iOperations = new IOperation[]{
    8. new ExitOperation(),
    9. new FindOperation(),
    10. new BorrowOperation(),
    11. new ReturnOperation(),
    12. new DisplayOperation()
    13. };
    14. }
    15. public int menu(){
    16. System.out.println("hello "+this.name+" 欢迎来到魔幻小书架!");
    17. System.out.println("1.查找书籍");
    18. System.out.println("2.借阅书籍");
    19. System.out.println("3.归还书籍");
    20. System.out.println("4.显示书籍");
    21. System.out.println("0.退出系统");
    22. System.out.println("请输入你的操作:");
    23. Scanner sc = new Scanner(System.in);
    24. int choice = sc.nextInt();
    25. return choice;
    26. }
    27. }

    🥝2.4 Main类

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

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

    菜单用循环实现多次打印

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

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

    1. import book.BookList;
    2. import user.AdminUser;
    3. import user.NormalUser;
    4. import user.User;
    5. import java.util.Scanner;
    6. public class Main {
    7. public static User login(){
    8. System.out.println("请输入用户名:");
    9. Scanner sc = new Scanner(System.in);
    10. String name = sc.nextLine();
    11. System.out.println("请选择用户身份:1.管理员 2.普通用户");
    12. int choice = sc.nextInt();
    13. if(choice==1){
    14. return new AdminUser(name);
    15. }else {
    16. return new NormalUser(name);
    17. }
    18. }
    19. public static void main(String[] args) {
    20. //开始整合
    21. BookList bookList = new BookList();//图书准备
    22. //登录
    23. User user = login();
    24. int temp = 0;
    25. do{
    26. int choice = user.menu();//动态绑定
    27. user.doOperation(choice,bookList);
    28. temp = choice;
    29. }while (temp!=0);
    30. }
    31. }

    🌕 三、效果展示

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

    🥝示例一

    d3ce24f2a4d8472c90e58c831bd43c18.png

    3f6b64ac9077453b99596ddde600d74c.png

    b500379522fb48a3a46b96c933ecedb5.png

     🥝示例二

    1c485796923e4e23ac2f43dea7b44346.png

    ccba12456f5646658dcf234a26427a22.png

    a65abe3ec29d4ef59eb13416b97c9cae.png

    7536314328fc418db7fa8ebbbcc5ad22.png


    🌕四、小戴想说的话

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

    咱们一起加油💪💪💪

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

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

    e51b40824ca24fa2868bfb1f51ea1784.jpeg

    日常秃发,那就明天早上见咯~要是对你有帮助有启发的话,就浅浅点个赞支持一下吧🌹🌹

  • 相关阅读:
    第54节—— redux-toolkit中的configureStore
    移动流量的爆发式增长,社交电商如何选择商业模式
    hcie过期了怎么办?
    Maven 常用插件
    Java 线程安全 与 锁
    扑克牌大小(Java语言)
    基于Windows编译someip
    【数据结构与算法】拓扑排序与关键路径
    《深入浅出.NET框架设计与实现》笔记6.5——ASP.NET Core应用程序多种运行模式之五——补充说明Kestrel
    rpiplay实现树莓派AirPlay投屏器
  • 原文地址:https://blog.csdn.net/weixin_60777483/article/details/124912483