Java接口

发布时间:2023年12月20日

认识接口

  • Java提供了一个关键字interface,用这个关键字我们可以定义出一个特殊的结构:接口。

  • ?注意:接口不能创建对象;接口是用来被类实现(implements)的,实现接口的类称我实现类。

  • 一个类可以实现多个接口(接口可以理解成干爹),现实类实现多个接口,必须重写完全部接口的全部抽象方法,否则实现类需要定义成抽象类。

接口的好处

  • 弥补了类单继承的不足,一个类同时可以实现多个接口。
  • 让程序可以面向接口编程,这样程序员就可以灵活方便的切换各种业务实现。

接口的综合案例

案例:班级学生信息管理模块的开发

Student类

public class Student {
    private String name;
    private char sex;
    private double score;

    public Student() {
    }

    public Student(String name, char sex, double score) {
        this.name = name;
        this.sex = sex;
        this.score = score;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public char getSex() {
        return sex;
    }

    public void setSex(char sex) {
        this.sex = sex;
    }

    public double getScore() {
        return score;
    }

    public void setScore(double score) {
        this.score = score;
    }
}

ClassManage类

import java.util.ArrayList;

public class ClassManage {
    private ArrayList<Student> students = new ArrayList<>();
    private StudentOperator studentOperator = new StudentOperatorImpl2();

    public ClassManage(){
        students.add(new Student("张三",'男',99));
        students.add(new Student("李四",'男',100));
        students.add(new Student("王五",'男',60));
        students.add(new Student("赵六",'女',80));
    }

    //打印全班全部学生的信息
    public void printInfo(){
        studentOperator.printAllInfo(students);
    }

    //打印全班全部的学生的平均分
    public void printScore(){
        studentOperator.printAverage(students);
    }
}

StudentOperator接口

import java.util.ArrayList;

public interface StudentOperator {
    void printAllInfo(ArrayList<Student> students);
    void printAverage(ArrayList<Student> students);
}

StudentOperatorImpl1类

import java.util.ArrayList;

public class StudentOperatorImpl1 implements StudentOperator{

    @Override
    public void printAllInfo(ArrayList<Student> students) {
        System.out.println("==========全班全部学生信息如下==========");
        for (int i = 0; i < students.size(); i++) {
            Student s = students.get(i);
            System.out.println("姓名:" + s.getName() + ",性别:" + s.getSex() + ",成绩:" + s.getScore());
        }
        System.out.println("=============================");
    }

    @Override
    public void printAverage(ArrayList<Student> students) {
        double sum = 0.0;
        for (int i = 0; i < students.size(); i++) {
            Student s = students.get(i);
            sum += s.getScore();
        }
        System.out.println("全班平均分为:" + sum/students.size());
    }
}

StudentOperatorImpl2类

import java.util.ArrayList;

public class StudentOperatorImpl2 implements StudentOperator{

    @Override
    public void printAllInfo(ArrayList<Student> students) {
        System.out.println("==========全班全部学生信息如下==========");
        int count1 = 0;
        int count2 = 0;
        for (int i = 0; i < students.size(); i++) {
            Student s = students.get(i);
            System.out.println("姓名:" + s.getName() + ",性别:" + s.getSex() + ",成绩:" + s.getScore());
            if (s.getSex() == '男'){
                count1++;
            }else {
                count2++;
            }
        }
        System.out.println("男生人数为:" + count1 + ",女生人数为:" + count2);
        System.out.println("班级总人数为:" + students.size());
        System.out.println("=============================");
    }

    @Override
    public void printAverage(ArrayList<Student> students) {
        double sum = 0.0;
        double max = students.get(0).getScore();
        double min = students.get(0).getScore();
        for (int i = 0; i < students.size(); i++) {
            Student s = students.get(i);
            sum += s.getScore();
            if (s.getScore() > max){
                max = s.getScore();
            }else if (s.getScore() < min){
                min = s.getScore();
            }
        }
        System.out.println("学生的最高分是:" + max);
        System.out.println("学生的最低分是:" + min);
        System.out.println("全班平均分为:" + (sum-max-min)/(students.size()-2));
    }
}

Test类

public class Test {
    public static void main(String[] args) {
        // 完成班级学生信息管理案例
        ClassManage classManage = new ClassManage();
        classManage.printInfo();
        classManage.printScore();
    }
}

接口的其它细节:JDK8开始,接口中新增的三张方法

  • 默认方法:使用default修饰,使用实现了的对象调用
  • 静态方法:static修饰,必须用当前接口名调用
  • 私有方法:private修饰,jdk9开始才有,只能再接口内部被调用
  • 它们都会默认被public修饰

?为什么要新增这些方法

  • 增强了接口的能力,更便于项目的扩展和维护。

接口的多继承、使用接口的注意事项

接口的多继承

一个接口可以同时继承多个接口

接口多继承的作用

  • 以便于实现类去实现

接口其他注意事项

  1. 一个接口继承多个接口,如果多个接口中存在方法签名冲突,则此时不支持多继承。
  2. 一个类实现多个接口,如果多个接口中存在方法签名冲突,则此时不支持多实现。
  3. 一个类继承了父类,又同时实现了接口,父类中和接口中有同名的默认方法,实现类会优先用父类的。
  4. 一个类实现了多个接口,多个接口中存在同名的默认方法,可以不冲突,这个类重写该方法即可。
文章来源:https://blog.csdn.net/SU_mu147/article/details/135105834
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。