网站建设服装市场分析报告/站内推广有哪些方式
一、图书管理系统菜单
🍓管理员菜单
1.查找图书
2.新增图书
3.删除图书
4.显示图书
0.退出系统
---------------------------------------------------------------------------------------------------------------------------------
🌼用户菜单
1.查找图书
2.借阅图书
3.归还图书
0.退出系统
二、实现基本框架
先建立一个新的文件,命名为TestBook,在文件内建立两个包,分别命名为user(用户)、book(图书)。
先写book相关的代码。于是,我们先在book包中新建一个java类,名为:Book。
显示图书时,我们希望它能显示出所有图书的名称、作者、价格、类型和图书目前是否借出。
private String name;//书名
private String author;//作者
private int price;//价格
private String type;//类型
private boolean isBorrowed;//是否被借出,初始值是false,在构造方法中不用写
右击鼠标,选择Generate,选择Getter and Setter 选项,点击shift,点最后一个,就能全选:
自动生成:
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;
}
再写它们的构造方法:
当我们新增一本图书时,它默认就是未被借出的,所以不用构造方法。
快捷键:alt+insert。按ctrl,可以多选,直接生成下面代码块:
public Book(String name, String author, int price, String type) {//构造方法
this.name = name;
this.author = author;
this.price = price;
this.type = type;
}
我们再右键选择Generate,选择ToString,全选,点OK,自动生成:
@Override
public String toString() {
return "Book{" +
"name='" + name + '\'' +
", author='" + author + '\'' +
", price=" + price +
", type='" + type + '\'' +
", isBorrowed=" + isBorrowed +
'}';
}
此时,在book包中新建一个类:BookList(书架):
在这个书架中,我们希望能在里面固定的位置放书,并且能知道放了几本书:
private Book[] books=new Book[10];//这个书架可以放十本书
private int usedSize;//记录下当前book数组中有几本书
然后依旧是右键Generate ,getter and setter,自动生成:
当前界面:
我们还记得在C语言中,我们用到的 define,用define语句来定义一个常量,同理,我们这边也可以定义一个能放多少本书的常量:
private static final int DEFAULT_SIZE=10;
private Book[] books=new Book[DEFAULT_SIZE];
我们这边就是先按思路慢慢写,慢慢补充。在后面,我会放完整的代码。
book包已经告一段落了,现在来写user包。
我们在user包中新建三个类:AdminUser(管理员)、NormalUser(用户)、User。
NormalUser、AdminUser,这也就是我们图书管理系统面对的两个对象了,管理员和用户,他们具有一些相同的属性。我们就可以写一个User类,让两个类去继承,来省一些代码了。
🥗我们先写User类叭~
package user;
public class User {
protected String name;//名字.这边的protect代表的是名字的权限。如果是private,它只能在同一个包的同一类使用。就不能让AdminUser类继承了。
//写public的话,权限太大了,不是很好。
public User(String name) {//构造方法
this.name = name;
}
}
所以在AdminUser类中:
package user;
public class AdminUser extends User{
public AdminUser(String name) {
super(name);
}
}
可以直接用快捷键,alt+insert,直接生成构造方法。
同理,NormalUser类中:
package user;
public class NormalUser extends User{
public NormalUser(String name) {
super(name);
}
}
我们书的属性和用户属性的包和类已经写了大概。我们现在回归到我前面列的功能上:
然后,我们就会发现我们想要实现的功能和操作基本上是针对图书的。所以,这边,我们可以选择直接在图书book包中写方法,也可以选择另外再创建一个包。
我这边是新建了一个包,命名为:opera,再创建一个接口命名为IOPeration。
创建接口:点oper,右击,点击java Class:
然后页面为:
创建接口:
package opera;
import book.BookList;
public interface IOPeration {//创建接口
void work(BookList bookList);//抽象方法
//功能主要是针对图书的,也就是针对书架。
}
我们在opera(实现功能的包)中,创建两个类,AddOperation、FindOperation,这两个类。
我们会发现这两个类的实现也都要依靠BookList(书架)来实现。所以,在这两个类中,实现接口:
FindOperation类中:
package opera;
import book.BookList;
public class FindOperation implements IOPeration{//继承
@Override
public void work(BookList bookList) {//重写IOPeration类中的work方法
System.out.println("查找图书!");
}
}
AddOperation类中:
package opera;
import book.BookList;
public class AddOperation implements IOPeration {
public void work(BookList bookList){
System.out.println("新增图书!");
}
}
同理,新建类DelOperation(删除图书):
package opera;
import book.BookList;
public class DelOperation implements IOPeration{
@Override
public void work(BookList bookList) {
System.out.println("删除图书!");
}
}
新建一个类:ShowOperation(显示图书):
package opera;
import book.BookList;
public class ShowOperation implements IOPeration{
@Override
public void work(BookList bookList) {
System.out.println("打印所有图书!");
}
}
再新建一个类:ExitOperation(退出系统):
package opera;
import book.BookList;
public class ExitOperation implements IOPeration{
@Override
public void work(BookList bookList) {
System.out.println("退出系统!");
}
}
新建一个BrrowOperation类(借阅图书):
package opera;
import book.BookList;
public class BrrowOperation implements IOPeration{
@Override
public void work(BookList bookList) {
System.out.println("借阅图书!");
}
}
再新建一个类:ReturnOperation(借阅图书):
package opera;
import book.BookList;
public class ReturnOperation implements IOPeration{
@Override
public void work(BookList bookList) {
System.out.println("归还图书!");
}
}
接着,我们来细化我们的类。
🍅我们还没有给user添加菜单。
我们先给管理员添加菜单:
public void menu(){
System.out.println("____________________________________");
System.out.println("1.查找图书");
System.out.println("2.新增图书");
System.out.println("3.删除图书");
System.out.println("4.显示图书");
System.out.println("0.退出系统");
}
再给用户添加菜单:
public void manu(){
System.out.println("_________________");
System.out.println("hello,"+name+"~");
System.out.println("1.查找图书!");
System.out.println("2.借阅图书!");
System.out.println("3.归还图书!");
System.out.println("0.退出系统!");
}
现在,我们写main方法。在src下新建一个类:Main:
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 name=scanner.nextLine();
System.out.println("请选择你的身份:1->管理员 0->普通用户");
int choice =scanner.nextInt();
if(choice==1){
//说明是管理员
//由于有返回值,所以我们的方法返回值就不能写void了。但是我们也无法确定返回值是什么,可能是管理员,可能是用户。所以,用向上转型,写User.
return new AdminUser(name);//返回实例化一个管理员对象
}else {
return new NormalUser(name);//返回实例化一个用户对象
}
}
public static void main(String[] args) {
User user=login();//执行上面的login方法
user.menu();//实现打印菜单
}
}
执行login方法时,我们是还不知道new的对象是管理员还是用户的。所以,在打印菜单时,我们也不能直接使用我们在AdminUser类和NormalUser类中写的menu()方法。
✨🎉所以在写user.menu();这个语句时,不行!
所以,我们想到了重写。
我们把User类改成抽象类,在抽象类中写一个menu的抽象方法。
package user;
public abstract class User {//抽象类
protected String name;//名字.这边的protect代表的是名字的权限。如果是private,它只能在同一个包的同一类使用。就不能让AdminUser类继承了。写public的话
//权限太大了,不是很好。
public User(String name) {//构造方法
this.name = name;
}
public abstract void menu();//抽象方法,打印菜单
}
那么, 在AdminUser类和NormalUser类中,也应该有相应的改动,把里面的menu()写成重写的形式。
这也仅仅是实现了打印菜单:
这个过程还是有一些弯弯绕绕的。我们可以通过调试,来捋清我们的思路:
调试的话:
然后,编译器就会带我们一步步地看它是怎么执行的。
接着,我们继续完善我们的代码。光打印一个菜单,不执行我们想要的功能,可不行。
所以,我们在我们的menu菜单中,需要输入我们的功能选择:
Scanner scanner=new Scanner(System.in);
int choice=scanner.nextInt();
return choice;
输入功能选择,我们就要通过这个选择就实现:
首先,我们要根据对象(管理员或用户),选择引用哪一个菜单方法:
NormalUser类中:
public NormalUser(String name) {
super(name);
this.ioPerations=new IOPeration[]{//引用,这边用super也可以,因为这里没有同名的,不需要做区分。用this最好
new FindOperation(),
new BrrowOperation(),
new ReturnOperation(),
new ExitOperation()//以动态方式申请内存。拿到变量后,我们就给他们分配内存
};
AdminUser类中:
public AdminUser(String name) {
super(name);
this.ioPerations=new IOPeration[]{
new ExitOperation(),
new FindOperation(),
new AddOperation(),
new DelOperation(),
new ShowOperation()
};
}
当我们在构造方法中,写了这些,也就为它们分配了内存。当main类中login()方法下,new一个对象时,就会执行相应的构造方法,在这里就是开辟内存:
在User类中:
我们加上这样一段代码:
public void doWork(int choice, BookList bookList){//通过选择的操作,去选择执行数组下的哪个操作
this.ioPerations[choice].work(bookList);
}
this.ioPerations[choice]其实就是new了一个对象。后面的.work(bookList)是调用图书中对应的work方法。
由此一来,我们就可以根据我们一步步的选择,调用book包中对应的work方法。
为了让代码在输入0的时候退出系统,我们用while语句(在Main方法中修改):
while (true){
int choice=user.menu();//实现打印菜单
user.doWork(choice,bookList);
}
这下子基本框架就构造好了。
先看一下测试结果:
三、实现业务
3.1 打印所有图书
我们先在BookList类,也就是书架中先添加图书:
public BookList(){//构造方法
books[0]=new Book("《三国演义》","罗贯中",40,"小说");
books[1]=new Book("《西游记》","吴承恩",60,"小说");
books[2]=new Book("《红楼梦》","曹雪芹",45,"小说");
this.usedSize=3;
}
//通过这个方法,实现ShowOperation中的通过下标打印数组元素
public Book getBook(int pos){
return this.books[pos];
}
然后,我们实现打印所有图书这个业务 。
🍍在ShowOperation类中,添加打印所有图书的程序,利用for循环。
在ShowOperation类中:
package opera;
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++){
System.out.println(bookList.getBook(i));
}
}
}
实现的结果:
我们会发现一些小瑕疵,比如这边输出的false。我们想把它改成已借出,未借出。
这时,我们要用到三目运算符。条件?符合输出:不符合输出
在book类中修改:
public String toString() {
return "Book{" +
"name='" + name + '\'' +
", author='" + author + '\'' +
", price=" + price +
", type='" + type + '\'' +
", isBorrowed=" +(isBorrowed==true?" 已借出":" 未借出") +
'}';
}
3.2 退出系统
退出系统很简单,只需要加上👇语句即可。0代表正常退出。
System.exit(0);
实现结果:
3.3 查找图书
查找图书是跟刚才打印图书差不多的思路。通过for循环,利用equal()进行比对,输出图书信息。
在FindOperation类中补充代码:
public class FindOperation implements IOPeration{//继承
@Override
public void work(BookList bookList) {//重写IOPeration类中的work方法
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.getBook(i);
if(book.getName().equals(name)){//判断查找图书名字是否相同
System.out.println("查到了:");
System.out.println(book);//输出图书信息
}else {
System.out.println("没有这本书");
}
}
}
}
3.4 增加图书
我们要先输入新增图书信息,new一个对象,判断这本图书是否已经存在,如果不存在,则存入书架中。
AddOperation类:
package opera;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class AddOperation implements IOPeration {
public void work(BookList bookList){
System.out.println("新增图书!");
Scanner scanner=new Scanner(System.in);
System.out.println("请输入新增图书名字:");
String name= scanner.nextLine();
System.out.println("请输入新增图书作者:");
String author=scanner.nextLine();
System.out.println("请输入价格");
int price=scanner.nextInt();
Scanner scanner2=new Scanner(System.in);
System.out.println("请输入小说类型:");
String type=scanner2.nextLine();
Book book=new Book(name,author,price,type);
int currentSize= bookList.getUsedSize();
for (int i=0;i<currentSize;i++){
Book temp=bookList.getBook(i);
if(temp.getName().equals(name)){//判断查找图书名字是否相同
System.out.println("已经有这本书了");
return;
}
}
bookList.setBooks(book);
System.out.println("新增图书成功!");
//修改图书数量
bookList.setUsedSize(currentSize+1);
}
}
bookList.setBooks(book);这个语句,我们需要在书架那个类加上setBooks()方法:
public void setBooks(Book book){
this.books[usedSize]=book;
}
🍓注意!!!
在增加图书的时候,我遇到了困难。
我在价格的地方,设置的是int类型。 int price=scanner.nextInt();这个语句执行完,它就不会执行后面的输入语句了。这是我疏忽的一个点。
有三种解决方案。
1.像我上面的代码一样,多写一个 Scanner scanner2=new Scanner(System.in); 这是改动最小的方法了。
2.就是把图书的价格和类型的顺序调换一下,就是要几个文件都改一小下,其实也很快。这样子int price=scanner.nextInt();,最后输这个输入命令的话,就能保证输入命令全部执行
3.这个方法也比较简单,就是把图书的价格类型改成String,那样子,就没有影响了。
3.5 删除图书
🍆删除图书,我们要注意,不仅仅是把那本书删除就好了,还需要把后面的书往前挪。
DelOperation类:
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();
int index=-1;
for (int i=0;i<currentSize;i++){
Book temp=bookList.getBook(i);
if(temp.getName().equals(name)){//判断查找图书名字是否相同
index=i;
break;
}
}
//删除图书,把后面的图书往前面挪
for (int j=index;j<currentSize-1;j++){
Book book=bookList.getBook(j+1);//拿到j下标后面的书
bookList.setBooks(j,book);//放到j下标的位置
}
bookList.setUsedSize(currentSize-1);//修改size值
bookList.setBooks(currentSize-1,null);//因为删除的是对象,所以把地址置为null,就没有人引用了
}
BookList类:
public void setBooks(int pos,Book book){
this.books[pos]=book;
}
我们可以注意到在BookList新添加的这个方法跟刚才在写增加图书时放置图书的方法相似。不过,我们可以注意到,增加图书,就是在最后面放一本书,就好了。而这里,是把后面的书一本本往前挪一个书位。
3.6 借阅图书
思路:判断图书是否在书库中存在,判断图书是否已经被借出。满足条件,执行
temp.setBorrowed(true);
3.7 归还图书
思路:判断图书是否在书库中存在,判断书是否已被借出。
满足条件:
temp.setBorrowed(false);
总代码
Book:
package book;
public class Book {
private String name;//书名
private String author;//作者
private int price;//价格
private String type;//类型
private boolean isBorrowed;//是否被借出,初始值是false,在构造方法中不用写
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;
}
@Override
public String toString() {
return "Book{" +
"name='" + name + '\'' +
", author='" + author + '\'' +
", price=" + price +
", type='" + type + '\'' +
", isBorrowed=" +(isBorrowed==true?" 已借出":" 未借出") +
'}';
}
public void setBorrowed(boolean borrowed) {
isBorrowed = borrowed;
}
}
BookList
package book;
//书架
public class BookList {
private static final int DEFAULT_SIZE=10;
private Book[] books=new Book[DEFAULT_SIZE];//这个书架可以放十本书
public BookList(){//构造方法
books[0]=new Book("《三国演义》","罗贯中",40,"小说");
books[1]=new Book("《西游记》","吴承恩",60,"小说");
books[2]=new Book("《红楼梦》","曹雪芹",45,"小说");
this.usedSize=3;
}
//通过这个方法,实现ShowOperation中的通过下标打印数组元素
public Book getBook(int pos){
return this.books[pos];
}
public void setBooks(Book book){
this.books[usedSize]=book;
}
public void setBooks(int pos,Book book){
this.books[pos]=book;
}
private int usedSize;//记录下当前book数组中有几本书
public int getUsedSize() {
return usedSize;
}
public void setUsedSize(int usedSize) {
this.usedSize = usedSize;
}
}
AddOperation
package opera;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class AddOperation implements IOPeration {
public void work(BookList bookList){
System.out.println("新增图书!");
Scanner scanner=new Scanner(System.in);
System.out.println("请输入新增图书名字:");
String name= scanner.nextLine();
System.out.println("请输入新增图书作者:");
String author=scanner.nextLine();
System.out.println("请输入价格");
int price=scanner.nextInt();
Scanner scanner2=new Scanner(System.in);
System.out.println("请输入小说类型:");
String type=scanner2.nextLine();
Book book=new Book(name,author,price,type);
int currentSize= bookList.getUsedSize();
for (int i=0;i<currentSize;i++){
Book temp=bookList.getBook(i);
if(temp.getName().equals(name)){//判断查找图书名字是否相同
System.out.println("已经有这本书了");
return;
}
}
bookList.setBooks(book);
System.out.println("新增图书成功!");
//修改图书数量
bookList.setUsedSize(currentSize+1);
}
}
BorrwOperation:
package opera;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class BrrowOperation implements IOPeration{
@Override
public void work(BookList bookList) {
System.out.println("借阅图书!");
System.out.println("请输入要借阅的图书名字:");
Scanner scanner=new Scanner(System.in);
String name=scanner.nextLine();
int curentSize= bookList.getUsedSize();
int x=1;
for(int i=0;i<curentSize;i++){
Book temp=bookList.getBook(i);
if((temp.getName().equals(name))&&!temp.isBorrowed()){
{
temp.setBorrowed(true);
x=0;
System.out.println("借阅成功!");
return;
}
}
}
if(x==1){
System.out.println("没有该图书");
}
}
}
DelOperation:
package opera;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class DelOperation implements IOPeration{
@Override
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();
int index=-1;
int z=0;
for (int i=0;i<currentSize;i++){
Book temp=bookList.getBook(i);
if(temp.getName().equals(name)){//判断查找图书名字是否相同
index=i;
z=1;
break;
}
}
if(z==0){
System.out.println("没有这本书!");
return;
}
//删除图书,把后面的图书往前面挪
for (int j=index;j<currentSize-1;j++){
Book book=bookList.getBook(j+1);//拿到j下标后面的书
bookList.setBooks(j,book);//放到j下标的位置
}
bookList.setUsedSize(currentSize-1);//修改size值
bookList.setBooks(currentSize-1,null);//因为删除的是对象,所以把地址置为null,就没有人引用了
System.out.println("删除成功!");
}
}
ExitOperation:
package opera;
import book.BookList;
public class ExitOperation implements IOPeration{
@Override
public void work(BookList bookList) {
System.out.println("退出系统!");
System.exit(0);//退出系统。0代表正常退出
}
}
FindOperation:
package opera;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class FindOperation implements IOPeration{//继承
@Override
public void work(BookList bookList) {//重写IOPeration类中的work方法
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.getBook(i);
if(book.getName().equals(name)){//判断查找图书名字是否相同
System.out.println("查到了:");
System.out.println(book);//输出图书信息
return;
}
}
System.out.println("没有这本书!");
}
}
IOPeration:
package opera;
import book.BookList;
public interface IOPeration {//创建接口
void work(BookList bookList);//抽象方法
//功能主要是针对图书的,也就是针对书架。
}
ReturnOperation:
package opera;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class ReturnOperation implements IOPeration{
@Override
public void work(BookList bookList) {
System.out.println("归还图书!");
System.out.println("请输入要归还的图书名字:");
Scanner scanner=new Scanner(System.in);
String name=scanner.nextLine();
int curentSize= bookList.getUsedSize();
for(int i=0;i<curentSize;i++){
Book temp=bookList.getBook(i);
if((temp.getName().equals(name))&&temp.isBorrowed()){
{
temp.setBorrowed(false);
System.out.println("归还成功!");
return;
}
}
}
}
}
ShowOperation:
package opera;
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++){
System.out.println(bookList.getBook(i));
}
}
}
Main
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 name = scanner.nextLine();
System.out.println("请选择你的身份:1->管理员 0->普通用户");
int choice = scanner.nextInt();
if (choice == 1) {
//说明是管理员
//由于有返回值,所以我们的方法返回值就不能写void了。但是我们也无法确定返回值是什么,可能是管理员,可能是用户。所以,用向上转型,写User.
return new AdminUser(name);//返回实例化一个管理员对象
} else {
return new NormalUser(name);//返回实例化一个用户对象
}
}
public static void main(String[] args) {
User user = login();//执行上面的login方法
BookList bookList = new BookList();
while (true) {
int choice = user.menu();//实现打印菜单
user.doWork(choice, bookList);
}
}
}
测试的话,运行Main:
user代码
AdminUer
package user;
import opera.*;
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()
};
}
@Override
public int menu() {//因为返回值choice是int类型的
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);
int choice=scanner.nextInt();
return choice;
}
}
NormalUser
package user;
import opera.*;
import java.util.Scanner;
public class NormalUser extends User{
public NormalUser(String name) {
super(name);
this.ioPerations=new IOPeration[]{//引用,这边用super也可以,因为这里没有同名的,不需要做区分。用this最好
new ExitOperation(),
new FindOperation(),
new BrrowOperation(),
new ReturnOperation()
//以动态方式申请内存。拿到变量后,我们就给他们分配内存
};
}
@Override
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.退出系统!");
Scanner scanner=new Scanner(System.in);
int choice=scanner.nextInt();
return choice;
}
User
package user;
import book.BookList;
import opera.IOPeration;
public abstract class User {//抽象类
protected String name;//名字.这边的protect代表的是名字的权限。如果是private,它只能在同一个包的同一类使用。就不能让AdminUser类继承了。写public的话
//权限太大了,不是很好。
protected IOPeration[] ioPerations;
public User(String name) {//构造方法
this.name = name;
}
public abstract int menu();//抽象方法,打印菜单,因为有了choice返回值int类型,所以void改成int
public void doWork(int choice, BookList bookList){//通过选择的操作,去选择执行数组下的哪个操作
this.ioPerations[choice].work(bookList);
}
}
相关文章:

