
作者:敲代码の流川枫
博客主页:流川枫的博客
专栏:和我一起学java
语录:Stay hungry stay foolish
工欲善其事必先利其器,给大家介绍一款超牛的斩获大厂offer利器——牛客网
文章目录
以面向对象的思想找到并且抽象出图书管理所需要的对象,再分析这些类和对象应该具有哪些属性和方法,对象通过“属性”和“方法”来分别对应事物所具有的静态属性和动态属性,最后分析类和类之间具体有什么关系,通过各个对象间的交互,使用对象、类、继承、封装、接口等基本概念完成序设计
抽象出来的对象有:书,书架,用户等,分别建立三个包管理
- package book;
- public class Book {
- //书名
- private String name;
- //作者
- private String author;
- //价格
- private int price;
- //类型
- private String type;
- //状态
- private boolean isBorrow;
- public Book(String name, String author, int 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 + '\'' +
- ((isBorrow==true)?"已借出":"未借出")+
- '}';
- }
- 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 isBorrow() {
- return isBorrow;
- }
-
- public void setBorrow(boolean borrow) {
- isBorrow = borrow;
- }
- }
先存储三本书:

- package book;
-
- public class BookList {
- private Book[] books = new Book[10];
- private int usedSize;//存储当前书的个数
-
- public BookList() {
-
- books[0] = new Book("三国演义","罗贯中",90,"小说");
- books[1] = new Book("红楼梦","曹雪芹",80,"小说");
- books[2] = new Book("水浒传","施耐庵",70,"小说");
-
- this.usedSize = 3;
- }
-
- public int getUsedSize() {
- return usedSize;
- }
-
- public void setUsedSize(int usedSize) {
- this.usedSize = usedSize;
- }
- public Book getPos(int pos){
- return books[pos];
-
- }
- //存储一本书到指定的位置
- public void setBooks(Book book,int pos){
- books[pos] = book;
- }
- }
- //将对数组的操作写到一个接口中
- package operation;
-
- import book.BookList;
-
- public interface IOperation {
- void work(BookList bookList);
- }
- package operation;
-
- import book.Book;
- import book.BookList;
-
- import java.util.Scanner;
-
- public class AddOperation implements IOperation{
- //添加图书
- public void work(BookList bookList){
- System.out.println("添加图书");
-
- System.out.println("请输入书名");
- Scanner scanner = new Scanner(System.in);
- String name = scanner.nextLine();
- System.out.println("请输入作者");
- String author = scanner.nextLine();
- System.out.println("请输入价格");
- int price = scanner.nextInt();
- //读取回车
- scanner.nextLine();
- System.out.println("请输入类型");
- String type = scanner.nextLine();
-
- Book book = new Book(name,author,price,type);
- //获取可以存放的位置
- int currentSize = bookList.getUsedSize();
- //放到指定位置
- bookList.setBooks(book,currentSize);
- //书的个数加一
- bookList.setUsedSize(currentSize+1);
- }
- }
- package operation;
-
- import book.Book;
- import book.BookList;
-
- import java.util.Scanner;
-
- public class BorrowOperation implements IOperation{
- public void work(BookList bookList){
- System.out.println("借阅图书");
- System.out.println("请输入书名");
- Scanner scanner = new Scanner(System.in);
- String name = scanner.nextLine();
- //遍历是否有要借阅的书并记录下标
- int index = -1;
- int currentSize = bookList.getUsedSize();
- for (int i = 0; i < currentSize ; i++) {
- Book book = bookList.getPos(i);
- if(name.equals(book.getName())){
- if(book.isBorrow()){
- System.out.println("已借出");
- }
- else{
- book.setBorrow(true);
- System.out.println("借阅成功");
- }
- return;
- }
- }
- System.out.println("没有要借阅的书");
- }
- }
- package operation;
-
- import book.Book;
- import book.BookList;
-
- import java.util.Scanner;
-
- public class DelOperation implements IOperation{
- public void work(BookList bookList){
- System.out.println("删除图书");
- System.out.println("请输入书名");
- Scanner scanner = new Scanner(System.in);
- String name = scanner.nextLine();
-
- //遍历是否有要删除的书并记录下标
- int index = -1;
- int currentSize = bookList.getUsedSize();
- for (int i = 0; i < currentSize ; i++) {
- Book book = bookList.getPos(i);
- if(name.equals(book.getName())){
- index = i;
- break;
- }
- }
- if(index == -1){
- System.out.println("没有要删除的书");
- return ;
- }
- for (int i = index; i < currentSize-1 ; i++) {
-
- Book book = bookList.getPos(i+1);
- bookList.setBooks(book,i);
- }
-
- bookList.setBooks(null,currentSize-1);
-
- //重置有效长度
- bookList.setUsedSize(currentSize-1);
- System.out.println("删除成功");
- }
- }
假设有四本书,那么i+1最大值就是3,即 i < currentSize-1才不会越界

