总体上,关于人定义了一个父类,两个子类,定义父类作用是实现多态
关于图书每个功能都定义了一个类来写方法,但各类中方法名均相同,容易调用
定义了一个接口,接口最为重要,虽然里面只有一个抽象方法,但他的连接作用最为重要通过每个功能类对接口的实现从而创建接口数组,接口中数组元素的不同是来实现管理员和普通人的区分。
要点:利用多态进行不同子类的方法的实现;利用接口创建数组;toString方法重写;数组元素为对象时,进行初始化,即交换不同下标的元素值
代码分析:
即定义接口数组,将对图书的操作囊括在数组里,通过输入相应下标即可调用方法
注意:这个是向上转型,用父类调用的时候,只有方法会进行动态绑定,即如果子类重写了父类的方法,用多态的时候调用的是子类方法不是父类方法。但是属性用的均是父类中的,子类定义了相同属性还是会调用父类中的,因此要想根据子类不同打印不同属性值,那么就要在子类中初始化。
总之,属性用的是父类的,只是在子类中进行初始化(在构造函数中用super/this .属性进行初始化)。
这两个是主要的架构思想,接下来完成各自功能
删除功能
如果想要后面覆盖前面的,那么写法和基础类型覆盖方式一样,直接用arr[i]=arr[i+1]即可;
同时数组最后一个要怎么处理方法:arr[i] = null;size--;即可
展示图书:
展示图书要重写Object方法,否则用sout()打印对象时,结果是地址,可以用ideal自动生成,如图
注,想打印哪个对象就要在该类中重写toString,详解toString
其他功能比较简单,大家可以参考git中代码,链接放末尾;
待实现功能,按书名/价格排序,判定增加数组会不会满员,增加数组容量,将数据保存到硬盘中
简单分析
首先需要两大类:图书和人
人需要区分管理人和普通人,为了后面实现多态,所以要定义一个父类
因为图书不是只有一本所以定义一个Book类,同时定义一个BookList来作为书的集合
知识补漏:
login()没有被static修饰,直接调用会报错,因为非静态方法的调用需要实例化对象。解决方法:1 给login加上static;2 实例化login所在类
BookList中如何对每个数组进行初始化:
初始化不需要在另外写函数,因为构造函数的作用就是初始化,因此想要初始化写全构造函数即可。切记构造函数没有返回值,加上返回值,那就不是构造函数
数组初始化
当数组元素是对象时:
book[0] = new Book(填值)
books = new Book[]{new ...(),new ...(), };
成员变量初始化
重要的编程思想:将接口当作数组来存储功能
我们将每一个功能(借,还,增,添图书等)都定义一个类,将功能写进去(此时功能名都一样),之后再定义一个接口,每个功能类都实现这个接口,这样就可以通过调整接口数组中的成员来区分管理员和普通人。
管理员菜单:
普通人菜单:
gitee代码