目录
代码讲解:http://t.csdn.cn/k2qVO
▮ 交互对象
▪Book
public class Book { private String name; //书名 private String author; //作者 private int price; //价格 private String type; //种类 private boolean isBorrowing; //借阅状态 //构造方法 public Book(String name, String author, int price, String type) { this.name = name; this.author = author; this.price = price; this.type = type; } //默认初始化,构造方法 public Book() { this.name = "书架为空"; this.author = "书架为空"; this.price = 0; this.type = "书架为空"; } //toString输出成员属性 @Override public String toString() { return "Book{" + "name='" + name + '\'' + ", author='" + author + '\'' + ", price=" + price + ", type='" + type + '\'' + ", Borrow='"+ (isBorrowing ?"已被借阅" :"未被借阅") + '\'' + //这个地方是自行添加的,编译器不会自动生成 '}'; } 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 isBorrowing() { return isBorrowing; } public void setBorrowing(boolean borrowing) { isBorrowing = borrowing; } }
▪Bookcase
public class Bookcase { private static final int BOOKCASE_SIZE = 10; //书架容量,用final修饰,不可修改 private Book[] booklist = new Book[BOOKCASE_SIZE]; //书单 private int usednumber; //使用书架的书本数量,即书架上有几本书 //默认构造方法 public Bookcase() { //书架上的的默认放置的书本 booklist[0] = new Book("三国演义", "罗贯中", 19, "小说"); booklist[1] = new Book("西游记", "吴承恩", 28, "小说"); booklist[2] = new Book("红楼梦", "曹雪芹", 39, "小说"); this.usednumber = 3; } //功能:根据下标来找到图书 public Book getBooks(int pos) { //参数:下标 return booklist[pos]; //返回:下标对应的Book } //功能:更换下标处的书籍 public void setBooks(int pos, Book book) { //参数:下标,新的BOOK booklist[pos] = book; } //功能:得到书架上书本的个数 public int getUsednumber() { return usednumber; } //功能:修改书架上书本的个数 public void setUsednumber(int usednumber) { this.usednumber = usednumber; } }
▪User
public class User { private String name; //用户名 public Ioperation[] operation; //这是一个接口数组,装的是用户能进行的行为行为 //构造方法,非默认 public User(String name){ this.name = name; } //功能:打印菜单并且接收用户的选择,需要子类去重写 public int nume (){ return 0; } //输出用户名 public String gteName(){ return this.name; } }
▪AdminiUser
public class AdminiUser extends User{ public int nume(){ System.out.println('\n'); Scanner sc = new Scanner(System.in); System.out.println("管理员:"+super.gteName()+",欢迎进入图书管理系统"); System.out.println("0.退出系统"); System.out.println("1.添加书籍"); System.out.println("2.删减书籍"); System.out.println("3.展示书籍"); System.out.println("请选择你的操作:"); return sc.nextInt(); } //构造方法,非默认 public AdminiUser(String name){ super(name); operation = new Ioperation[]{ new ExitOperation(), new AddOperation(), new DelOperation(), new DisOperation(), }; } }
▪ NomalUser
public class NomalUser extends User{ public int nume(){ System.out.println('\n'); Scanner sc = new Scanner(System.in); System.out.println("普通人员:"+super.gteName()+",欢迎进入图书管理系统"); System.out.println("0.退出系统"); System.out.println("1.借阅书籍"); System.out.println("2.归还书籍"); System.out.println("3.查找书籍"); System.out.println("请选择你的操作:"); return sc.nextInt(); } public NomalUser(String name){ super(name); super.operation = new Ioperation[]{ new ExitOperation(), new BorrowOperation(), new ReturnOperation(), new FindOperation(), }; } }
▮接口与实现
▪接口
public interface Ioperation { //功能:这是一个抽象方法,它的功能由七大类来重写实现 void work(Bookcase bookcase); // 参数:Bookcase的一个实例对象,无返回 }
▪ ExitOperation
public class ExitOperation implements Ioperation{ //这个类实现了接口 @Override //重写的标志 public void work(Bookcase bookcase) { System.out.println("退出系统"); System.exit(0); //调用了System类中的exit方法,传入0表示程序正常结束 } }
▪AddOperation
public class AddOperation implements Ioperation{ //这个类实现了接口 @Override public void work(Bookcase bookcase){ //传入一个Bookcase的对象 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("请输入书籍类型"); String type = sc.nextLine(); System.out.println("请输入书籍价格"); int price = sc.nextInt(); //这里是整形,上面的都是字符串 //调用对象bookcase的方法得到书架上书籍的数量 int usednumber = bookcase.getUsednumber(); //调用对象bookcase的setBooks方法,new了一个新的书籍放进书架 bookcase.setBooks(usednumber,new Book(name,author,price,type)); //因为数组下标是从0开始的,所以usednumber作为索引时,正好指向一个空位 //添加了一本书籍后,书架上书籍的数量加1 bookcase.setUsednumber(usednumber+1); System.out.println("添加成功"); } }
▪BorrowOperation
public class BorrowOperation implements Ioperation{ //这个类实现了接口 @Override public void work(Bookcase bookcase) { //传入了一个类型为Bookcase的对象 System.out.println("-----借阅书籍-----"); //输入借阅书籍的名称 Scanner sc = new Scanner(System.in); System.out.println("请输入借阅书籍名称"); String name = sc.nextLine(); //调用对象bookcase的方法得到书架上书籍的数量,作为遍历结束的条件 int usednumber = bookcase.getUsednumber(); //遍历书架里所有的书籍 for(int i=0; i<usednumber; i++){ //在书架中寻找与借阅书籍名称相同的书籍 if(name.equals(bookcase.getBooks(i).getName())){ //name.equals(str): 调用了字符串name的实例方法,来比较name是否与str同名 //bookcase.getBooks(i): 找到下标i对应的Book对象 //.getName(): 得到此Book对象的"书名"属性,这是一个字符串属性,即str System.out.println("借阅成功"); //把这本书的属性改为“已借阅” Book book = bookcase.getBooks(i); book.setBorrowing(true); System.out.println(book); //若找到此书,则直接结束这个方法,不执行下方"未查到此书"的打印 return; } } System.out.println("未查到此书"); } }
▪DisOperation
public class DisOperation implements Ioperation{ //这个类实现了接口 @Override public void work(Bookcase bookcase) { System.out.println("-----展示书籍-----"); //调用对象bookcase的方法得到书架上书籍的数量,作为遍历结束的条件 int usednumber = bookcase.getUsednumber(); for(int i=0; i<usednumber; i++){ //使用println(对象)来打印对象的所有属性, System.out.println(bookcase.getBooks(i)); //bookcase.getBooks(i): 找到下标i对应的Book对象 //println(对象)等同于调用对象的toString()方法,所以对象内部要重写toString } //书架书籍为空的情况 if(usednumber == 0){ System.out.println("图书馆书籍为空"); return; } } }
▪ReturnOperation
public class ReturnOperation implements Ioperation{ //这个类实现了接口 @Override public void work(Bookcase bookcase) { System.out.println("-----归还书籍-----"); //输入归还书籍的名称 Scanner sc = new Scanner(System.in); System.out.println("请输入归还书籍名称"); String name = sc.nextLine(); //调用对象bookcase的方法得到书架上书籍的数量,作为遍历结束的条件 int usednumber = bookcase.getUsednumber(); for(int i=0; i<usednumber; i++){ //在书架中寻找与借阅书籍名称相同的书籍 if(name.equals(bookcase.getBooks(i).getName())){ //name.equals(str): 调用了字符串name的实例方法,来比较name是否与str同名 //bookcase.getBooks(i): 找到下标i对应的Book对象 //.getName(): 得到此Book对象的"书名"属性,这是一个字符串属性,即str System.out.println("归还成功"); //把这本书的属性改为“未借阅” Book book = bookcase.getBooks(i); book.setBorrowing(false); System.out.println(book); //若找到此书,则直接结束这个方法,不执行下方"图书馆未收藏此书"的打印 return; } } System.out.println("图书馆未收藏此书"); } }
▪FindOperation
public class FindOperation implements Ioperation{ //这个类实现了接口 @Override public void work(Bookcase bookcase) { System.out.println("-----查找书籍-----"); //输入查找书籍的名称 Scanner sc = new Scanner(System.in); System.out.println("请输入查找书籍名称"); String name = sc.nextLine(); //调用对象bookcase的方法得到书架上书籍的数量,作为遍历结束的条件 int usednumber = bookcase.getUsednumber(); if(usednumber == 0){ System.out.println("图书馆书籍为空"); return; } for(int i=0; i<usednumber; i++){ //在书架中寻找与借阅书籍名称相同的书籍 if(name.equals(bookcase.getBooks(i).getName())){ //name.equals(str): 调用了字符串name的实例方法,来比较name是否与str同名 //bookcase.getBooks(i): 找到下标i对应的Book对象 //.getName(): 得到此Book对象的"书名"属性,这是一个字符串属性,即str System.out.println("查找成功"); //使用println(对象)来打印对象的所有属性, System.out.println(bookcase.getBooks(i)); //bookcase.getBooks(i): 找到下标i对应的Book对象 //println(对象)等同于调用对象的toString()方法,所以对象内部要重写toString //若找到此书,则直接结束这个方法,不执行下方"未查到此书"的打印 return; } } System.out.println("未查到此书"); } }
▪DelOperation
public class DelOperation implements Ioperation{ //这个类实现了接口 public void work(Bookcase bookcase){ System.out.println("-----删除书籍-----"); //输入删除书籍的名称 Scanner sc = new Scanner(System.in); System.out.println("请输入删除书籍名称"); String name = sc.nextLine(); //调用对象bookcase的方法得到书架上书籍的数量,作为遍历结束的条件 int usednumber = bookcase.getUsednumber(); if(usednumber == 0){ System.out.println("图书馆书籍为空"); return; } for(int i=0; i<usednumber; i++){ //在书架中寻找与借阅书籍名称相同的书籍 if(name.equals(bookcase.getBooks(i).getName())){ //name.equals(str): 调用了字符串name的实例方法,来比较name是否与str同名 //bookcase.getBooks(i): 找到下标i对应的Book对象 //.getName(): 得到此Book对象的"书名"属性,这是一个字符串属性,即str System.out.println("删除成功"); for(;i<usednumber;i++){ //用下标i+1的书籍来覆盖下标为i的书籍,既实现了对书籍的删除,又补上了删除后的空缺部分 bookcase.setBooks(i,bookcase.getBooks(i+1)); } //因为i后面的书籍都被前移,最后的一本书籍会多余一本,要被清空 bookcase.setBooks(usednumber,null); //书籍数量-1 bookcase.setUsednumber(usednumber -= 1); } } } }
▮Main
public class Main { //功能:根据选项的不同,返回子类管理员或普通人 public static User chose (){ //输入User的name属性 System.out.println("请输入你的名字"); Scanner sc = new Scanner(System.in); String name = sc.nextLine(); //选择身份 System.out.println("请输入你的身份:1.管理员 2.普通人员"); int i = sc.nextInt(); //返回子类:管理员 if(i == 1){ return new AdminiUser(name); //new了一个对象 //返回子类:普通人 }else if(i == 2){ return new NomalUser(name); } return null; } //mian()函数 public static void main(String[] args) { //创建一个书架对象 Bookcase Bookcase = new Bookcase(); //创建一个父类User来接收子类,实现向上转型 User user = chose(); int chose = 0; //循环执行程序 while(true){ //nume()是一个被子类所重写的方法,这里实现了动态绑定,执行的是子类的nume方法 //chose是一个整数,来接收你的选择 chose = user.nume(); //根据你的选择来执行对应的行为 user.operation[chose].work(Bookcase);//chose作为下标,与对应的选项想呼应 } } }