图书管理系统
一、图书管理系统菜单 🍓管理员菜单 1.查找图书 2.新增图书 3.删除图书 4.显示图书 0.退出系统 --------------------------------------------------------------------------------------------------------------------------------- 🌼用户菜…...

图解HTTP(2、简单的 HTTP 协议)
HTTP 协议用于客户端和服务器端之间的通信 请求访问文本或图像等资源的一端称为客户端,而提供资源响应的一端称为服务器端。 通过请求和响应的交换达成通信 请求必定由客户端发出,而服务器端回复响应报文 请求报文是由请求方法、请求 URI、协议版本、…...

小鹅知识付费系统登录,网课怎么推广与宣传?有啥获客方法?
现在很多教育机构都开始做网络课程,同行之间的竞争也愈发激烈,机构的网课想要盈利就需要对课程进行宣传推广,网课要怎么推广和宣传呢? 在线课程要想推广获客方法有几种,不同推广方法获客效果也是不同的,只有…...

韩顺平0基础学Java——第5天
p72——p86 今天同学跟我说别学java,真的吗?唉,先把这视频干完吧。 逻辑运算符练习 x6,y6 x6,y5 x11,y6 x11,y5 z48 错了&a…...

单片机为什么能直接烧录程序?
在设计芯片的时候,关于烧录的环节是一个不得不考虑的问题。首先排除掉,由外部硬件直接操控FLASH的方案,这个方案有很多缺点。 1、每个IC使用的FLASH型号各不相同,每种型号的FLASH的烧录命令和流程都有差别,这会导致烧…...

