1.设计思路

  1. 包分类:书籍book,操作operation[包含管理员和普通用户的操作集合],用户类User,主函数入口TestMain.java
  2. 分析:

书籍book包

Book类 创建的Book类中包含了书籍的名字,作者,价格,类型和借阅状态。构造方法会重写,设置初始化的时候书籍初始化信息
BookList类 成员变量中usedSize确定图书存储量;引用Book.java的Book类,创建一个Book类型的数组,用于存储书籍

操作operation

Add类 导入Book和BookList类,Scanner输入确定好书记基础信息后利用Book类new一个新的并且自带的Scanner属性的book对象,通过bookList.getUsedSize来获取已经存储的书籍数量后再利用bookList.setBooke进行“尾插”存放图书,并且插入成功后要设置setUsedSize的存储+1
Borrow类 通过Scaner获取要借阅书籍的属性,再利用for循环遍历,如果找到书籍。就把借阅状态isBorrowed改为true,表示被借阅
Del类 Scaner获取书籍属性,for循环找到对应属性后退出,if判断退出for循环后的i值是否和已存书籍数量相等,如果相等,表示遍历所有书籍依旧没有找到对应属性而不是break退出循环;找到对应属性后就需要像顺序表一样删除,后边的往前覆盖。
Display类 for循环,利用Book book = bookList.getBook(i)来获取所有书籍,然后输出book值即可输出一个book对象的所有信息
Exit类 利用System.exit(退出码:-1,1,0)即可退出程序
Find类 Scanner获取书籍属性,for循环匹配书籍名称是否相等即可。如果没有找到就在循环之外输出提示
Return类 Scanner获取书籍属性,for循环将匹配到的书的isBorrowed的true状态改为false状态;跳出循环后依旧没有找到就输出提示
IOperation接口 设计一个基础的work抽象方法,供给其operation包中所有类的使用

用户user包

User类 所有用户的基础类,拥有用户名,操作的集合,构造方法,不同类用户的打印窗口和对应的执行操作调用
Admin 管理员。继承User类, 初始化操作集合,打印的用户界面
NormalUser 普通用户。除了用户界面不一样之外,其余都一样
主函数入口TestMain 将BookList,Admin,User,NormalUser全部导入Scanner获取用户输入,区分用户是管理员还是普通用户并返回对应的操作权限界面;BookList booList初始换存储的书籍通过login的返回值确定登录的用户是不是管理员menu的返回值来执行对应权限操作
1.Book类
package day15Clonable及图书代码练习.book;public class Book {private String name;private String author;private int price;private String type;private boolean isBorrowed;public Book(String name, String author, int price, String type) {this.name = name;this.author = author;this.price = price;this.type = type;}@Overridepublic String toString() {return "book{" +"name='" + name + '\'' +", price=" + price +", type='" + type + '\'' +", isBorrowed=" + isBorrowed +'}';}public String getName() {return name;}public void setName(String name) {this.name = name;}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 isBorrowed() {return isBorrowed;}public void setBorrowed(boolean borrowed) {isBorrowed = borrowed;}
}
2.BookList类
package day15Clonable及图书代码练习.book;public class BookList {private Book[] books = new Book[100];private int usedSize = 0;public BookList() {books[0] = new Book("穷查理宝典", "彼得.考夫曼", 168, "理财");books[1] = new Book("塑造世界经济的五十项伟大发明", "蒂姆.哈福德", 58, "兴趣");books[2] = new Book("影响力", "罗伯特", 45, "心理学");this.usedSize = 3;}public void setBooks(int pos, Book book) {this.books[pos] = book;}public Book getBook(int pos) {return this.books[pos];}public int getUsedSize() {return usedSize;}public void setUsedSize(int usedSize) {this.usedSize = usedSize;}
}
3.操作集合
  1. Add类
package day15Clonable及图书代码练习.operation;import day15Clonable及图书代码练习.book.Book;
import day15Clonable及图书代码练习.book.BookList;import java.util.Scanner;public class AddOperation implements IOperation {@Overridepublic void work(BookList bookList) {System.out.println("新增图书");Scanner scanner = new Scanner(System.in);System.out.print("清输入图书的名字: ");String name = scanner.nextLine();System.out.print("请输入图书的作者: ");String author = scanner.nextLine();System.out.print("请输入图书的价格: ");int price = scanner.nextInt();System.out.print("请输入图书的类型: ");String type = scanner.next();Book book = new Book(name, author, price, type);int curSize = bookList.getUsedSize();bookList.setBooks(curSize, book);bookList.setUsedSize(curSize+1);System.out.println("新增成功");}
}
  1. Borrow类
