? ? ? ?大家好呀,我是小戴??????
? ? ? ?最近大家不是快期末了嘛,有沒有泡圖書館呀?今天的學(xué)習(xí)內(nèi)容跟圖書館有關(guān),沒錯,就是圖書管理系統(tǒng),但是目前所學(xué)知識水平有限,這是一個很簡單的圖書系統(tǒng)小練習(xí)。不要急,我們的目的是在于如何使用已知學(xué)過的知識進(jìn)行實踐,這里將帶大家用基本的Java語法和面向?qū)ο蟮乃枷雭韺崿F(xiàn)這個小程序~沖沖沖???????
下面是我們今天要學(xué)習(xí)的內(nèi)容??????
??一、需求分析
??二、具體實現(xiàn)過程
??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類
???三、效果展示
??示例一
???示例二
??四、小戴想說的話
??一、需求分析
圖書館書籍系統(tǒng)的用戶分為管理員和普通用戶兩種,兩種用戶之間所能實現(xiàn)的功能是不同的。例如我理解想要實現(xiàn)的業(yè)務(wù)是這樣子的:
管理員:
普通用戶:
?業(yè)務(wù)實現(xiàn)內(nèi)容不是重點,大家可以根據(jù)自己的喜好去進(jìn)一步完善~
??二、具體實現(xiàn)過程
??2.1 代碼目錄
?建立一個叫booktest的項目,在src下新建book、operation、user 三個包,分別將跟書有關(guān)的類、跟操作有關(guān)的類、跟用戶有關(guān)的類存儲起來。即很好地應(yīng)用了包的作用。
包的作用:
1.提供了類似于操作系統(tǒng)樹狀文件夾的組織形式,能分門別類地存儲、管理類,易于查找并使用類;
2.解決了類命名時相同的沖突。在Java中,不能在一個同一個包中定義兩個類名相同的類,但在不同包中可以;
3.保護(hù)類中成員變量和方法。該成員變量和方法的使用范圍取決于訪問修飾符。
在src下還新建了一個叫Main的類,這個類有一個main方法,并且該類將所有東西進(jìn)行整合,來實現(xiàn)我們想要完成的功能。?
在Java中,main方法是Java應(yīng)用程序的入口方法。
程序運行時,要執(zhí)行的第一個方法是main()方法。??
??2.2 book包
??1.Book類
Book類用來具體存放圖書信息,
包括書名、作者、價格、類型、是否被借出這些基本信息
由于這些屬性是用private修飾的,這不就體現(xiàn)了Java語言面向?qū)ο?strong>封裝的特點嗎?除了設(shè)置帶參的構(gòu)造方法、重寫toString()方法,要想在其他類中調(diào)用圖書屬性,需要為每個屬性設(shè)置Getter和Setter方法
封裝:
將一些細(xì)節(jié)信息隱藏- CSDN搜索起來,對外界不可見
用private修飾的屬性,只能在本類中隨意訪問,要想在其他類中調(diào)用,需要在類中設(shè)置賦值或獲取的成員方法。
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個參數(shù)的構(gòu)造方法
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類
存放書的地方,是魔幻小書架,書架上的書可不止只有一本哦~
創(chuàng)建一個Book類型的數(shù)組,并實時記錄當(dāng)前數(shù)組存放了多少本書,
設(shè)置一個構(gòu)造方法,將一些書先存放進(jìn)去
getBook()和setBook()方法分別相當(dāng)于從書架上拿書和放書在書架上
package book;
public class BookList {
//書架容量為10本
private Book[] books = new Book[10];
private int usedSize;//實時記錄 當(dāng)前Books這個數(shù)組放了多少本書
//構(gòu)造方法
public BookList(){
books[0] = new Book("把時間當(dāng)做朋友","李笑來",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;
}
/**
* 實時獲取當(dāng)前書架上 書的個數(shù)
* @return
*/
public int getUsedSize(){
return usedSize;
}
/**
* 實時修改當(dāng)前書架上 書的個數(shù)
* @param size
*/
public void setUsedSize(int size){
usedSize = size;
}
}
???2.3 operation包
跟操作有關(guān)的類都在這里啦~
??1.接口IOperation
這個接口中的抽象方法都會在后面實現(xiàn)該接口的類中進(jìn)行重寫
package operation;
import book.BookList;
public interface IOperation {
void work(BookList bookList);//抽象方法
}
??2.AddOperation類
實現(xiàn)新增圖書
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類
實現(xiàn)借閱圖書
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;i++){
Book book = bookList.getBook(i);
if(book.getName().equals(name)){
book.setBorrowed(true);
System.out.println("《"+name+"》借閱成功,祝暢游閱讀世界!");
return;
}
}
if(i>=currentSize){
System.out.println("抱歉,本書架中沒有此書,我們會盡快聯(lián)系圖書管理員新增此書!");
}
}
}
??4. DelOperation類
實現(xiàn)刪除圖書
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;i++){
Book book = bookList.getBook(i);
if(book.getName().equals(name)){
index = i;
break;
}
}
if(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類
實現(xiàn)顯示圖書
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類
實現(xiàn)退出系統(tǒng)
package operation;
import book.BookList;
public class ExitOperation implements IOperation{
@Override
public void work(BookList bookList) {
System.out.println("退出系統(tǒng)!");
System.exit(0);
}
}
??7.FindOperation類
實現(xiàn)查找圖書
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;i++){
Book book = bookList.getBook(i);
if(book.getName().equals(name)){
System.out.println("找到這本書了!");
System.out.println(book);
return;//找到這本書,查找程序提前結(jié)束
}
}
if(i>=currentSize) {
//說明沒有找到
System.out.println("沒有你要找的這本書!");
}
}
}
???8.ReturnOperation類
實現(xiàn)歸還圖書
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屬性,都要有一個功能菜單,功能菜單中有相同的操作方法也有各自才有的特殊操作方法,既然重合度這么高,但又有區(qū)別,好喔,這里需要用一個父類更加方便。
User類就是user這個包中的父類,AdminUser和NormalUser是子類。
繼承的作用:
通過繼承可以快速創(chuàng)建新的類,實現(xiàn)代碼的重用,提高程序的可維護(hù)性,節(jié)省大量創(chuàng)建新類的時間,提高開發(fā)效率和開發(fā)質(zhì)量
允許程序員在保持原有類特性的基礎(chǔ)上進(jìn)行擴(kuò)展,增加功能,這樣產(chǎn)生新的類,稱派生類
??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.退出系統(tǒng)");
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.退出系統(tǒng)");
System.out.println("請輸入你的操作:");
Scanner sc = new Scanner(System.in);
int choice = sc.nextInt();
return choice;
}
}
??2.4?Main類
Main類用于將這些功能屬性整合起來,也是整個小項目的執(zhí)行入口,
用戶登錄之后,可選擇自己的身份——(管理員/普通用戶)
菜單用循環(huán)實現(xiàn)多次打印
login()函數(shù)將AdminUser或者NormalUser向上轉(zhuǎn)型為父類User
在main()方法中,用一個父類user調(diào)用menu()方法,根據(jù)user是管理員還是普通用戶,向下轉(zhuǎn)型調(diào)用各自不同的菜單
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();//圖書準(zhǔn)備
//登錄
User user = login();
int temp = 0;
do{
int choice = user.menu();//動態(tài)綁定
user.doOperation(choice,bookList);
temp = choice;
}while (temp!=0);
}
}
???三、效果展示
psss:因操作過長,長截圖無法截全,為了保證展示完整性,特意用幾張小圖截的,如果給您帶來閱讀不適,請見諒~給你花花????
??示例一
???示例二
??四、小戴想說的話
學(xué)習(xí)一個知識可能很簡單,但將學(xué)到的知識進(jìn)行整合應(yīng)用絕對比學(xué)那個知識要難,但如果相信自己可以做到,那絕對可以學(xué)下去,保持良好的心態(tài)是提高學(xué)習(xí)效率的利器。
咱們一起加油??????
目前,小戴備考四級和期末考中,有什么學(xué)習(xí)心理各方面問題歡迎uu們私信后臺踢我,會的我會用心解答~
晚安,唔西迪西!——寫于2022/5/23早1:10
文章來源:http://www.zghlxwxcb.cn/news/detail-407381.html
日常禿發(fā),那就明天早上見咯~要是對你有幫助有啟發(fā)的話,就淺淺點個贊支持一下吧????文章來源地址http://www.zghlxwxcb.cn/news/detail-407381.html
到了這里,關(guān)于Java初學(xué)者也可以實現(xiàn)的圖書系統(tǒng)小練習(xí)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!