大家好呀,我是小戴
最近大家不是快期末了嘛,有没有泡图书馆呀?今天的学习内容跟图书馆有关,没错,就是图书管理系统,但是目前所学知识水平有限,这是一个很简单的图书系统小练习。不要急,我们的目的是在于如何使用已知学过的知识进行实践,这里将带大家用基本的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类
三、效果展示
示例一
示例二
四、小戴想说的话
图书馆书籍系统的用户分为管理员和普通用户两种,两种用户之间所能实现的功能是不同的。例如我理解想要实现的业务是这样子的:
管理员:
普通用户:
业务实现内容不是重点,大家可以根据自己的喜好去进一步完善~
建立一个叫booktest的项目,在src下新建book、operation、user 三个包,分别将跟书有关的类、跟操作有关的类、跟用户有关的类存储起来。即很好地应用了包的作用。
包的作用:
1.提供了类似于操作系统树状文件夹的组织形式,能分门别类地存储、管理类,易于查找并使用类;
2.解决了类命名时相同的冲突。在Java中,不能在一个同一个包中定义两个类名相同的类,但在不同包中可以;
3.保护类中成员变量和方法。该成员变量和方法的使用范围取决于访问修饰符。
在src下还新建了一个叫Main的类,这个类有一个main方法,并且该类将所有东西进行整合,来实现我们想要完成的功能。
在Java中,main方法是Java应用程序的入口方法。
程序运行时,要执行的第一个方法是main()方法。
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)?"已借出":"未借出") +
'}';
}
}
存放书的地方,是魔幻小书架,书架上的书可不止只有一本哦~
创建一个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;
}
}
跟操作有关的类都在这里啦~
这个接口中的抽象方法都会在后面实现该接口的类中进行重写
package operation;
import book.BookList;
public interface IOperation {
void work(BookList bookList);//抽象方法
}
实现新增图书
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+"》"+"已新增!");
}
}
实现借阅图书
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("抱歉,本书架中没有此书,我们会尽快联系图书管理员新增此书!");
}
}
}
实现删除图书
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
实现显示图书
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
实现退出系统
package operation;
import book.BookList;
public class ExitOperation implements IOperation{
@Override
public void work(BookList bookList) {
System.out.println("退出系统!");
System.exit(0);
}
}
实现查找图书
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("没有你要找的这本书!");
}
}
}
实现归还图书
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
前文提到,用户类型分为管理员和普通用户两种,这两种类型都有相同的name属性,都要有一个功能菜单,功能菜单中有相同的操作方法也有各自才有的特殊操作方法,既然重合度这么高,但又有区别,好喔,这里需要用一个父类更加方便。
User类就是user这个包中的父类,AdminUser和NormalUser是子类。
继承的作用:
通过继承可以快速创建新的类,实现代码的重用,提高程序的可维护性,节省大量创建新类的时间,提高开发效率和开发质量
允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类
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);
}
}
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;
}
}
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;
}
}
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
日常秃发,那就明天早上见咯~要是对你有帮助有启发的话,就浅浅点个赞支持一下吧