【Linux】25. 网络基础(一)
网络基础(一) 计算机网络背景 网络发展 独立模式: 计算机之间相互独立; 网络互联: 多台计算机连接在一起, 完成数据共享; 其实本质上一台计算机内部也是一个小型网络结构(如果我们将计算机内部某个硬件不存放在电脑中,而是拉根长长的线进行连接。这其实也就是网…...

项目经理【人】任务
系列文章目录 【引论一】项目管理的意义 【引论二】项目管理的逻辑 【环境】概述 【环境】原则 【环境】任务 【环境】绩效 【人】概述 【人】原则 【人】任务 一、定义团队的基本规则&塔克曼阶梯理论 1.1 定义团队的基本规则 1.2 塔克曼阶梯理论 二、项目经理管理风格 …...

Linux学习(嵌入式硬件知识)
GPU和CPU GPU(Graphics Processing Unit,图形处理单元)和 CPU(Central Processing Unit,中央处理单元)是计算机中两种不同的处理器。它们在功能、设计和用途上有所不同。 CPU(中央处理单元&…...

英语学习笔记4——Is this your ...?
Is this your …? 词汇 Vocabulary suit /sut/ n. 西装,正装 suit 的配套: shirt n. 衬衫tie n. 领带,领结belt n. 腰带trousers n. 裤子shoes n. 鞋子 school /skuːl/ n. 学校 所有学校 搭配:middle school 初中 hig…...

Hive Bucketed Tables 分桶表
Hive Bucketed Tables 分桶表 1.分桶表概念 2.分桶规则 3.语法 4.分桶表的创建 5.分桶表的好处...

【拆位法 决策包容性 位运算】2871. 将数组分割成最多数目的子数组
本文涉及知识点 拆位法 贪心 位运算 决策包容性 位运算、状态压缩、子集状态压缩汇总 LeetCode2871. 将数组分割成最多数目的子数组 给你一个只包含 非负 整数的数组 nums 。 我们定义满足 l < r 的子数组 nums[l…r] 的分数为 nums[l] AND nums[l 1] AND … AND nums[r…...

Java 线程池 ( Thread Pool )的简单介绍
想象一下,你正指挥着一支超级英雄团队,面对蜂拥而至的敌人(任务),不是每次都召唤新英雄(创建线程),而是精心调配现有成员,高效应对。这就是Java线程池的魔力,…...

鸿蒙内核源码分析(时间管理篇) | 谁是内核基本时间单位
时间概念太重要了,在鸿蒙内核又是如何管理和使用时间的呢? 时间管理以系统时钟 g_sysClock 为基础,给应用程序提供所有和时间有关的服务。 用户以秒、毫秒为单位计时.操作系统以Tick为单位计时,这个认识很重要. 每秒的tick大小很大程度上决…...

安装numpy遇到的问题
安装numpy的时候提示无法安装如下: (venv) E:\works\AI\venv\Scripts>pip install numpy pandas matplotlib jupyter -i https://pypi.douban.com/simple Looking in indexes: https://pypi.douban.com/simple WARNING: Retrying (Retry(total4, connectNone, r…...

页面嵌套,界面套娃,除了用iframe,还有其他方式吗?
UIOTOS可以了解下,uiotos.net,通过连线来代替脚本逻辑开发,复杂的交互界面,通过页面嵌套轻松解决,是个很新颖的思路,前端零代码! 蓝图连线尤其是独创的页面嵌套和属性继承技术,好家…...

上传文件至linux服务器失败
目录 前言异常排查使用df -h命令查看磁盘使用情况使用du -h --max-depth1命令查找占用空间最大的文件夹 原因解决补充:删除文件后,磁盘空间无法得到释放 前言 使用XFTP工具上传文件至CentOS服务器失败 异常 排查 使用df -h命令查看磁盘使用情况 发现磁盘…...

渗透 如何防御ARP欺骗,LLMNR-MDNS-NBNS等协议的作用
一. 如何防御ARP欺骗? 1.使用双向IP/MAC绑定; 2.使用静态ARP缓存表; 3.使用ARP服务器,通过服务器来查找ARP转换表来响应其他机器的广播; 4.使用ARP欺骗防护软件; 5.在网关设备上部署防ARP欺骗攻击功能…...

【C++ 所有STL容器简介】
【C 所有STL容器简介】 1. vector2. list3. deque4. set / multiset5. map / multimap6. unordered_set / unordered_multiset7. unordered_map / unordered_multimap8. stack9. queue10. priority_queue C 标准模板库(STL)提供了一系列常用的容器&#…...

Django调用SECRET_KEY对数据进行加密
对数据进行加密 在Django中进行加密可以直接调用django配置文件中的SECRET_KEY , 同时还需要导入itsdangerous模块中的TimedJSONWebSignatureSerializer进行加密 1. 实现加密方法 , 生成用户加密链接 # 生成用户加密链接 def generate_verify_email_url(user):# 调研加密方法…...

芸众商城电商专业版400+插件源码+搭建教程
介绍: 芸众商城社交电商系统SAAS平台前端基于vue开发,后端基于研发积分商城系统源码 php,本文安装芸众商城全插件(400多个)商业版平台源码,可同时支持多端口部署运行;使用宝塔面板一键部署的形…...

【机器学习与实现】线性回归示例——波士顿房价分析
目录 一、创建Pandas对象并查看数据的基本情况二、使用皮尔逊相关系数分析特征之间的相关性三、可视化不同特征与因变量MEDV(房价中值)间的相关性四、划分训练集和测试集并进行回归分析 一、创建Pandas对象并查看数据的基本情况 boston.csv数据集下载&a…...

Redis核心数据结构——跳表(生成数据到文件和从文件中读取数据、模块合并、)
生成文件和从文件中读取数据。 需求如下: 你的任务是实现 SkipList 类中的数据持久化成员函数和数据加载成员函数。 持久化数据成员函数签名:void dump_file(); 该成员函数负责将存储引擎内的数据持久化到文件中。数据的持久化格式是将每个键值对写入文…...

微信小程序下载文件详解
在微信小程序中,下载文件通常涉及使用 wx.downloadFile API。这个 API 可以将网络资源下载到本地临时文件路径,然后你可以使用 wx.saveFile 将临时文件保存到本地持久存储位置。下面是一个下载文件的详细过程: 使用 wx.downloadFile 下载文件…...

2024 概率论和数理统计/专业考试/本科考研/论文/重点公式考点汇总
## 列表http://www.deepnlp.org/equation/category/statistics ## 均匀分布http://www.deepnlp.org/equation/uniform-distribution ## t-分布http://www.deepnlp.org/equation/student-t-distribution ## 伯努利分布http://www.deepnlp.org/equation/bernoulli-distributio…...

四川易点慧电子商务抖音小店:潜力无限的新零售风口
在当今数字化浪潮中,电子商务已经成为推动经济发展的重要引擎。四川易点慧电子商务有限公司凭借其敏锐的市场洞察力和创新精神,成功在抖音小店这一新兴平台上开辟出一片新天地。本文将探讨四川易点慧电子商务抖音小店的潜力及其在新零售领域的影响力。 一…...

Seal^_^【送书活动第3期】——《Hadoop大数据分析技术》
Seal^_^【送书活动第3期】——《Hadoop大数据分析技术》 一、参与方式二、作者荐语三、图书简介四、本期推荐图书4.1 前 言4.2 本书内容4.3 本书目的4.4 本书适合的读者4.5 配套源码、PPT课件等资源下载 五、目 录六、🛒 链接直达 Hadoop框架入门书,可当…...

win10下,svn上传.so文件失败
问题:win10下使用TortoiseSVN,svn上传.so文件失败 解决:右键,选择Settings,Global ignore pattern中删除*.so,保存即可。...

ubuntu20安装colmap
系统环境 ubuntu20 ,cuda11.8 ,也安装了anaconda。因为根据colmap的官方文档说的,如果根据apt-get安装的话,默认是非cuda版本的,而我觉得既然都安装了cuda11.8了,自然也要安装cuda版本的colmap。 安装步骤…...

kubeflow简单记录
kubeflow 13.7k star 1、Training Operator 包括PytorchJob和XGboostJob,支持部署pytorch的分布式训练 2、KFServing快捷的部署推理服务 3、Jupyter Notebook 基于Web的交互式工具 4、Katib做超参数优化 5、Pipeline 基于Argo Workflow提供机器学习流程的创建、编排…...

ARM的工作模式
ARM处理器设计有七种工作模式,这些模式允许处理器在不同的情境下以不同的权限级别执行任务,下面是这七大工作模式的概述: 用户模式(User,USR): 这是非特权模式,大多数应用程序在此…...