删除书之后要置空,否则可能会出现内存泄漏
一个对象没有人引用才会回收
- package operation;
-
- import book.Book;
- import book.BookList;
-
- public class DisplayOperation implements IOperation{
- 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);
- }
- }
- }
- package operation;
-
- import book.BookList;
- import com.sun.xml.internal.ws.api.model.wsdl.WSDLOutput;
-
- public class ExitOperation implements IOperation{
- public void work(BookList bookList){
- System.out.println("退出系统");
- System.exit(0);
- }
- }
- package operation;
-
- import book.Book;
- import book.BookList;
-
- import java.util.Scanner;
-
- public class FindOperation implements IOperation{
- //查找图书
- public void work(BookList bookList){
- System.out.println("查找图书");
- System.out.println("请输入书名:");
- Scanner scanner = new Scanner(System.in);
- String name = scanner.nextLine();
- int currentSize = bookList.getUsedSize();
- for (int i = 0; i < currentSize ; i++) {
- Book book = bookList.getPos(i);
- if(name.equals(book.getName())){
- System.out.println(book);
- return;
- }
- }
- System.out.println("没有这本书");
- }
- }
- package operation;
-
- import book.Book;
- import book.BookList;
-
- import java.util.Scanner;
-
- public class ReturnOperation implements IOperation{
- public void work(BookList bookList){
-
- System.out.println("归还图书");
- System.out.println("请输入书名");
- Scanner scanner = new Scanner(System.in);
- String name = scanner.nextLine();
-
- int index = -1;
- int currentSize = bookList.getUsedSize();
- for (int i = 0; i < currentSize ; i++) {
- Book book = bookList.getPos(i);
- if(name.equals(book.getName())){
- book.setBorrow(false);
- System.out.println("归还成功");
- return;
- }
- }
- System.out.println("没有要归还的书");
- }
-
-
- }
- 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){
- iOperations[choice].work(bookList);
-
- }
- }

需要写一个操作接口数组的方法doOperation()
- package user;
-
- 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("*************");
- System.out.println("hello"+name+"欢迎来到图书管理");
- System.out.println("1. 查找图书");
- System.out.println("2. 新增图书");
- System.out.println("3. 删除图书");
- System.out.println("4. 显示图书");
- System.out.println("0. 退出系统");
- System.out.println("*************");
- System.out.println("请输入你的操作:");
-
- Scanner scanner = new Scanner(System.in);
- int choice = scanner.nextInt();
- return choice;
-
- }
- }
- 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()
-
- };
- }
-
- public int menu() {
- System.out.println("*************");
- System.out.println("hello" + name + "欢迎来到图书管理");
- System.out.println("1. 查找图书");
- System.out.println("2. 借阅图书");
- System.out.println("3. 归还图书");
- System.out.println("0. 退出系统");
- System.out.println("*************");
- System.out.println("请输入你的操作:");
- Scanner scanner = new Scanner(System.in);
- int choice = scanner.nextInt();
- return choice;
- }
-
- }
- 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 scanner = new Scanner(System.in);
- String userName = scanner.nextLine();
- System.out.println("请输入你的身份:1. 管理员 2. 用户");
- int choice = scanner.nextInt();
- if(choice==1){
- return new AdminUser(userName);
- }
- else{
- return new NormalUser(userName);
- }
- }
-
- public static void main(String[] args) {
- //先放三本书
- BookList bookList = new BookList();
- //登录
- User user = login();
- while(true){
- int choice = user.menu();
- user.doOperation(choice,bookList);
- }
- }
- }

当引用的对象不同时,会打印不同的菜单
“ 本期的分享就到这里了, 记得给博主一个三连哈,你的支持是我创作的最大动力!
