接口
既然接口中的所有方法都需要重写,那么我不干脆直接写一个类,不写接口就完事了呢
接口定义的是一种特征,告诉使用者和程序,这个实现了这个类型的接口拥有哪些功能
如果一个类实现了runnable,那么这个类就可以用来定义线程
- 接口的变量默认是常量(要有初始值)
- 接口的方法默认是抽象方法
- 因为接口是不能直接实例化对象的,所以不能有构造器和代码块
- 在jdk1.8之后,接口中可以有默认方法 用default修饰 可以有方法体
接口
public interface SchoolPeople {// 默认是public static final 接口的成员变量都是常量String schoolName = "清华大学";// 默认是public abstract 接口的方法默认 是抽象方法void writeContent();// 在jdk1.8之后,接口中可以有默认方法 用default修饰 可以有方法体default void write(){System.out.println("标题");writeContent();System.out.println("结束");}}
实现类1
public class Student implements SchoolPeople{@Overridepublic void writeContent() {System.out.println("学生写作业");}
}
实现类2
public class Teacher implements SchoolPeople{@Overridepublic void writeContent() {System.out.println("老师批改作业");}
}
java不支持抽象类的多继承,但是能够接口多实现
- 不支持多继承是因为子类继承父类的方法,两个父类都有方法体,不知道调用哪一个
支持多实现是因为两个几口都没有方法体,使用的都是子类重写之后的方法体
public interface SchoolPeople {// 默认是public static final 接口的成员变量都是常量String schoolName = "清华大学";// 默认是public abstract 接口的方法默认 是抽象方法void writeContent();// 在jdk1.8之后,接口中可以有默认方法 用default修饰 可以有方法体default void write(){System.out.println("标题");writeContent();System.out.println("结束");}}
接口和抽象类
- 接口解决了类只能单继承的问题
demo
设计一个计算类,实现两种计算方式
- 计算全班平均成绩
- 计算女生平均成绩
学生类
@lombok.Data
@AllArgsConstructor
public class Student {private String name;private String gender;private double score;
}
班级管理类
@Data
public class ClassManager {private StudentOperator studentOperator;private List<Student> students;public double calAverageScore() {return studentOperator.calAverageScore(students);}}
操作接口
public interface StudentOperator {double calAverageScore(List<Student> students);
}
实现类1
public class StudentOperatorImpl1 implements StudentOperator{@Overridepublic double calAverageScore(List<Student> students) {return students.stream().mapToDouble(Student::getScore).average().orElse(0);}
}
实现类2
public class StudentOperatorImpl2 implements StudentOperator{@Overridepublic double calAverageScore(List<Student> students) {// 只计算女生的平均分return students.stream().filter(student -> student.getGender().equals("女生")).mapToDouble(Student::getScore).average().orElse(0);}
}
使用 传递不同操作实现类
ArrayList<Student> students = new ArrayList<>();
students.add(new Student("古力拉扎", "女生", 90));
students.add(new Student("古力娜扎", "女生", 95));
students.add(new Student("马尔扎哈", "男生", 100));
students.add(new Student("玛玛哈哈", "男生", 100));ClassManager classManager = new ClassManager();
classManager.setStudents(students);
classManager.setStudentOperator(new StudentOperatorImpl1());
System.out.println("全班平均分:" + classManager.calAverageScore());classManager.setStudentOperator(new StudentOperatorImpl2());
System.out.println("女生平均分:" + classManager.calAverageScore());