接口
-
-
容器长度是固定的,不能根据添加功能自动增长
-
没有提供用于增删改查的方法
-
-
优化步骤
-
创建新的StudentDao类,OtherStudentDao
-
创建ArrayList集合容器对象
-
OtherStudentDao中的方法声明,需要跟StudentDao保持一致
注意:如果不一致,StudentService中的代码就需要进行修改
-
完善方法(添加、删除、修改、查看)
-
替换StudentService中的Dao对象
-
代码实现
public class OtherStudentDao { // 集合容器 private static ArrayList<Student> stus = new ArrayList<>(); static { Student stu1 = new Student("yyj001","张三","23","1999-11-11"); Student stu2 = new Student("yyj002","李四","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类
public class StudentService { // 创建StudentDao (库管) private OtherStudentDao studentDao = new OtherStudentDao(); // 其他方法没有变化,此处省略... }
-
-
将方法向上抽取,抽取出一个父类 ( BaseStudentDao )
-
方法的功能实现在父类中无法给出具体明确,定义为抽象方法
-
让两个类分别继承 BaseStudentDao ,重写内部抽象方法
-
代码实现
public 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类
public class StudentDao extends BaseStudentDao { // 其他内容不变,此处省略 }
OtherStudentDao类
public class OtherStudentDao extends BaseStudentDao { // 其他内容不变,此处省略 }
-
-
Java中接口存在的两个意义
-
用来定义规范
-
-
public interface 接口名 {}
类实现接口用implements表示
public class 类名 implements 接口名 {}
-
我们可以创建接口的实现类对象使用
-
接口的子类
要么重写接口中的所有抽象方法
-
-
成员变量
只能是常量 默认修饰符:public static final
-
构造方法
没有,因为接口主要是扩展功能的,而没有具体存在
-
成员方法
只能是抽象方法
默认修饰符:public abstract
关于接口中的方法,JDK8和JDK9中有一些新特性,后面再讲解
-
-
代码演示
-
public interface Inter { public static final int NUM = 10; public abstract void show(); }
实现类
class InterImpl implements Inter{ public void method(){ // NUM = 20; System.out.println(NUM); } public void show(){ } }
测试类
public class TestInterface { /* 成员变量: 只能是常量 系统会默认加入三个关键字 public static final 构造方法: 没有 成员方法: 只能是抽象方法, 系统会默认加入两个关键字 public abstract */ public static void main(String[] args) { System.out.println(Inter.NUM); } }
-
继承关系,只能单继承,但是可以多层继承
-
类与接口的关系
实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口
-
接口与接口的关系
-
-
将 BaseStudentDao 改进为一个接口
-
让 StudentDao 和 OtherStudentDao 去实现这个接口
-
-
代码实现
public 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类
public class StudentDao implements BaseStudentDao { // 其他内容不变,此处省略 }
OtherStudentDao类
public class OtherStudentDao implements BaseStudentDao { // 其他内容不变,此处省略 }
-
-
创建factory包,创建 StudentDaoFactory(工厂类)
-
提供 static 修改的 getStudentDao 方法,该方法用于创建StudentDao对象并返回
-
-
代码实现
public class StudentDaoFactory { public static OtherStudentDao getStudentDao(){ return new OtherStudentDao(); } }
StudentService类
public class StudentService { // 创建StudentDao (库管) // private OtherStudentDao studentDao = new OtherStudentDao(); // 通过学生库管工厂类, 获取库管对象 private OtherStudentDao studentDao = StudentDaoFactory.getStudentDao(); }
-
public static final
-
抽象方法
public abstract
-
默认方法(Java 8)
-
静态方法(Java 8)
-
-
public default 返回值类型 方法名(参数列表) { }
-
作用
解决接口升级的问题
-
public default void show3() { }
-
默认方法不是抽象方法,所以不强制被重写。但是可以被重写,重写的时候去掉default关键字
-
public可以省略,default不能省略
-
-
public static 返回值类型 方法名(参数列表) { }
-
public static void show() { }
-
静态方法只能通过接口名调用,不能通过实现类名或者对象名调用
-
-
Java 9中新增了带方法体的私有方法,这其实在Java 8中就埋下了伏笔:Java 8允许在接口中定义带方法体的默认方法和静态方法。这样可能就会引发一个问题:当两个默认方法或者静态方法中包含一段相同的代码实现时,程序必然考虑将这段实现代码抽取成一个共性方法,而这个共性方法是不需要让别人使用的,因此用私有给隐藏起来,这就是Java 9增加私有方法的必然性
-
定义格式
-
格式1
private 返回值类型 方法名(参数列表) { }
-
-
private void show() { }
-
private static 返回值类型 方法名(参数列表) { }
-
private static void method() { }
-
默认方法可以调用私有的静态方法和非静态方法
-