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类
🌕 三、效果展示
🥝示例一
🥝示例二
🌕四、小戴想说的话
🌕一、需求分析
图书馆书籍系统的用户分为管理员和普通用户两种,两种用户之间所能实现的功能是不同的。例如我理解想要实现的业务是这样子的:
管理员:
普通用户:
业务实现内容不是重点,大家可以根据自己的喜好去进一步完善~
🌕二、具体实现过程
🥝2.1 代码目录
建立一个叫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){ 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){ 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) { //说明没有找到 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:因操作过长,长截图无法截全,为了保证展示完整性,特意用几张小图截的,如果给您带来阅读不适,请见谅~给你花花🌹🌹
🥝示例一
🥝示例二
🌕四、小戴想说的话
学习一个知识可能很简单,但将学到的知识进行整合应用绝对比学那个知识要难,但如果相信自己可以做到,那绝对可以学下去,保持良好的心态是提高学习效率的利器。
咱们一起加油💪💪💪
目前,小戴备考四级和期末考中,有什么学习心理各方面问题欢迎uu们私信后台踢我,会的我会用心解答~
晚安,唔西迪西!——写于2022/5/23早1:10
日常秃发,那就明天早上见咯~要是对你有帮助有启发的话,就浅浅点个赞支持一下吧🌹🌹