使用数组容器的弊端
优化步骤
创建新的StudentDao类,OtherStudentDao
创建ArrayList集合容器对象
OtherStudentDao中的方法声明,需要跟StudentDao保持一致
注意:如果不一致,StudentService中的代码就需要进行修改
完善方法(添加、删除、修改、查看)
替换StudentService中的Dao对象
代码实现
OtherStudentDao类
xpublic class OtherStudentDao { // 集合容器 private static ArrayList<Student> stus = new ArrayList<>(); static { Student stu1 = new Student("heima001","张三","23","1999-11-11"); Student stu2 = new Student("heima002","李四","24","2000-11-11"); stus.add(stu1); stus.add(stu2); } // 添加学生方法 public boolean addStudent(Student stu) { stus.add(stu); return true; } // 查看学生方法 public Student[] findAllStudent() { Student[] students = new Student[stus.size()]; for (int i = 0; i < students.length; i++) { students[i] = stus.get(i); } return students; } public void deleteStudentById(String delId) { // 1. 查找id在容器中所在的索引位置 int index = getIndex(delId); stus.remove(index); } public int getIndex(String id){ int index = -1; for (int i = 0; i < stus.size(); i++) { Student stu = stus.get(i); if(stu != null && stu.getId().equals(id)){ index = i; break; } } return index; } public void updateStudent(String updateId, Student newStu) { // 1. 查找updateId, 在容器中的索引位置 int index = getIndex(updateId); stus.set(index, newStu); }}StudentService类
xxxxxxxxxxpublic class StudentService { // 创建StudentDao (库管) private OtherStudentDao studentDao = new OtherStudentDao(); // 其他方法没有变化,此处省略...} 优化步骤
代码实现
BaseStudentDao类
xxxxxxxxxxpublic abstract class BaseStudentDao { // 添加学生方法 public abstract boolean addStudent(Student stu); // 查看学生方法 public abstract Student[] findAllStudent(); // 删除学生方法 public abstract void deleteStudentById(String delId); // 根据id找索引方法 public abstract int getIndex(String id); // 修改学生方法 public abstract void updateStudent(String updateId, Student newStu);}StudentDao类
xxxxxxxxxxpublic class StudentDao extends BaseStudentDao { // 其他内容不变,此处省略}OtherStudentDao类
xxxxxxxxxxpublic class OtherStudentDao extends BaseStudentDao { // 其他内容不变,此处省略}接口就是一种公共的规范标准,只要符合规范标准,大家都可以通用。
Java中接口存在的两个意义
接口用关键字interface修饰
xxxxxxxxxxpublic interface 接口名 {} 类实现接口用implements表示
xxxxxxxxxxpublic class 类名 implements 接口名 {}接口不能实例化
我们可以创建接口的实现类对象使用
接口的子类
要么重写接口中的所有抽象方法
要么子类也是抽象类
成员特点
成员变量
只能是常量 默认修饰符:public static final
构造方法
没有,因为接口主要是扩展功能的,而没有具体存在
成员方法
只能是抽象方法
默认修饰符:public abstract
关于接口中的方法,JDK8和JDK9中有一些新特性,后面再讲解
代码演示
xxxxxxxxxxpublic interface Inter { public static final int NUM = 10; public abstract void show();}xxxxxxxxxxclass InterImpl implements Inter{ public void method(){ // NUM = 20; System.out.println(NUM); } public void show(){ }}xxxxxxxxxxpublic class TestInterface { /* 成员变量: 只能是常量 系统会默认加入三个关键字 public static final 构造方法: 没有 成员方法: 只能是抽象方法, 系统会默认加入两个关键字 public abstract */ public static void main(String[] args) { System.out.println(Inter.NUM); } }类与类的关系
继承关系,只能单继承,但是可以多层继承
类与接口的关系
实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口
接口与接口的关系
继承关系,可以单继承,也可以多继承
实现步骤
代码实现
BaseStudentDao接口
xxxxxxxxxxpublic interface BaseStudentDao { // 添加学生方法 public abstract boolean addStudent(Student stu); // 查看学生方法 public abstract Student[] findAllStudent(); // 删除学生方法 public abstract void deleteStudentById(String delId); // 根据id找索引方法 public abstract int getIndex(String id); // 修改学生方法 public abstract void updateStudent(String updateId, Student newStu);}StudentDao类
xxxxxxxxxxpublic class StudentDao implements BaseStudentDao { // 其他内容不变,此处省略}OtherStudentDao类
xxxxxxxxxxpublic class OtherStudentDao implements BaseStudentDao { // 其他内容不变,此处省略}实现步骤
代码实现
StudentDaoFactory类
xxxxxxxxxxpublic class StudentDaoFactory { public static OtherStudentDao getStudentDao(){ return new OtherStudentDao(); }}StudentService类
xxxxxxxxxxpublic class StudentService { // 创建StudentDao (库管) // private OtherStudentDao studentDao = new OtherStudentDao(); // 通过学生库管工厂类, 获取库管对象 private OtherStudentDao studentDao = StudentDaoFactory.getStudentDao();}