前提:
会使用到的相关的知识:
1.数据类型;变量
2.if,for语句
3.数组
4.方法
5.类与对象
6.封装继承多态
7.抽象类和接口
目录
一、寻找相关对象
Java是一个面向对象的程序语言,需要找到其中的对象
对象:
用户:管理员 ,普通用户
书:BOOK ,书架
操作:操作的是书架;显示图书,借书,还书,删除书,增加书,查找书
1.Book对象
分析:包是用来组建类的,所以将书相关的内容放在一个包的下面
书包括 name(名称);author(作者);price(价格);type(类型:小说,散文等);借书的状态(借出或未借出)
1.Book进行定义:
2.get和set方法
注:由于使用的是private来进行修饰的(封装起来了),所以需要对他提供get和set的方法,来进行创建相关的对象(此时是一个一个进行赋值)
其中不想把isBorrowed进行书写get和set方法
因为:boolean他是有一个默认值是false(而这个的含义就是未借出)
3.构造方法
上述是有需要进行单个函数的调用赋值会使用到
使用构造方法进行赋值会更加方便(在对整个书的定义的时候)
此时也是不需要对isBorrowed书写的,如果写了,则需要对每一次进行传值true或false
4.toString
这些书如果想要被打印出来,用字符串的形式,需要重新写String的方法用字符串的方式进行打印
其中关于是否借出的问题,需要使用三目运算符的方式进行相应的判断
最终打印出书的相关的值
2.BookList(书架)对象
这些书放到书架上,使用数组的方式进行书的组织
1.BookList进行定义
但是其中的最大的储存量是10,用不完最终的10个位置
所以需要用一个变量来标记现在使用了几个位置
2.构造方法:(可能需要初始化一些成员)
可以提前在这个书架上放三本书
只要程序运行起来,这个里面就一定是有这三本书
3.用户user
在用户里面会分为普通用户、管理员用户
所以需要重新定义一个包
其中我们是可以想到这个User这个对象是一定会被继承的,其中的名称管理的具体人,在后面都可能是会被用到的,所以定义的时候注意权限的使用
由于public的范围太大了——有些人没有权限了解到这个,所以不使用
private又太小了,不能进行继承
想在不同包下进行访问使用protected修饰合适
1.User定义
注:权限比较
2.构造方法
当子类继承我们父类的时候,对父类的成员进行初始化,需要使用到构造方法
注:当前的User不能是确定具体的一个类,因为到底是管理员还是普通用户我们是不清楚的
所以可以将User这个类设置成为抽象类
3.AdminUser(管理员对象)
1.AdminUser的定义
管理员是继承了用户对象的
此时发生了报错:1.父类当中又构造方法或有抽象方法,一定要调用这个方法
2.构造方法
4.NormalUser(普通用户)
1.NormalUser的定义以及构造方法的定义:
二、菜单
管理员的菜单和普通用户的菜单是不一样的
1.管理员菜单:
我们还需要输入相关操作:
所以接下来代码为:
2.普通用户菜单:
普通用户也是需要进行输入相关操作的
与上述代码一致
3.登录(创建入口)
创建一个类Main入口
可以把登录的相关内容专门写到一个方法当中
在此处是一个关于人员的输入情况
但是我们要解决一个问题:他是管理员需要给一个管理员的身份,普通用户需要给一个普通用户的身份
注:此时的返回值已经变成User对象
使用的是一个向上转型的操作
此时我们需要打印具体的人员的菜单了
此时发生了报错:
由于父类当中没有menu这个方法,所以需要进行有关多态的设计
此时就没有发行报错了
利用的是多态的思想
三、框架搭构(最重要)
其中统一操作的是书架
可以新启一个包ioperations
但是有一个问题:还是没有办法区分管理员的操作和普通用户的操作
我们可以定义一个接口
然后将所有的操作都实现这个接口
又一问题怎样将对应的数字转化成对应的方法
所以我们需要得到输入的那个数字
将之前void无返回的值改为int类型返回choice这个数值
普通用户与管理用户上述的改法一样
要根据这个里面的返回值看调用哪个对象哪一个方法:
用一个choice进行接收
1.调用哪个对象:从其中的User user=login();这个已经知道要调用哪一个对象
2.调用哪个方法:确定当前对象已经包含了这些方法
调用User来使用哪个方法
此时这个数组没有进行初始化,因为它的大小也是没有办法确定的
而在下面这个里面将对应的人员的操作(是一个对象)放在了数组当中
在返回对应的人的时候,会调用它的构造方法,对构造方法进行了初始化,就知道了他的一个大小情况
在此时choice的值与下标可以进行结合就达到了使用具体的方法的问题
在Main入口当中需要用user来调用相关的方法
传递的是choice:选择的是哪一个操作
bookList:将书架(所有书籍传入)进行操作
四、对应操作
0.退出系统:
该方法比较简单,主要就是调用了一个方法,进行了系统的退出
1.查找图书:
查找图书之前;首先需要书写查找的图书的名称
遍历图书的时候,已知的是数组的大小
但是需要知道的是数组当中的有效值,所以要知道usedSize大小
需要将对应下标的书进行找到,并与输入的那本书进行比较
由于是String类型,所以使用equals进行比较
如果一致所以就会返回true执行下面的操作,将这本书进行打印
如果没有找到这本书,最终就会返回“没有这本书”;
2.新增图书
增加一个图书,就是需要一个图书对象
步骤
1.将所有的书的信息进行增加
要将他增加到书架上
2.放之前;需要进行判满操作
此时需要知道对应的数组的大小,所以就需要写一个方法,将这个大小的值获取出来
3.放到数组的最后一个位置
4.usedSize++;
注:在此时的情况的时候,会出现不能将类型正确输入进去
因为他的回车也是一个字符
所以最直接的办法就是将整个的类型与价格进行调换
3.借阅图书
1.输入借阅的书名
2.在找到之后判断这本书是否被借出,只有没有被借出的图书才可以被借出
3.进行查找,寻找这本书有没有
借书的含义就是相当于将isBorrowed改为true
则就是结束成功
4.显示图书(思路:遍历)
书架其实就是数组;放着若干本书
就是遍历数组就可以了(使用循环方式)
其中的存放的具体的数据是由usedSize决定的
但是由于usedSize是private修饰的,所以需要提供get和set方法给usedSize进行相关的赋值
已知Book[]该数组也是由private修饰的,所以需要使用到get和set的方法
但是此时我们需要得到的是某个下标位置上的数值,所以对于返回值需要进行相关的修改
最终得到以下的代码
得到对应的数组当中的元素,并以字符串的形式进行打印
将最终得到的书进行打印放在show的方法当中
其中的BookList是一个对象,里面有一个数组
5.归还图书:
与借阅图书类似,主要操作的对象都是isBorrowed这个问题:
6.删除图书:
最大的操作是覆盖
1.找到需要删除的数据
2.从后一个往前一个进行覆盖
五、(所有)代码展示
book包:
两个类:Book;BookList
Book类
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 isBorrowed() {
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==true)?"已借出":"未借出") +
'}';
}
}
BookList类
package book;
public class BookList {
private Book[] books = new Book[10];
private int usedSize;//有效的数据几个数【实际放的书的个数】
public BookList(){
books[0] =new Book("三国演义","罗贯中",10,"小说");
books[1] =new Book("西游记","吴承恩",50,"小说");
books[2] =new Book("红楼梦","曹雪芹",16,"小说");
this.usedSize=3;
}
public int getUsedSize() {
return usedSize;
}
public void setUsedSize(int usedSize) {
this.usedSize = usedSize;
}
public Book getBooks(int pos) {
return books[pos];
}
public void setBooks(int pos,Book book) {
this.books[pos] = book;
}
public Book[] getBooks(){
return books;
}
}
ioperations包
七个类:AddOperation;BorrowOperation;DelOperation;ExitOperation;FindOperation;ReturnOperation;ShowOperation;
一个接口:IOPeration;
AddOperation类
package ioperations;
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 scanner = new Scanner(System.in);
int currentSize = bookList.getUsedSize();
if (currentSize == bookList.getBooks().length){
System.out.println("书架满了,不能放了");
return;
}
System.out.println("请输入书名:");
String name = scanner.nextLine();
System.out.println("请输入作者:");
String author = scanner.nextLine();
System.out.println("请输入书的类型:");
String type = scanner.nextLine();
System.out.println("请输入价格:");
int price = scanner.nextInt();
Book newbook = new Book(name,author,price,type);
//3.判断书架有没有这本书
for (int i = 0; i < currentSize; i++) {
Book book = bookList.getBooks(i);
if (book.getName().equals(name)){
System.out.println("有这本书不能插入");
return;
}
}
//4.插入这本书
bookList.setBooks(currentSize,newbook);
bookList.setUsedSize((currentSize+1));
System.out.println("新增图书成功");
}
}
BorrowOperation类
package ioperations;
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 scanner = new Scanner(System.in);
System.out.println("请输入你想要借的书名:");
String name = scanner.nextLine();
int currentSize = bookList.getUsedSize();
for (int i = 0; i < currentSize; i++) {
Book book = bookList.getBooks(i);
if (book.getName().equals(name)) {
if (book.isBorrowed()){
System.out.println("这本书已经被借出了");
return;
}
book.setBorrowed(true);
System.out.println("借阅成功!");
return;
}
}
System.out.println("没有找到要借阅的这本书!");
}
}
DelOperation类
package ioperations;
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 scanner = new Scanner(System.in);
System.out.println("请输入要删除的书名:");
String name = scanner.nextLine();
int currentSize = bookList.getUsedSize();
int pos = -1;
int i = 0;
//找到这本书
for ( i = 0; i < currentSize; i++) {
Book book = bookList.getBooks(i);
if(book.getName().equals(name)){
System.out.println("");
pos = i;
break;
}
}
if (i==currentSize){
System.out.println("没有要找的书!");
return;
}
//开始删除
for (int j = pos; j < currentSize-1; j++) {
Book book = bookList.getBooks(j+1);
bookList.setBooks(j,book);
}
bookList.setUsedSize(currentSize-1);
System.out.println("删除成功!");
}
}
ExitOperation类
package ioperations;
import book.BookList;
public class ExitOperation implements IOPeration{
@Override
public void work(BookList bookList){
System.out.println("退出图书…………");
System.exit(0);
}
}
FindOperation类
package ioperations;
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 scanner = new Scanner(System.in);
System.out.println("请输入你的书名:");
String name = scanner.nextLine();
int currentSize = bookList.getUsedSize();
for (int i = 0; i < currentSize; i++) {
Book book = bookList.getBooks(i);
if(book.getName().equals(name)){
System.out.println("找到这本书");
System.out.println(book);
return;
}
}
System.out.println("没有这本书");
}
}
ReturnOperation类
package ioperations;
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 scanner = new Scanner(System.in);
System.out.println("请输入你想要还的书名:");
String name = scanner.nextLine();
int currentSize = bookList.getUsedSize();
for (int i = 0; i < currentSize; i++) {
Book book = bookList.getBooks(i);
if (book.getName().equals(name)) {
if (book.isBorrowed()) {
book.setBorrowed(false);
System.out.println("归还成功!");
return;
}
}
}
System.out.println("没有找到要归还的图书!");
}
}
ShowOperation类
package ioperations;
import book.Book;
import book.BookList;
public class ShowOperation 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.getBooks(i);
System.out.println(book);
}
}
}
IOPeration接口
package ioperations;
import book.BookList;
public interface IOPeration {
default void work(BookList bookList){
System.out.println("图书操作…………");
}
}
user包
三个类:AdminUser;NormalUser;User
AdminUser类
package user;
import ioperations.*;
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 ShowOperation()
};
}
public int menu(){
System.out.println("*******管理员菜单*******");
System.out.println("1.查找图书");
System.out.println("2.新增图书");
System.out.println("3.删除图书");
System.out.println("4.显示图书");
System.out.println("0.退出系统");
System.out.println("***********************");
Scanner scanner = new Scanner(System.in);
System.out.println("请输入你的操作");
int choice = scanner.nextInt();
return choice;
}
}
NormalUser类
package user;
import ioperations.*;
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("1.查找图书");
System.out.println("2.借阅图书");
System.out.println("3.归还图书");
System.out.println("0.退出系统");
System.out.println("***********************");
Scanner scanner = new Scanner(System.in);
System.out.println("请输入你的操作");
int choice = scanner.nextInt();
return choice;
}
}
User类
package user;
import book.BookList;
import ioperations.IOPeration;
public abstract class User {
protected String name;
protected IOPeration[] ioPerations;
public User(String name){
this.name = name;
}
public abstract int menu();
public void doIoperation(int choice, BookList bookList){
ioPerations[choice].work(bookList);
}
}
Main类(程序的入口)
import book.BookList;
import ioperations.IOPeration;
import user.AdminUser;
import user.NormalUser;
import user.User;
import java.util.Scanner;
public class Main {
public static User login(){
Scanner scanner = new Scanner(System.in);
System.out.println("请输入你的姓名:");
String name = scanner.nextLine();
System.out.println("请输入你的身份:1.管理员 2.普通用户");
int choice = scanner.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.doIoperation(choice, bookList);
}
//IOPeration[] ioPerations={};
}
}
六、后续扩展:
1.每次运行的程序,新增的图书,可能就没有了,想要存储,有一些几个思路:
a.换成文件存储到文件当中,磁盘上,涉及到文件读取
b.换成数据库,将数据存储到MySQL当中,存储在磁盘当中,每次运行程序读取数据库就可以了
2.还可以实现为WEB端的练习
a.加入网页
b.加入框架
3.功能上也可以进行扩展
书名排序
价格排序
作者名排序
总结:这一版是很完整的一部分,非常非常的详细,每一部分都是非常详细的,很适合对所有知识进行的整理总结和归纳。