往期:
JAVA 修炼秘籍第一章:《痛苦的折磨》
JAVA 修炼秘籍第二章:《逐渐魔化》
JAVA 修炼秘籍第三章:《绝地反击》
JAVA 修炼秘籍第四章:《闭关修炼》
JAVA 修炼秘籍第五章:《卧薪尝胆》
JAVA 修炼秘籍第六章:《鏖战》
JAVA 修炼秘籍第七章:《面向对象编程》
JAVA修炼秘籍(番外篇)第一章:《这四道代码题,你真的会吗?》
图中每一段代码都进行了注释,一点点看。
源代码:对应图片顺序
package 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;
}
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 getisBorrowed() {//获得状态
return isBorrowed;
}//获取状态
public void setBorrowed(boolean borrowed) {//更改状态
isBorrowed = borrowed;
}//修改状态·
@Override
public String toString() {//打印图书
return "Book{" +
"name='" + name + '\'' +
", author='" + author + '\'' +
", price=" + price +
", type='" + type + '\'' +
", isBorrowed=" + isBorrowed +
'}';
}
}
package book;
//书的存储类
public class BookList {
private int bookSize;//书籍数量
private Book[] books=new Book[10];//书籍顺序表
public BookList() {
books[0]=new Book("鲨鱼辣椒","李富贵",20,"反派");//存入书籍
books[1]=new Book("蝎子莱莱","王二狗",10,"反派");//存入书籍
books[2]=new Book("蜻蜓队长","张狗蛋",60,"正义");//存入书籍
books[3]=new Book("丸子轮","刘铁根",55,"正义");//存入书籍
books[4]=new Book("蜘蛛侦探","赵三立",93,"正义");//存入书籍
this.bookSize=5;//更改书籍数量
}
public int getBookSize() {
return bookSize;
}//获得书籍数量
public void setBookSize(int booksize) {
this.bookSize = booksize;
}//更改书籍数量
public Book getBooks(int pos) {
return books[pos];
}//获得pos位置的书籍
public void setBooks(Book books, int pos) {
this.books[pos] = books;
}//更改pos位置的书籍
}
package opeartion;
import book.BookList;
//接口,为所有操作提供通用接口
public interface IOperation {
void work(BookList bookList);
}
//新增图书类
package opeartion;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class AddOperation implements IOperation {//链接接口
//重写word方法
@Override
public void work(BookList bookList) {
System.out.println("新增图书");//提示
Scanner scan=new Scanner(System.in);//实例对象
System.out.println("请输入图书的书名:");//提示
String name=scan.nextLine();//输入书名
System.out.println("请输入图书的作者:");//提示
String author= scan.nextLine();//输入作者
System.out.println("请输入图书的类型:");//提示
String type=scan.nextLine();//输入类型
System.out.println("请输入图书的价格:");//提示
int price=scan.nextInt();//输入价格
Book book=new Book(name,author,price,type);//得到一本新书
int size= bookList.getBookSize();//获取书籍数量
for(int i=0;i<size;i++){//检查是否有重复名称的书籍
Book book1=bookList.getBooks(i);//获取顺序表中的每一本书
if(book1.getName().equals(name)){//如有相同
System.out.println("此书已存在");//提示
return ;//提前结束
}
}
bookList.setBooks(book,size);//在顺序表尾部添加新书
bookList.setBookSize(size+1);//书籍数量+1
System.out.println("增书成功");//提示
}
}
//借阅图书类
package opeartion;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class BorrowOperation implements IOperation{//链接接口
//重写word方法
@Override
public void work(BookList bookList) {
System.out.println("请输入要借阅的书名:");//提示
Scanner scan=new Scanner(System.in);//实例对象
String name=scan.nextLine();//输入书名
int size=bookList.getBookSize();//获取书记数量
for(int i=0;i<size;i++){//检查书籍是否可以借阅
Book book=bookList.getBooks(i);//获取顺序表中的每一本书
if(book.getName().equals(name)){//如有相同名称书籍
if(!book.getisBorrowed()){//如书籍没借出
book.setBorrowed(true);//修改书籍状态
System.out.println("借阅成功");//提示
return ;//提前结束
}else{//如书籍已借出
System.out.println("此书已经借阅出去。");//提示
return ;//提前结束
}
}
}
System.out.println("没有此书,无法借阅");//提示,循环结束没有找到此书
}
}
//显示图书类
package opeartion;
import book.Book;
import book.BookList;
public class DisplayOperation implements IOperation{//链接接口
//重写word方法
@Override
public void work(BookList bookList) {
int size=bookList.getBookSize();//获取书籍数量
for(int i=0;i<size;i++){//遍历顺序表
Book book=bookList.getBooks(i);//获取顺序表i下标书籍
System.out.println(book);//打印获取的书籍
}
}
}```
```java
//退出系统类
package opeartion;
import book.BookList;
public class ExitOperation implements IOperation{//链接接口
//重写word方法
@Override
public void work(BookList bookList) {
System.out.println("退出系统");//提示
System.exit(0);//结束程序
}
}
//查找图书类
package opeartion;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class FindOperation implements IOperation{//链接接口
//重写word方法
@Override
public void work(BookList bookList) {
Scanner scan=new Scanner(System.in);//实例对象
System.out.println("请输入要查找的书名:");//提示
String name=scan.nextLine();//输入书名
int size=bookList.getBookSize();//获取书籍数量
for (int i = 0; i <size ; i++) {//遍历顺序表
Book book=bookList.getBooks(i);//获取顺序表中的每一本书
if(book.getName().equals(name)){//如有相同
System.out.println(book);//打印书籍
return ;//提前结束
}
}
System.out.println("不存在此书");//提示不存在。
}
}
//删除图书类
package opeartion;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class RemoveOperation implements IOperation{//链接接口
//重写word方法
@Override
public void work(BookList bookList) {
System.out.println("请输入要删除的书名:");//提示
Scanner scan=new Scanner(System.in);//实例对象
String name=scan.nextLine();//输入书名
int size=bookList.getBookSize();//获取书籍长度
int pos=-1;//判断作用,覆盖作用
for (int i = 0; i < size; i++) {//遍历顺序表
Book book=bookList.getBooks(i);//获取顺序表中的每一本书
if(book.getName().equals(name)){//如有相同
pos=i;//存储下标
break;//结束循环
}
}
if(pos!=-1){//如找到了,pos则不等于 -1
while(pos<size-1){//循环从要删除书籍位置的下标到书籍数量减1的位置
Book book=bookList.getBooks(pos+1);//获取pos下一个位置的书籍
bookList.setBooks(book,pos);//用pos下一个位置的书籍覆盖当前pos位置的书籍
pos++;//pos到下一个位置
}
bookList.setBookSize(size-1);//全部覆盖结束后书籍数量减1
System.out.println("删除成功");//提示
return ;//提前结束
}
System.out.println("删除失败");//提示顺序表中没有此书,删除失败
}
}
//归还图书类
package opeartion;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class ReturnOperation implements IOperation{//链接接口
//重写word方法
@Override
public void work(BookList bookList) {
System.out.println("请输入要归还的书名:");//提示
Scanner scan=new Scanner(System.in);//实例对象
String name=scan.nextLine();//输入书名
int size=bookList.getBookSize();//获取书籍数量
for(int i=0;i<size;i++){//遍历顺序表
Book book=bookList.getBooks(i);//获取顺序表的每一本书籍
if(book.getName().equals(name)){//如有相同
if(book.getisBorrowed()){//如还未归还
book.setBorrowed(false);//修改当前书籍状态
System.out.println("归还成功");//提示
return ;//提前结束
}else{//如已归还
System.out.println("此书已经归还。");//提示
return ;//提前结束
}
}
}
System.out.println("没有此书,无法归还");//提示顺序表中没有此书。
}
}
//用户类
package user;
import book.BookList;
import opeartion.IOperation;
public class User {
protected String name;//用户名
protected IOperation[] iOperation;//不同用户身份会有不同的操作,这里只提供一个数组。
public User(String name) {
this.name = name;
}//构造方法
public int menu(){//父类方法
return -1;
}
public void doOpeartion(int choice, BookList bookList){
this.iOperation[choice].work(bookList);//通过用户输入的操作数字,对书籍顺序表进行相应的操作。
}
}
//普通用户类
package user;
import opeartion.*;
import java.util.Scanner;
public class NormalUser extends User{//普通用户类继承于用户类
public NormalUser(String name) {//通过父类中提供的操作数组重新提供相应功能能
super(name);//
this.iOperation=new IOperation[]{
new ExitOperation(),//输入0对应退出
new FindOperation(),//输入1对应查找
new BorrowOperation(),//输入2对应借阅
new ReturnOperation()//输入3对应归还
};
}
public 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.退出系统");//提示
Scanner scan=new Scanner(System.in);//实例对象
int choice=scan.nextInt();//输入操作数字
return choice;//返回用户选择的操作数字
}
}
//管理用户类
package user;
import opeartion.*;
import java.util.Scanner;
public class AdminUser extends User{//管理员用户类继承于用户类
public AdminUser(String name) {//通过父类中提供的操作数组重新提供相应功能能
super(name);//
this.iOperation=new IOperation[]{
new ExitOperation(),//输入0对应退出
new FindOperation(),//输入1对应查找
new AddOperation(),//输入2对应新增
new RemoveOperation(),//输入3对应删除
new DisplayOperation()//输入4对应显示
};
}
public 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.退出系统");//提示
Scanner scan=new Scanner(System.in);//实例对象
int choice=scan.nextInt();//输入操作数字
return choice;//返回用户选择的操作数字
}
}
//运行类
package user;
import book.BookList;
import java.util.Scanner;
public class Main {
public static User signin(){//获得用户类型
System.out.println("请输入姓名:");//提示
Scanner scan=new Scanner(System.in);//实例对象
String name=scan.nextLine();//输入用户姓名
System.out.println("请输入身份:1.管理员 2.用户");//提示
int choice=scan.nextInt();//输入用户身份
if(choice==1){//如是管理
return new AdminUser(name);//返回类型为,User父类的AdminUser子类。
}else{//如是普通
return new NormalUser(name);//返回类型为,User父类的NormalUser子类。
}
}
public static void main(String[] args) {//主函数
BookList bookList=new BookList();//实例对象
User user=signin();//得到用户输入的身份
while(true){//死循环,直到用户主动退出
int choice = user.menu();//user的身份取决于菜单的打印,choice保存用户在菜单中选择的操作数字。
user.doOpeartion(choice, bookList);//传入用户输入的数字,传入顺序表
}
}
}