一、
- 数据存储结构不同
 ArrayImpl: 使用固定大小的数组 Student[] students
 ListImpl: 使用动态数组 ArrayListstudents 
- 构造函数差异
 ArrayImpl: 需要指定初始大小 public StudentDaoArrayImpl(int size)
 ListImpl: 无需指定大小,自动扩容
- 添加学生方法的实现
 java
 // ArrayImpl - 需要遍历查找空位,可能失败
 for(int i=0; i<students.length;i++){
 if(students[i]==null){
 students[i] = student;
 success = true;
 break;
 }
 }
 return success; // 可能返回false(数组已满)
 // ListImpl - 直接添加,总是成功
 students.add(student);
 return true; // 总是返回true
- 查找学生方法的效率
 ArrayImpl: 需要检查null值 if(students[i]!= null)
 ListImpl: 直接遍历,无需null检查
- 容量限制
 ArrayImpl: 有固定容量限制,可能无法添加新学生
 ListImpl: 无固定限制,自动扩容
- 内存使用
 ArrayImpl: 可能浪费内存(有空位)
 ListImpl: 内存使用更高效
二、
这段代码定义了一段接口,实现多态:
// 可以用接口类型引用不同的实现
StudentDao dao1 = new StudentDaoArrayImpl(10);
StudentDao dao2 = new StudenDaoListImpl();
// 调用相同的方法,但执行不同的实现
dao1.addStudent(student);
dao2.addStudent(student);
没有实现代码是因为接口只负责定义规范和声明方法,不包含具体实现。
三、
摘抄:DAO(Data Access Object)模式,在Java编程中,是一种用于隔离应用程序/业务层与持久层(通常是关系型数据库,但也可以是其他持久化机制)的结构模式。它通过一个抽象的API隐藏了所有在底层存储机制中执行CRUD操作的复杂性,使得两层可以独立发展,而不需要彼此了解。
理解:1. 接口作为抽象层
java
public interface StudentDao {
public boolean addStudent(Student student);
public Student getStuByName(String name);
public void diplayAllStudents();
// 通常还有 update 和 delete 方法
}
接口的作用:定义CRUD操作的"契约",但不关心具体实现。
- 实现类处理具体细节
 java
 // 数组实现
 public class StudentDaoArrayImpl implements StudentDao {
 private Student[] students;
 // 具体的数组操作实现...
 }
// List实现
public class StudenDaoListImpl implements StudentDao {
private List
// 具体的List操作实现...
}
// 未来可能的数据库实现
public class StudentDaoDBImpl implements StudentDao {
// 具体的数据库操作...
}
隔离的具体体现
业务层代码(不需要知道存储细节)
java
public class StudentService {
private StudentDao studentDao;  // 只依赖接口
public StudentService(StudentDao dao) {this.studentDao = dao;  // 注入具体实现
}public void registerStudent(String name, int age) {Student student = new Student(name, age);studentDao.addStudent(student);  // 只管调用,不管怎么存
}
}
独立发展的优势
存储方式可以自由变化
java
// 今天用数组
StudentDao dao = new StudentDaoArrayImpl(100);
// 明天用List(业务代码无需修改!)
StudentDao dao = new StudenDaoListImpl();
// 后天用数据库(还是无需修改业务代码!)
StudentDao dao = new StudentDaoDBImpl("jdbc:mysql://...");
两层独立演化
业务层:专注于业务逻辑,不关心数据怎么存
数据层:专注于数据存取优化,不关心业务逻辑
四、
运行与修改说明
原Test.java使用StudentDaoArrayImpl(数组实现),若修改注释切换为StudenDaoListImpl(List实现):
// StudentDao sdm = new StudentDaoArrayImpl(50);
StudentDao sdm = new StudenDaoListImpl();
程序仍可正常运行,输出结果一致(添加3个学生、显示所有学生、查询“Tom”成功)。
DAO模式的好处
解耦业务逻辑与数据存储:Test.java的业务逻辑(添加、查询学生)不依赖具体存储方式(数组/List),仅依赖StudentDao接口。
易于切换数据源:如需将存储方式改为数据库或文件,只需新增一个实现StudentDao的类(如StudentDaoDbImpl),无需修改Test.java的业务代码。
提高可维护性:数据访问逻辑集中在实现类中,修改存储逻辑(如数组扩容规则)不会影响上层业务代码。
