面向編程概念
Java面向?qū)ο缶幊蹋∣bject-Oriented Programming,OOP)是Java語言的核心特性之一,它提供了一種組織代碼的方法,將現(xiàn)實世界中的事物抽象為對象,并通過對象之間的交互來構(gòu)建程序。Java面向?qū)ο缶幊贪韵轮饕拍睿?/p>
-
類和對象(Class and Object):
類是面向?qū)ο缶幊痰幕緲?gòu)建塊,它是對一組具有相同屬性和行為的對象的抽象描述。對象是類的實例化結(jié)果,它是內(nèi)存中的實體,具有類所定義的屬性和行為。類定義了對象的結(jié)構(gòu)和行為,而對象則代表了真實世界中的具體實體。 -
封裝(Encapsulation):
封裝是一種將數(shù)據(jù)和行為封裝在類中,阻止外部直接訪問和修改對象的內(nèi)部狀態(tài)的特性。通過封裝,類可以隱藏其實現(xiàn)細(xì)節(jié),并通過公共的方法提供對內(nèi)部狀態(tài)的訪問和操作。這有助于提高代碼的可維護性和安全性。 -
繼承(Inheritance):
繼承是一種類之間的關(guān)系,它允許一個類(稱為子類或派生類)繼承另一個類(稱為父類或基類)的屬性和行為。子類可以復(fù)用父類的代碼,并且可以在不修改父類的情況下增加新的功能。繼承提供了代碼重用和層次化組織的能力。 -
多態(tài)(Polymorphism):
多態(tài)是指同一操作可以在不同的對象上產(chǎn)生不同的結(jié)果。它允許我們使用統(tǒng)一的接口來處理不同類的對象,從而提高代碼的靈活性和可擴展性。多態(tài)有兩種形式:靜態(tài)多態(tài)(方法重載)和動態(tài)多態(tài)(方法重寫,也稱為覆蓋)。 -
抽象類(Abstract Class):
抽象類是不能被實例化的類,它用于作為其他類的基類,提供一種對類的抽象描述。抽象類可以包含抽象方法和具體方法,子類必須實現(xiàn)抽象方法才能被實例化。抽象類常常用來定義類的通用行為和屬性。 -
接口(Interface):
接口是一種特殊的抽象類,它定義了一組抽象方法,但不包含具體的實現(xiàn)。類可以實現(xiàn)(implements)一個或多個接口,實現(xiàn)接口的類必須提供接口中定義的所有方法。接口提供了一種多繼承的機制,使得類可以在不同的繼承樹上實現(xiàn)不同的功能。
圖書管理系統(tǒng)示例
需求分析
-
確定系統(tǒng)的功能:明確圖書管理系統(tǒng)的基本功能,如查找圖書、新增圖書、刪除圖書、顯示圖書、借閱圖書、歸還圖書等功能。
-
定義用戶角色和權(quán)限:確定系統(tǒng)中的用戶角色,如讀者、管理員等,并定義他們的權(quán)限和操作范圍。
- 普通用戶:查找圖書、借閱圖書、歸還圖書
- 管理員:查找圖書、新增圖書、刪除圖書、顯示圖書
-
識別數(shù)據(jù)需求:分析需要存儲的數(shù)據(jù),如圖書信息、讀者信息、借閱記錄等,并確定數(shù)據(jù)之間的關(guān)系。
- 圖書名字、作者、價格、圖書類型、圖書是否借出
- 管理員、用戶名字
設(shè)計階段
- 架構(gòu)設(shè)計:設(shè)計系統(tǒng)的整體架構(gòu),包括圖書類、圖書館類、讀者類等的設(shè)計,以及它們之間的關(guān)系。
- 接口設(shè)計:進行操作的接口。
- 數(shù)據(jù)庫設(shè)計:咱們這就是一個JavaSe的小項目,暫時不涉及數(shù)據(jù)庫(使用數(shù)組存儲,不是持久化存儲)。
編碼實現(xiàn)
創(chuàng)建目錄結(jié)構(gòu)
根據(jù)需求分析,我們的圖書管理系統(tǒng)有圖書、用戶、然后還有用戶對圖書的操作。所以我們先把這三個包創(chuàng)建好。
- book這個包里放跟圖書有關(guān)的,是Book類和存儲圖書的BookList類,
- operation包放的是所有的操作類,
- user包放的是和用戶有關(guān)的類。
值得注意的是,我們可以定義一個IOperation接口,讓所有的操作繼承這個接口,之后只要是進行操作就只要調(diào)用這個接口就好了。另外我們的User類,實際上是一個抽象的概念,實際上我們是普通用戶和管理員是實際的,所以我們可以定義一個抽象的User類,然后派生出具體的用戶。最后,我們我們還要創(chuàng)建一個啟動類,作為整個程序的入口。
Book類的編碼
package book;
/**
* @Author: Fourteen-Y
* @Description: 圖書信息,包括書名、作者、價格、類型、是否被借出
* @Date: 2023/7/27 12:04
*/
public class Book {
// 圖書的屬性
private String name;
private String author;
private int price;
private String type;
private boolean isBorrowed;
// 圖書的構(gòu)造方法,實例對象的時候能直接定義圖書對象
public Book(String name, String author, int price, String type) {
this.name = name;
this.author = author;
this.price = price;
this.type = type;
}
// 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 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;
}
// 重寫toString方法,更好的打印圖書信息
@Override
public String toString() {
return "Book{" +
"name='" + name + '\'' +
", author='" + author + '\'' +
", price=" + price +
", type='" + type + '\'' +
// 三目運算符 當(dāng)isBorrowed為true時,輸出已借出,否則輸出未借出
((isBorrowed == true) ? " ,已借出" : " ,未借出")+
// ", isBorrowed=" + isBorrowed +
'}';
}
}
BookList類的編碼
package book;
/**
* @Author: Fourteen-Y
* @Description: 對圖書的存儲
* @Date: 2023/7/27 12:04
*/
public class BookList {
/**
* 創(chuàng)建一個數(shù)組,用來存放書籍,一開始默認(rèn)5本書
*/
private static Book[] books = new Book[5];
/**
* 數(shù)組中放了書的個數(shù)
*/
private int usedSize;
/**
* 默認(rèn)存放的書籍
*/
public BookList() {
books[0] = new Book("三國演義","羅貫中",34,"小說");
books[1] = new Book("西游記","吳承恩",24,"小說");
books[2] = new Book("紅樓夢","曹雪芹",30,"小說");
books[3] = new Book("水滸傳","施耐庵",34,"小說");
books[4] = new Book("西廂記","王實甫",34,"小說");
this.usedSize = 5;
}
public int getUsedSize() {
return usedSize;
}
public void setUsedSize(int usedSize) {
this.usedSize = usedSize;
}
//借書還書的操作,涉及到數(shù)組的操作
/**
* 獲取pos下標(biāo)的書
* @param pos
* @return
*/
public Book getPos(int pos) {
return books[pos];
}
/**
* 給數(shù)組的pos位置,放一本書
* @param pos
* @param book
*/
public static void setBooks(int pos, Book book) {
books[pos] = book;
}
}
User類的編碼
package user;
import book.BookList;
import operation.IOperation;
/**
* @Author: Fourteen-Y
* @Description: 用戶抽象類 有兩個子類:普通用戶和管理員
* @Date: 2023/7/27 12:10
*/
public abstract class User {
protected String name;
/**
* 把所有的操作都放到這個數(shù)組中 通過下標(biāo)來選擇具體的操作
*/
public IOperation[] ioPerations;
public User(String name) {
this.name = name;
}
public abstract int menu();
/**
* 根據(jù)用戶輸入的選項,調(diào)用對應(yīng)的操作
* @param choice 用戶輸入的選項
* @param bookList 圖書列表
*/
public void doOperation(int choice, BookList bookList) {
// work是所有操作的具體實現(xiàn),傳入要操作的書籍?dāng)?shù)組
ioPerations[choice].work(bookList);
}
}
AdminUser類的編碼
package user;
import operation.*;
import java.util.Scanner;
/**
* @Author: Fourteen-Y
* @Description: 管理員 1.查找圖書 2.新增圖書 3.刪除圖書 4.顯示圖書 0.退出系統(tǒng)
* @Date: 2023/7/27 12:09
*/
public class AdminUser extends User {
public AdminUser(String name) {
super(name);
// 把所有的操作在數(shù)組中new出來,
// 由于還沒實現(xiàn)這些具體的操作,所以一下代碼展示會報錯
this.ioPerations = new IOperation[] {
new ExitOperation(),
new FindOperation(),
new AddOperation(),
new DelOperation(),
new DisplayOperation(),
};
}
/**
* 管理員菜單 1.查找圖書 2.新增圖書 3.刪除圖書 4.顯示圖書 0.退出系統(tǒng)
* @return 返回用戶輸入的選項,供主程序調(diào)用
*/
@Override
public int menu() {
System.out.println("歡迎管理員"+this.name+"登錄");
System.out.println("1.查找圖書");
System.out.println("2.新增圖書");
System.out.println("3.刪除圖書");
System.out.println("4.顯示圖書");
System.out.println("0.退出系統(tǒng)");
Scanner sc = new Scanner(System.in);
int choice = sc.nextInt();
return choice;
}
}
NormalUser類的編碼
package user;
import operation.*;
import java.util.Scanner;
/**
* @Author: Fourteen-Y
* @Description: 普通用戶 有四個操作:查找圖書 借閱圖書 歸還圖書 退出系統(tǒng)
* @Date: 2023/7/27 12:10
*/
public class NormalUser extends User{
public NormalUser(String name) {
super(name);
this.ioPerations = new IOperation[] {
new ExitOperation(),
new FindOperation(),
new BorrowOperation(),
new ReturnOperation(),
};
}
/**
* 普通用戶菜單 1.查找圖書 2.借閱圖書 3.歸還圖書 0.退出系統(tǒng)
* @return 返回用戶輸入的選項,供主程序調(diào)用
*/
@Override
public int menu() {
System.out.println("歡迎"+this.name+"登錄");
System.out.println("1.查找圖書");
System.out.println("2.借閱圖書");
System.out.println("3.歸還圖書");
System.out.println("0.退出系統(tǒng)");
Scanner sc = new Scanner(System.in);
int choice = sc.nextInt();
return choice;
}
}
啟動類的編寫
import book.BookList;
import user.AdminUser;
import user.NormalUser;
import user.User;
import java.util.Scanner;
/**
* @Author: Fourteen-Y
* @Description:
* @Date: 2023/7/27 12:11
*/
public class Main {
public static User login(){
System.out.println("請輸入你的姓名:");
Scanner sc = new Scanner(System.in);
String name = sc.next();
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();
while(true) {
int choice = user.menu();
user.doOperation(choice,bookList);
}
}
}
具體的操作實現(xiàn)
IOperation接口
package operation;
import book.BookList;
/**
* @Author: Fourteen-Y
* @Description: 新增圖書
* @Date: 2023/7/27 12:09
*/
public interface IOperation {
// 由于接口中的方法都是抽象方法,所以可以省略public abstract
void work(BookList bookList);
}
新增圖書的實現(xiàn)
package operation;
import book.Book;
import book.BookList;
import java.util.Scanner;
/**
* @Author: Fourteen-Y
* @Description:
* @Date: 2023/7/27 12:07
*/
public class AddOperation implements IOperation{
@Override
public void work(BookList bookList) {
System.out.println("新增圖書!");
System.out.println("請輸入圖書的名字:");
Scanner sc = new Scanner(System.in);
String name = sc.nextLine();
System.out.println("請輸入圖書的作者");
String author = sc.nextLine();
System.out.println("請輸入圖書的類型");
String type = sc.nextLine();
System.out.println("請輸入圖書的價格");
int price = sc.nextInt();
// 創(chuàng)建一個Book對象
Book book = new Book(name,author,price,type);
// 當(dāng)BookList滿了的時候,自動擴容成原來的2倍
BookList.ensureCapacity(bookList);
int currentSize = bookList.getUsedSize();
BookList.setBooks(currentSize,book);
// 更新usedSize
bookList.setUsedSize(currentSize + 1);
System.out.println("新增成功!");
}
}
上面用了一個確保容量的函數(shù),自動擴容的函數(shù),我們在BookList類里面加上這個函數(shù)
public static void ensureCapacity(BookList bookList) { // 如果當(dāng)前數(shù)組已經(jīng)滿了,就擴容成原來的2倍 if (bookList.getUsedSize() == books.length) { Book[] newBooks = new Book[2 * books.length]; for (int i = 0; i < books.length; i++) { newBooks[i] = books[i]; } books = newBooks; } }
借閱圖書的實現(xiàn)
package operation;
import book.Book;
import book.BookList;
import java.util.Scanner;
/**
* @Author: Fourteen-Y
* @Description:
* @Date: 2023/7/27 12:08
*/
public class BorrowOperation implements IOperation{
@Override
public void work(BookList bookList) {
System.out.println("借閱圖書!");
System.out.println("請輸入你要借閱圖書的名字:");
Scanner sc = new Scanner(System.in);
String name = sc.nextLine();
// 1.查找書籍是否存在
int currentSize = bookList.getUsedSize();
for (int i = 0; i < currentSize; i++) {
Book book = bookList.getPos(i);
if (book.getName().equals(name)) {
// 2.判斷書籍是否被借出
if (book.isBorrowed()) {
System.out.println("這本書已經(jīng)被借出去了!");
return;
}
// 3.借閱書籍
book.setBorrowed(true);
System.out.println("借閱成功!");
return;
}
}
System.out.println("沒有你要借閱的圖書");
}
}
刪除圖書的實現(xiàn)
package operation;
import book.Book;
import book.BookList;
import java.util.Scanner;
/**
* @Author: Fourteen-Y
* @Description: 刪除圖書
* @Date: 2023/7/27 12:08
*/
public class DelOperation implements IOperation{
@Override
public void work(BookList bookList) {
System.out.println("刪除圖書!");
System.out.println("請輸入你要刪除圖書的名字:");
Scanner sc = new Scanner(System.in);
String name = sc.nextLine();
// 1.查找書籍是否存在
int currentSize = bookList.getUsedSize();
for (int i = 0; i < currentSize; i++) {
Book book = bookList.getPos(i);
if (book.getName().equals(name)) {
// 2.刪除書籍
for (int j = i; j < currentSize - 1; j++) {
Book book1 = bookList.getPos(j + 1);
BookList.setBooks(j,book1);
}
bookList.setUsedSize(currentSize - 1);
System.out.println("刪除成功!");
return;
}
}
System.out.println("沒有你要刪除的書!");
}
}
顯示圖書的實現(xiàn)
package operation;
import book.Book;
import book.BookList;
/**
* @Author: Fourteen-Y
* @Description: 展示圖書
* @Date: 2023/7/27 12:08
*/
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.getPos(i);
System.out.println(book);
}
}
}
查找圖書的實現(xiàn)
package operation;
import book.BookList;
import java.util.Scanner;
/**
* @Author: Fourteen-Y
* @Description: 查找圖書
* @Date: 2023/7/27 12:09
*/
public class FindOperation implements IOperation{
@Override
public void work(BookList bookList) {
System.out.println("查找圖書!");
System.out.println("請輸入你要查找圖書的名字:");
Scanner sc = new Scanner(System.in);
String name = sc.nextLine();
int currentSize = bookList.getUsedSize();
for (int i = 0; i < currentSize; i++) {
if (bookList.getPos(i).getName().equals(name)) {
System.out.println("找到這本書了,信息如下");
System.out.println(bookList.getPos(i));
return;
}
}
System.out.println("沒有這本書!");
}
}
歸還圖書的實現(xiàn)
package operation;
import book.BookList;
import java.util.Scanner;
/**
* @Author: Fourteen-Y
* @Description: 歸還圖書
* @Date: 2023/7/27 12:09
*/
public class ReturnOperation implements IOperation{
@Override
public void work(BookList bookList) {
System.out.println("歸還圖書!");
System.out.println("請輸入你要歸還圖書的名字:");
Scanner sc = new Scanner(System.in);
String name = sc.nextLine();
int currentSize = bookList.getUsedSize();
for (int i = 0; i < currentSize; i++) {
if (bookList.getPos(i).getName().equals(name)) {
if (bookList.getPos(i).isBorrowed()) {
bookList.getPos(i).setBorrowed(false);
System.out.println("歸還成功!");
return;
}
System.out.println("這本書沒有被借出去!");
return;
}
}
System.out.println("這本書不是該圖書館的書!");
}
}
退出系統(tǒng)操作
package operation;
import book.BookList;
/**
* @Author: Fourteen-Y
* @Description: 退出系統(tǒng)
* @Date: 2023/7/27 12:08
*/
public class ExitOperation implements IOperation{
@Override
public void work(BookList bookList) {
System.out.println("退出系統(tǒng)!");
int currentSize = bookList.getUsedSize();
for (int i = 0; i < currentSize; i++) {
BookList.setBooks(i,null);
}
System.exit(0);
}
}
測試階段
管理員用戶功能測試
查找圖書操作
- 查找有的圖書:
- 查找沒有的圖書
新增圖書操作
展示圖書操作
刪除圖書操作
- 刪除有的圖書
- 刪除沒有的圖書
普通用戶功能測試
查找圖書操作
借閱圖書操作
歸還圖書操作
當(dāng)還完繼續(xù)還的時候
當(dāng)還的書書架上沒有的時候
面向?qū)ο缶幊趟枷氲捏w現(xiàn)
類的定義和對象的創(chuàng)建
- 我們定義一個"Book"類來表示圖書的屬性和行為
- 我們定義一個"BookList"類來表示存放圖書的書架的屬性和行為
- 我們默認(rèn)書架上有5本書,一開始就創(chuàng)建了5個Book對象
- 我們每一次新增圖書的時候都會再創(chuàng)建一個圖書對象,并把這個對象放入書架上
封裝
在上面的例子中,我們使用了封裝來隱藏Book類的內(nèi)部實現(xiàn)細(xì)節(jié)。圖書的屬性(書名、作者、價格、類型、是否被借出)都被聲明為私有(private),這意味著它們不能直接從外部訪問。我們?yōu)槊恳粋€屬性都提供了公共的(getter/setter)方法來讓外部代碼訪問這些屬性的值。
get是得到屬性的值,set是設(shè)置屬性的值
繼承
我們的管理員和普通用戶都有一些共性:都有名字,都會生產(chǎn)一個可以選擇操作的菜單,兩者的行為其實是一樣的,只是可以操作的選項不同。所以我們在User類中把這些全定義好,通過管理員和普通用戶來繼承實現(xiàn)這些功能。
多態(tài)
在系統(tǒng)中,我們選擇不同的用戶類型會出現(xiàn)不同的功能菜單。是因為我們對menu這個方法進行了重寫,不同的對象調(diào)用這個方法會執(zhí)行自己重寫了的邏輯和功能。
通過使用多態(tài),我們可以使用相同的方法處理不同類型的對象,這樣代碼更加靈活和可復(fù)用。
抽象類
在上面的例子中,我們已經(jīng)看到了Java中的抽象類的使用。在這個示例中,User類被聲明為抽象類,它是一種抽象的概念,它表示用戶的通用屬性。
接口
在上面的示例中,我們把所有的操作定義成了一個接口,我們定義IOperation接口就是進行所有的功能操作,然后通過不同的類來分別實現(xiàn)各自的功能。通過這個接口我們可以控制所有的功能。文章來源:http://www.zghlxwxcb.cn/news/detail-617932.html
總結(jié)
這個簡單的圖書管理系統(tǒng)演示了Java面向?qū)ο缶幊痰母鱾€概念的應(yīng)用。實際的項目中,面向?qū)ο缶幊虒⒏鼜?fù)雜和豐富,但這個示例可以幫助你理解如何在實際項目中應(yīng)用面向?qū)ο缶幊痰母拍睢?span toymoban-style="hidden">文章來源地址http://www.zghlxwxcb.cn/news/detail-617932.html
到了這里,關(guān)于Java面向?qū)ο缶幊虒崙?zhàn)詳解(圖書管理系統(tǒng)示例)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!