Java手寫(xiě)圖書(shū)管理基本功能附代碼
Java中的最主要的語(yǔ)法之前基本都介紹完畢,本篇將使用之前的內(nèi)容來(lái)寫(xiě)一個(gè)簡(jiǎn)單的圖書(shū)管理系統(tǒng),中間會(huì)展示部分代碼來(lái)講解,源碼地址在這??項(xiàng)目: 個(gè)人練習(xí)的項(xiàng)目 - Gitee.com
首先還是來(lái)看看運(yùn)行的效果


我們來(lái)分析一下:
Java中是通過(guò)對(duì)象之間的交互來(lái)解決事情的,所以我們來(lái)看看有哪些對(duì)象
首先顯而易見(jiàn)的兩個(gè)對(duì)象:用戶(hù)和書(shū),所以創(chuàng)建兩個(gè)包book和user
通過(guò)上圖可以看到:不同用戶(hù)之間有相同的操作,也有不同的操作,所以不妨將所有的操作都放在一個(gè)包中,需要什么操作直接調(diào)用即可,我將這個(gè)包命名為operate
1.book包
首先包中肯定需要有一個(gè)Book類(lèi),此類(lèi)中記錄數(shù)的各種信息,包括書(shū)名、作者、書(shū)的類(lèi)型、價(jià)格和借閱狀態(tài),所有包中的所有類(lèi)中的成員變量我都使用private修飾,只提供對(duì)外的方法,后面就不再重復(fù),代碼如下(只展示部分代碼):
package book;
public class Book {
private String name;
private String author;
private String type;
private int price;
private boolean borrow;
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;
}
}既然有書(shū),那么就需要書(shū)架來(lái)存放書(shū),所以在book包中再定義一個(gè)類(lèi)為BookShelf用來(lái)存放書(shū)以及記錄書(shū)的數(shù)量,存放書(shū)可以用Book類(lèi)數(shù)組實(shí)現(xiàn)
public class BookShelf {
private Book[] books=new Book[1000];
private int count; //記錄書(shū)的數(shù)量
}由于數(shù)組不能直接訪(fǎng)問(wèn),所以在類(lèi)中增加一個(gè)獲取數(shù)組下標(biāo)的方法,而訪(fǎng)問(wèn)數(shù)組的方法一般都是對(duì)書(shū)進(jìn)行操作,所以setBook方法也進(jìn)行修改
package book;
public class BookShelf {
private Book[] books=new Book[1000];
private int count; //記錄書(shū)的數(shù)量
public void setBooks(int pos,Book book) {
books[pos] = book;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
public BookShelf() {
books[0]=new Book("吶喊","魯迅","小說(shuō)集",30); //默認(rèn)初始有一本書(shū),寫(xiě)不寫(xiě)隨你
this.count=1;
}
//獲取下標(biāo)對(duì)應(yīng)的書(shū)
public Book pos(int i) {
return books[i];
}
}book包初步的代碼就到這,繼續(xù)下一個(gè)包
2.user包
包中肯定會(huì)有普通用戶(hù)(NormalUser)和管理員(AdminUser)兩個(gè)類(lèi),但重點(diǎn)是如何實(shí)現(xiàn)圖中的不同用戶(hù)有不同的操作
那我們先將登陸方法寫(xiě)出來(lái),然后分析:
public static void login() {
System.out.println("輸入姓名:");
Scanner scanner=new Scanner(System.in);
String name=scanner.nextLine();
System.out.println("輸入你身份:1.管理員 2.普通用戶(hù)");
int i=scanner.nextInt();
if(i==1) {
//管理員
} else {
//普通用戶(hù)
}
}方法根據(jù)不同的數(shù)字來(lái)判斷是哪種用戶(hù),所以返回值應(yīng)該是返回一個(gè)類(lèi),但這里有兩個(gè)類(lèi),為解決這個(gè)問(wèn)題,我們可以讓NormalUser和AdminUser都繼承同一個(gè)父類(lèi),方法只要返回父類(lèi)即可
父類(lèi)代碼如下:
public abstract class User {
private String name;
public User(String name) {
this.name = name;
}
public abstract void menu(); //菜單抽象方法,子類(lèi)實(shí)現(xiàn)
}子類(lèi)代碼:
public class AdminUser extends User{
public AdminUser(String name) {
super(name);
}
@Override
public void menu() {
System.out.println("歡迎使用");
System.out.println("1.查找圖書(shū)");
System.out.println("2.新增圖書(shū)");
System.out.println("3.刪除圖書(shū)");
System.out.println("4.顯示圖書(shū)");
System.out.println("0.退出系統(tǒng)");
System.out.println("選擇操作");
}
}
public class NormalUser extends User{
public NormalUser(String name) {
super(name);
}
@Override
public void menu() {
System.out.println("歡迎使用");
System.out.println("1.查找圖書(shū)");
System.out.println("2.借閱圖書(shū)");
System.out.println("3.歸還圖書(shū)");
System.out.println("0.退出系統(tǒng)");
System.out.println("選擇操作");
}
}不同用戶(hù)對(duì)應(yīng)著不同的操作,但有相同的操作數(shù),所以?xún)蓚€(gè)類(lèi)需要有一個(gè)數(shù)組來(lái)存放各自的方法來(lái)防止出錯(cuò),而且這個(gè)數(shù)組是要在用戶(hù)選擇之前就準(zhǔn)備好,所以數(shù)組應(yīng)該是在構(gòu)造方法內(nèi),修改后的類(lèi)如下:
public abstract class User {
private String name;
public IOperate[] ioperate;
public void chooseOperate(int choice,BookShelf bookShelf) {
ioperate[choice].work(bookShelf);
}
public User(String name) {
this.name = name;
}
public abstract int menu();
}
public class AdminUser extends User{
public AdminUser(String name) {
super(name);
this.ioperate=new IOperate[] {
new Exit(),
new FindBook(),
new AddBook(),
new DelBook(),
new DisplayBook(),
};
}
@Override
public int menu() {
System.out.println("歡迎使用");
System.out.println("1.查找圖書(shū)");
System.out.println("2.新增圖書(shū)");
System.out.println("3.刪除圖書(shū)");
System.out.println("4.顯示圖書(shū)");
System.out.println("0.退出系統(tǒng)");
System.out.println("選擇操作");
Scanner scanner=new Scanner(System.in);
int choice=scanner.nextInt();
return choice;
}
}
public class NormalUser extends User{
public NormalUser(String name) {
super(name);
this.ioperate=new IOperate[] {
new Exit(),
new FindBook(),
new BorrowBook(),
new ReturnBook(),
};
}
@Override
public int menu() {
System.out.println("歡迎使用");
System.out.println("1.查找圖書(shū)");
System.out.println("2.借閱圖書(shū)");
System.out.println("3.歸還圖書(shū)");
System.out.println("0.退出系統(tǒng)");
System.out.println("選擇操作");
Scanner scanner=new Scanner(System.in);
int choice=scanner.nextInt();
return choice;
}
}3.operate包
圖書(shū)的增刪改查等操作其實(shí)都是在對(duì)Book數(shù)組來(lái)進(jìn)行操作的,所以這些方法的參數(shù)都是BookShelf類(lèi),那么我們可以定義一個(gè)接口,接口內(nèi)定義此方法,然后其它類(lèi)實(shí)現(xiàn)此接口即可
接口代碼:
package operate;
import book.BookShelf;
public interface IOperate {
public void work (BookShelf bookShelf);
}至于對(duì)書(shū)的操作,這里以增加書(shū)籍為例
我們需要知道書(shū)的信息,然后要有一個(gè)Book類(lèi)來(lái)接收,最后放到數(shù)組中
按照這個(gè)邏輯,之前的Book類(lèi)就需要修改:在Book類(lèi)中添加一個(gè)構(gòu)造方法以便接收書(shū)的信息,注意方法在數(shù)組中的位置要和你自己寫(xiě)的菜單中的位置對(duì)應(yīng)
public Book(String name, String author, String type, int price) {
this.name = name;
this.author = author;
this.type = type;
this.price = price;
}增加書(shū)的方法代碼:
public class AddBook implements IOperate {
@Override
public void work(BookShelf bookShelf) {
System.out.println("請(qǐng)輸入圖書(shū)的名字:");
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
System.out.println("請(qǐng)輸入圖書(shū)的作者:");
String author = scanner.nextLine();
System.out.println("請(qǐng)輸入圖書(shū)的類(lèi)型:");
String type = scanner.nextLine();
System.out.println("請(qǐng)輸入圖書(shū)的價(jià)格:");
int price = scanner.nextInt();
Book book = new Book(name,author,type,price);
int count=bookShelf.getCount();
bookShelf.setBooks(count,book);
bookShelf.setCount(count+1);
System.out.println("新增成功");
}
}注:
1.由于引用變量默認(rèn)是輸出修改的地址,所以要打印書(shū)的內(nèi)容的話(huà)需要在類(lèi)Book中重寫(xiě)toString方法
2.退出方法在退出前需遍歷數(shù)組將其指向的對(duì)象都改為null方便回收,雖然程序結(jié)束后系統(tǒng)也會(huì)回收,但你要知道大型工程里面有些程序一旦跑起來(lái)后想要停下來(lái)不是那么容易的
到這里這個(gè)圖書(shū)管理系統(tǒng)基本完成,完
到此這篇關(guān)于Java手寫(xiě)圖書(shū)管理基本功能附代碼的文章就介紹到這了,更多相關(guān)Java圖書(shū)管理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring中的@ControllerAdvice三種用法詳解
這篇文章主要介紹了Spring中的@ControllerAdvice三種用法詳解,加了@ControllerAdvice的類(lèi)為那些聲明了(@ExceptionHandler、@InitBinder或@ModelAttribute注解修飾的)方法的類(lèi)而提供的<BR>專(zhuān)業(yè)化的@Component,以供多個(gè)Controller類(lèi)所共享,需要的朋友可以參考下2024-01-01
淺談SpringBoot是如何實(shí)現(xiàn)日志的
這篇文章主要介紹了淺談SpringBoot是如何實(shí)現(xiàn)日志的,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03
Spring接口A(yíng)pplicationRunner用法詳解
這篇文章主要介紹了Spring接口A(yíng)pplicationRunner的作用和使用介紹,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-08-08
Java數(shù)據(jù)類(lèi)型超詳細(xì)示例講解
Java程序中要求參與的計(jì)算的數(shù)據(jù),必須要保證數(shù)據(jù)類(lèi)型的一致性,如果數(shù)據(jù)類(lèi)型不一致將發(fā)生類(lèi)型的轉(zhuǎn)換。本文將通過(guò)示例詳細(xì)說(shuō)說(shuō)Java中數(shù)據(jù)類(lèi)型的轉(zhuǎn)換,感興趣的可以了解一下2022-11-11
IDEA創(chuàng)建SpringBoot的maven項(xiàng)目的方法步驟
這篇文章主要介紹了IDEA創(chuàng)建SpringBoot的maven項(xiàng)目的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04
mybatis-plus?查詢(xún)傳入?yún)?shù)Map,返回List<Map>方式
這篇文章主要介紹了mybatis-plus?查詢(xún)傳入?yún)?shù)Map,返回List<Map>方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
java的Jackson將json字符串轉(zhuǎn)換成泛型List
這篇文章主要介紹了java的Jackson將json字符串轉(zhuǎn)換成泛型List ,這里整理了詳細(xì)的代碼,有需要的小伙伴可以參考下。2017-02-02

