天天看點

Java初學者也可以實作的圖書系統小練習🌕一、需求分析🌕二、具體實作過程🌕 三、效果展示🌕四、小戴想說的話

       大家好呀,我是小戴🙌🙌🙌

       最近大家不是快期末了嘛,有沒有泡圖書館呀?今天的學習内容跟圖書館有關,沒錯,就是圖書管理系統,但是目前所學知識水準有限,這是一個很簡單的圖書系統小練習。不要急,我們的目的是在于如何使用已知學過的知識進行實踐,這裡将帶大家用基本的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類

🌕 三、效果展示

🥝示例一

 🥝示例二

🌕四、小戴想說的話

🌕一、需求分析

圖書館書籍系統的使用者分為管理者和普通使用者兩種,兩種使用者之間所能實作的功能是不同的。例如我了解想要實作的業務是這樣子的:

管理者:

Java初學者也可以實作的圖書系統小練習🌕一、需求分析🌕二、具體實作過程🌕 三、效果展示🌕四、小戴想說的話

普通使用者:

Java初學者也可以實作的圖書系統小練習🌕一、需求分析🌕二、具體實作過程🌕 三、效果展示🌕四、小戴想說的話

 業務實作内容不是重點,大家可以根據自己的喜好去進一步完善~

🌕二、具體實作過程

🥝2.1 代碼目錄

Java初學者也可以實作的圖書系統小練習🌕一、需求分析🌕二、具體實作過程🌕 三、效果展示🌕四、小戴想說的話

 建立一個叫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;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("抱歉,本書架中沒有此書,我們會盡快聯系圖書管理者新增此書!");
        }
    }
}
           

🍊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;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類

實作顯示圖書

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;i++){
            Book book = bookList.getBook(i);
            if(book.getName().equals(name)){
                System.out.println("找到這本書了!");
                System.out.println(book);
                return;//找到這本書,查找程式提前結束
            }
        }
        if(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:因操作過長,長截圖無法截全,為了保證展示完整性,特意用幾張小圖截的,如果給您帶來閱讀不适,請見諒~給你花花🌹🌹

🥝示例一

Java初學者也可以實作的圖書系統小練習🌕一、需求分析🌕二、具體實作過程🌕 三、效果展示🌕四、小戴想說的話
Java初學者也可以實作的圖書系統小練習🌕一、需求分析🌕二、具體實作過程🌕 三、效果展示🌕四、小戴想說的話
Java初學者也可以實作的圖書系統小練習🌕一、需求分析🌕二、具體實作過程🌕 三、效果展示🌕四、小戴想說的話

 🥝示例二

Java初學者也可以實作的圖書系統小練習🌕一、需求分析🌕二、具體實作過程🌕 三、效果展示🌕四、小戴想說的話
Java初學者也可以實作的圖書系統小練習🌕一、需求分析🌕二、具體實作過程🌕 三、效果展示🌕四、小戴想說的話
Java初學者也可以實作的圖書系統小練習🌕一、需求分析🌕二、具體實作過程🌕 三、效果展示🌕四、小戴想說的話
Java初學者也可以實作的圖書系統小練習🌕一、需求分析🌕二、具體實作過程🌕 三、效果展示🌕四、小戴想說的話

🌕四、小戴想說的話

學習一個知識可能很簡單,但将學到的知識進行整合應用絕對比學那個知識要難,但如果相信自己可以做到,那絕對可以學下去,保持良好的心态是提高學習效率的利器。

咱們一起加油💪💪💪

目前,小戴備考四級和期末考中,有什麼學習心理各方面問題歡迎uu們私信背景踢我,會的我會用心解答~

晚安,唔西迪西!——寫于2022/5/23早1:10

Java初學者也可以實作的圖書系統小練習🌕一、需求分析🌕二、具體實作過程🌕 三、效果展示🌕四、小戴想說的話
日常秃發,那就明天早上見咯~要是對你有幫助有啟發的話,就淺淺點個贊支援一下吧🌹🌹