目录
当我们学习完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;}@Overridepublic 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 {@Overridepublic 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 {@Overridepublic 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 {@Overridepublic 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 {@Overridepublic 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 {@Overridepublic 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 {@Overridepublic 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 {@Overridepublic 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中所学的知识结合起来做的一个小项目。