package day15Clonable及图书代码练习.operation;import day15Clonable及图书代码练习.book.Book;
import day15Clonable及图书代码练习.book.BookList;import java.util.Scanner;public class BorrowOperation implements IOperation {@Overridepublic void work(BookList bookList) {System.out.println("借阅图书");Scanner scanner = new Scanner(System.in);System.out.print("清输入图书的名字: ");String name = scanner.nextLine();for (int i = 0; i < bookList.getUsedSize(); i++) {Book book = bookList.getBook(i);if (book.getName().equals(name)) {// 可借阅book.setBorrowed(true);System.out.println("借阅成功");return;}}System.out.println("没有你要借阅的书");}
}
  1. Del类
package day15Clonable及图书代码练习.operation;import day15Clonable及图书代码练习.book.Book;
import day15Clonable及图书代码练习.book.BookList;import java.util.Scanner;public class DelOperation implements IOperation {@Overridepublic void work(BookList bookList) {System.out.println("删除图书");Scanner scanner = new Scanner(System.in);System.out.print("清输入删除图书的名字: ");String name = scanner.nextLine();int i = 0;for (; i < bookList.getUsedSize(); i++) {Book book = bookList.getBook(i);if (book.getName().equals(name)) {break;}}if (i == bookList.getUsedSize()) {System.out.println("没有这本书");return;}// 删除,顺序表一样:要想着删除最后的结尾,我们不能用cur.next来循环判断而是用cur来判断。这样才不会再倒数二哥结点停下for (int pos = i; pos < bookList.getUsedSize()-1;++pos) {//            bookList[pos] = bookList[pos+1]: error/*Book book = bookList.getBook(pos+1);bookList.setBooks(pos, book);代码较多,下边的代码更精简*/bookList.setBooks(pos, bookList.getBook(pos+1));}bookList.setUsedSize(bookList.getUsedSize()-1);}
}
  1. Display类
package day15Clonable及图书代码练习.operation;import day15Clonable及图书代码练习.book.Book;
import day15Clonable及图书代码练习.book.BookList;public class DisplayOperation implements IOperation {@Overridepublic void work(BookList bookList) {System.out.println("显示图书图书");for (int i = 0; i < bookList.getUsedSize(); i++) {Book book = bookList.getBook(i);System.out.println(book);}}
}
  1. Exit类
package day15Clonable及图书代码练习.operation;import day15Clonable及图书代码练习.book.BookList;public class ExitOperation implements IOperation {@Overridepublic void work(BookList bookList) {System.out.println("退出系统");System.exit(1);}
}
  1. Return类
package day15Clonable及图书代码练习.operation;import day15Clonable及图书代码练习.book.Book;
import day15Clonable及图书代码练习.book.BookList;import java.util.Scanner;public class ReturnOperation implements IOperation {@Overridepublic void work(BookList bookList) {System.out.println("归还图书");Scanner scanner = new Scanner(System.in);System.out.print("清输入归还图书的名字: ");String name = scanner.nextLine();for (int i = 0; i < bookList.getUsedSize(); i++) {Book book = bookList.getBook(i);if (book.getName().equals(name)) {book.setBorrowed(false);System.out.println("归还成功");return;}}System.out.println("没有你要归还的图书");}
}
  1. IOperation接口
package day15Clonable及图书代码练习.operation;import day15Clonable及图书代码练习.book.BookList;public interface IOperation {void work (BookList bookList);
}
4.用户
  1. User类
package day15Clonable及图书代码练习.user;import day15Clonable及图书代码练习.book.BookList;
import day15Clonable及图书代码练习.operation.IOperation;public abstract class User {public String name;protected IOperation[] operations;public User(String name) {this.name = name;}public abstract int menu();public void doOperation(BookList bookList, int choice) {this.operations[choice].work(bookList);}
}
  1. Admin类
package day15Clonable及图书代码练习.user;import day15Clonable及图书代码练习.operation.*;import java.util.Scanner;public class Admin extends User {public Admin(String name) {super(name);this.operations = new IOperation[]{new ExitOperation(),new FindOperation(),new AddOperation(),new DelOperation(),new DisplayOperation(),};}@Overridepublic int menu() {System.out.println("♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣");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 scanner = new Scanner(System.in);int choice = scanner.nextInt();return choice;}
}
  1. Normal类
package day15Clonable及图书代码练习.user;import day15Clonable及图书代码练习.operation.*;import java.util.Scanner;public class NormalUser extends User {public NormalUser(String name) {super(name);this.operations = new IOperation[] {new ExitOperation(),new FindOperation(),new BorrowOperation(),new ReturnOperation(),};}@Overridepublic int menu() {System.out.println("==========================================");System.out.println("hello " + this.name + " 欢迎来到图书管理系统");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;}
}
5.主函数入口TestMain类
package day15Clonable及图书代码练习;import day15Clonable及图书代码练习.book.BookList;
import day15Clonable及图书代码练习.user.Admin;
import day15Clonable及图书代码练习.user.NormalUser;
import day15Clonable及图书代码练习.user.User;import java.util.Scanner;public class TestMain {public static User login() {Scanner scanner = new Scanner(System.in);System.out.print("请输入姓名: ");String name = scanner.nextLine();System.out.print("请输入你的身份[1-->管理员 2-->普通用户]: ");int choice = scanner.nextInt();if (choice == 1) {return new Admin(name);} else {return new NormalUser(name);}}public static void main(String[] args) {//1.准备书籍BookList bookList = new BookList();//2.登录User user = login();while (true) {//选择是几,就可以对应到哪个方法user.doOperation(bookList, user.menu());}}
}
6.Admin效果图





7.NormalUser效果图



注意查看用户的介于状态isBorrowed的true和false变化

2.结尾小彩蛋:Cloneable

提起克隆,深浅拷贝会被多次提起。如果修改克隆副本会影响数据源就是浅拷贝反知则是深拷贝;对于数组中是简单类型元素是深拷贝,引用类型是浅拷贝

int[] array1 = {1, 2, 3, 4, 5, 6};
int[] array2 = array1.clone();
array2[0] = 99;
System.out.println(Arrays.toString(array1));
System.out.println(Arrays.toString(array2));输出结果:
[1, 2, 3, 4, 5, 6]
[99, 2, 3, 4, 5, 6]
因为数组中是简单的int类型,因此是深拷贝并不因为数组是引用类型就是浅拷贝
import java.util.Arrays;
/*** class Person类属于自定义类,没有继承Object,所以没有clone()方法* <p>* 1.Ctrl+左键点击 Cloneable-->空接口: 也叫标记接口,只要一个类实现了这个接口,那么就标记这个类是可以进行clone的* 2.重写clone方法[Wind: Alt+Ins/MacOS: option+Enter 后-->选择clone()]* 3.解决person.cloe()依旧报错问题: 鼠标颠倒person.clone()然后Alt+Enter选怎Add Exceptionxxx添加异常到方法区* 4.我们发现clone()方法返回值是Object,所以我们需要强制类型转*/
class Money implements Cloneable {double money = 12.5;@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}
}class Person implements Cloneable {public int age;Money m = new Money();@Overrideprotected Object clone() throws CloneNotSupportedException {//        return super.clone();//1.克隆personPerson p1 = (Person) super.clone();//2.克隆当前的Money对象p1.m = (Money) this.m.clone();return p1;}
}Person person1 = new Person();
Person person2 = (Person) person1.clone();
person2.m.money = 99.9;
System.out.println(person1.m.money);
System.out.println(person2.m.money);
输出结果:
12.5
99.9
说明我们的引用类型已经成功深拷贝

Java图书管理系统简化版期末考核作业相关推荐

  1. Java图书管理系统练习程序(四)

    2019独角兽企业重金招聘Python工程师标准>>> Java图书管理系统练习程序(四) 本部分主要介绍List的基本操作与Java中泛型的使用. 一.Java中泛型的使用 泛型, ...

  2. java图书管理系统技术难度_Java图书管理系统练习程序(一)

    Java图书管理系统练习程序 第一部分 该部分主要实现命令行方式的界面与无数据库访问的练习,通过本练习.主要掌握Java的基础知识与面向对象程序设计思想.面向接口编程技术的知识与运用. 一.练习程序功 ...

  3. 视频教程-手把手实现Java图书管理系统(附源码)-Java

    手把手实现Java图书管理系统(附源码) 南京大学软件工程硕士,曾就职于擎天科技.中软国际.华为等上市公司,擅长Java开发.Web前端.Python爬虫.大数据等领域技术. 全栈工程师,从事软件开发 ...

  4. [附源码]计算机毕业设计JAVA图书管理系统

    [附源码]计算机毕业设计JAVA图书管理系统 项目运行 环境配置: Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(Intell ...

  5. java图书管理系统源码

    java图书管理系统源码 系统主要功能 读者:登录注册,借阅还书,查询书籍,查看当前借阅信息以及历史借阅信息,查看.查询读者借阅榜以及借阅书籍借阅榜,问题反馈以及查询反馈结果等功能. 管理员:对图书. ...

  6. 东北大学java期末试卷,[东北大学]18年6月考试《Java语言程序设计I》考核作业(答案)...

    Java语言程序设计 I    试 卷(作业考核 线上)  B  卷 学习中心:            院校学号:             姓名 (共        页) 总分 题号 一 二 三 四 ...

  7. 我的第一个项目----Java图书管理系统

    项目参考自:http://www.java1234.com/a/yuanchuang/swing2/ 项目视频及代码下载地址:链接:http://pan.baidu.com/s/1pLpQw2J 密码 ...

  8. MySQL+Java 图书管理系统

    一.设计目的 通过对图书管理系统的系统分析.系统设计.编码和调试等工作的实践,熟悉管理信息系统的开发过程.设计方法及相关编程技术,熟练掌握数据库设计的基本理论及方法. 二.设计任务 要求完成一个具有一 ...

  9. java图书管理系统目的_java_图书管理系统java版,本文的目的就是通过图书管理 - phpStudy...

    图书管理系统java版 本文的目的就是通过图书管理系统掌握数据库编程技术,能正确连接数据库,能对数据库中信息进行查询.插入.删除.修改. 内容:在数据库中创建一张书目信息表,包括书名.作者.出版社.出 ...

最新文章

  1. 工业相机帧率与曝光时间的关系
  2. 解读:为何在今年的淘宝造物节上!AR直播火到如此程度?
  3. 二分图最大匹配(匈牙利算法) POJ 3020 Antenna Placement
  4. 极光推送收不到推送消息
  5. spring中的单例工厂SingletonBeanRegistry设计与实现
  6. mysql 游标的使用
  7. Spring Boot 专栏全栈开发实战
  8. WeChat.app debuger
  9. 浅谈MySql的存储引擎(表类型)
  10. Linux内存管理(一)——从硬件角度看内存管理
  11. HAProxy+apache实现web服务动静分离
  12. 九大背包问题专题--二维费用的背包问题
  13. HTTP协议基本原理简介(二)
  14. 无约束最优化(一) 最速下降法、Newton法、修正Newton法
  15. C4D 展UV的那些坑
  16. 神经网络模型如何应用到实际 - 神经网络模型数学建模案例
  17. 猫咪藏在哪个房间python作业_猫咪生气躲进房间,众人找到后,猫咪一脸疑问:听说你们在找我...
  18. c语言 库函数理解,C语言库函数理解
  19. 湍流系数计算器_FLUENT湍流强度计算
  20. 高效云盘、SSD 云盘和普通云盘的区别和应用场景

热门文章

  1. Android动画弹窗
  2. 高通全新骁龙7c/8c/8cx计算平台介绍
  3. 魔兽世界模拟器技术之mangos gm命令分类别分组最详细攻略
  4. Base64与Bitmap转换
  5. 卧槽!微信可以改彩色昵称了!!!
  6. Android 入个门
  7. background-position什么意思
  8. Hug pylons, not trees 拥抱电网,而非树木 | 经济学人20230408版双语精翻
  9. 【Linux云计算架构:第三阶段-Linux高级运维架构】第13章——redis
  10. ECharts(中国地图篇)的使用