【JavaSE】图书系统
目录
当我们学习完Java的语法后,可以写一个简单的项目进行总结梳理一下,这个项目也会用到我们所学过的Java所有的语法知识:目录是咱们用文件夹包装起来的类。
1.book
在面向对象体系中,提出了一个软件包的概念,即:为了更好的管理类,把多个类收集在一起成为一组,称为软件包。
图书系统无非就是由使用者,工具,被使用者组成,谁被使用呢,无非就是图书,那图书又是存放在哪里呢,那就是书架,所以我们把书和书架可以归类为被使用者,用一个包来封装它们。
我们在进行下一步前先得学一个知识点,那就是类。
类是用来对一个实体(对象)来进行描述的,主要描述该实体(对象)具有哪些属性(外观尺寸等),哪些功能(用来干 啥),描述完成后计算机就可以识别了。
类中包含的内容称为类的成员。属性主要是用来描述类的,称之为类的成员属性或者类成员变量。方法主要说明类 具有哪些功能,称为类的成员方法。
就比如一个洗衣机可以做类,里面成员有它的属性,也有它的功能
class WashMachine{
public String brand; // 品牌
public String type; // 型号
public double weight; // 重量
public double length; // 长
public double width; // 宽
public double height; // 高
public String color; // 颜色
public void washClothes(){ // 洗衣服
System.out.println("洗衣功能");
}
public void dryClothes(){ // 脱水
System.out.println("脱水功能");
}
public void setTime(){ // 定时
System.out.println("定时功能");
}
}
当我们简单了解了一下类之后,接下来,咱们在这个包底下创建俩个类,名字分别是书和书架。
1.1Book
如下代码,我们先定义书的属性,名字,作者,价格,类型。这里的isBorrow是用来判断书是否被借出的标记变量。
下面的public Book是构造函数,就是当book被创建时,需要对这些变量进行初始化。
下面的所有方法都是对咱们的属性成员进行基本操作的方法,可以用快捷键一键生成,可以节约很多时间。
以下代码运用到的第一个知识点就是继承(往下滑会有简单描述)中的this。
this引用指向当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过该引用去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。
package book;
public class Book {
private String name;
private String author;
private int price;
private String tyle;
private boolean isBorrow;
public Book(String name, String author, int price, String tyle) {
this.name = name;
this.author = author;
this.price = price;
this.tyle = tyle;
}
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 getTyle() {
return tyle;
}
public void setTyle(String tyle) {
this.tyle = tyle;
}
public boolean isBorrow() {
return isBorrow;
}
public void setBorrow(boolean borrow) {
isBorrow = borrow;
}
@Override
public String toString() {
return "Book{" +
"name='" + name + '\'' +
", author='" + author + '\'' +
", price=" + price +
", type='" + tyle + '\'' +
((isBorrow == true) ? " 已经借出" : " 未被借出") +
/*", isBorrowed=" + isBorrowed +*/
'}';
}
}
这里最后一个方法是重写方法,因为我们所有的类都默认继承Object类,toString是该类底下的一种方法,我们只需要对其进行重写即可使用这个方法,这里运用的了对isBorrow进行三目运算来判断书是否被借出。
继承(inheritance)机制:是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特 性 的基础上进行扩展,增加新功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构, 体现了 由简单到复杂的认知过程。继承主要解决的问题是:共性的抽取,实现代码复用。 例如:狗和猫都是动物,那么我们就可以将共性的内容进行抽取,然后采用继承的思想来达到共用。
1.2BookList
这里我们创建一个可以放十本书的书架,默认先放好三本书,下面方法同样是对我们的成员进行操作的方法。
package book;
public class BookList {
private Book[] books;
private int useSize;
public BookList() {
this.books = new Book[10];
//放好树!!
this.books[0] = new Book("三国演义","罗贯中",10,"小说");
this.books[1] = new Book("西游记","吴承恩",9,"小说");
this.books[2] = new Book("红楼梦","曹雪芹",19,"小说");
this.useSize = 3;
}
public int getUseSize() {
return useSize;
}
public void setUseSize(int useSize) {
this.useSize = useSize;
}
public Book getBooks(int pos) {
return books[pos];
}
public Book setBooks(int pos, Book book) {
return books[pos]=book;
}
public Book[] getBooks() {
return books;
}
public void setBooks(Book[] books) {
this.books = books;
}
}
2.operation
这个包我们创建过来是为了把所有功能类分装在一起,以便后期的代码扩展性能更好地表达。
2.1AddOperattion
package operation;
import book.BookList;
import book.Book;
import java.util.Scanner;
public class AddOperation implements IOPeration {
@Override
public void work(BookList bookList) {
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();
Book book=new Book(name,author,price,type);
int currentSize=bookList.getUseSize();
for(int i=0;i<currentSize;i++){
Book book1=bookList.getBooks(i);
if(book1.getName().equals(name)){
System.out.println("有这本书,不进行存放了!");
return;
}
}
if(bookList.getBooks().length==currentSize){
System.out.println("书架满了!");
}
else{
bookList.setBooks(currentSize,book);
bookList.setUseSize(currentSize+1);
}
}
}
2.2BorrowOperation
package operation;
import book.BookList;
import book.Book;
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.getUseSize();
for (int i = 0; i < currentSize; i++) {
Book book=bookList.getBooks(i);
if(book.getName().equals(name)){
book.setBorrow(true);
System.out.println("借阅成功!");
System.out.println(book);
return;
}
}
System.out.println("你借阅的图书不存在!!");
}
}
2.3DelOperation
package operation;
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 pos=0;
int currentSize=bookList.getUseSize();
int i = 0;
for (; i < currentSize; i++) {
Book book=bookList.getBooks(i);
if (book.getName().equals(name)) {
pos=i;
break;
}
}
if(i==currentSize){
System.out.println("没有你要删除的书!!");
}
for(;pos<currentSize-1;pos++){
Book book=bookList.getBooks(pos);
bookList.setBooks(pos,book);
}
bookList.setBooks(pos,null);
bookList.setUseSize(currentSize-1);
}
}
2.4ExitOperation
package operation;
import book.BookList;
public class ExitOperation implements IOPeration {
@Override
public void work(BookList bookList) {
System.out.println("退出图书!!!");
System.exit(0);
}
}
2.5FindOperation
package operation;
import book.BookList;
import book.Book;
import java.util.Scanner;
public class FindOperation implements IOPeration {
@Override
public void work(BookList bookList) {
System.out.println("查找图书!!!");
Scanner sc=new Scanner(System.in);
String name=sc.nextLine();
int currentSize=bookList.getUseSize();
for(int i=0;i<currentSize;i++){
Book book=bookList.getBooks(i);
if(book.getName().equals(name)){
System.out.println("找到了这本书,信息如下:");
return;
}
}
System.out.println("没有找到这本书!");
}
}
2.6IOperation
咱们这里用到了一个接口,可以让主其他类通过这个接口来链接所有功能类,只要其他被链接的类名+implements+接口名,然后重写接口的方法,在其中进行逻辑操作即可串接上这个类。
接口就是公共的行为规范标准,大家在实现时,只要符合规范标准,就可以通用。 在Java中,接口可以看成是:多个类的公共规范,是一种引用数据类型。
package operation;
import book.BookList;
public interface IOPeration {
void work(BookList bookList);
}
2.7ReturnOperation
package operation;
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.getUseSize();
for (int i = 0; i < currentSize; i++) {
Book book=bookList.getBooks(i);
if(book.getName().equals(name)){
book.setBorrow(false);
System.out.println("归还成功!");
System.out.println(book);
return;
}
}
System.out.println("你归还的图书不存在!!");
}
}
2.8ShowOperation
package operation;
import book.Book;
import book.BookList;
public class ShowOperation implements IOPeration {
@Override
public void work(BookList bookList) {
System.out.println("打印图书!!!");
int currentSize = bookList.getUseSize();
for (int i = 0; i < currentSize; i++) {
Book book = bookList.getBooks(i);
System.out.println(book);
}
}
}
3.user
这里我们的使用者分为俩类人:管理员和普通用户
这些人也用一个包集中起来,后续方便拓展。
3.1AdminUser
这里当我们帮助父类的构造方法时,需要运用到super关键字。
由于设计不好,或者因场景需要,子类和父类中可能会存在相同名称的成员,如果要在子类方法中访问父类同名成 员时,该如何操作?直接访问是无法做到的,Java提供了super关键字,该关键字主要作用:在子类方法中访问父类的成员。
package user;
import java.util.Scanner;
import operation.*;
public class AdminUser extends User {
public AdminUser(String name) {
super(name);
this.ioPerations = new IOPeration[]{
new ExitOperation(),
new AddOperation(),
new FindOperation(),
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;
}
}
3.2NormaUser
package user;
import book.BookList;
import operation.*;
import java.util.Scanner;
public class NormaUser extends User {
public NormaUser(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;
}
}
4.Main
众所周知,每一个项目中都必须有个main函数操作整个项目,这里我们将main单独写一个类会更加方便,因为我们每次运行程序都会有些重复的代码。
import book.BookList;
import user.AdminUser;
import user.NormaUser;
import user.User;
import java.util.Scanner;
public class Main {
public static User login(){
System.out.println("请输入你的姓名");
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
System.out.print("请输入你的身份,1:管理员 2:普通用户->");
int choice = scanner.nextInt();
if(choice == 1){
return new AdminUser(name);
}
else{
return new NormaUser(name);
}
}
public static void main(String[] args) {
BookList bookList = new BookList();
User user=login();
while(true){
int choice= user.menu();
System.out.println("choice :"+ choice);
user.doOperation(choice,bookList);
}
}
}
5.总结
在整个图书系统中我们有运用到许多知识,有数组,类和对象,继承,多态,接口,抽象类,还有一些比较灵活的算法,这就是我JavaSE中所学的知识结合起来做的一个小项目。
原文地址:https://blog.csdn.net/2301_80302655/article/details/142934121
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!