【Java】面向对象进阶-接口

文章目录

前言

1.之前学过,因此本文是个人复习笔记,为视频的总结以及个人思考,可能不是很详细。

2.教程是b站黑马程序员的JAVASE基础课程,笔记中的大部分图片来自于视频中的PPT截图。

3.Java环境为Java SE 17.0.3.1,IntelliJ IDEA版本为2025.2

https://www.bilibili.com/video/BV1Cv411372m

内容概览

1.本文内容主要包括接口的概念,接口的好处,接口的新特性,以及接口的注意事项。

2.笔记对应视频108-110节

更新记录

接口的概念

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

public interface 接口名{

// 成员变量(常量)

// 成员方法(抽象方法)

}

接口不能创建对象;接口是用来被类实现的,实现接口的类称为实现类。

修饰符 class 实现类 implements 接口1, 接口2, 接口3, ...{

}

一个类可以实现多个接口,实现类实现多个接口必须重写所有接口的所有抽象方法,否则实现类需要定义为抽象类

Object6Demo1.java

Java 复制代码
package com.zbhgis.object6;

public class Object6Demo1 {
    public static void main(String[] args) {
        System.out.println(A.STUDENT_NAME);

        // A a = new A(); // 不可行
        D d = new D();
    }

}

A.java

Java 复制代码
package com.zbhgis.object6;

public interface A {
    // 成员变量
    String STUDENT_NAME = "明";
    // 成员方法(抽象方法)
    void test();
}

B.java

Java 复制代码
package com.zbhgis.object6;

public interface B {
    void testb1();

    void testb2();
}

C.java

Java 复制代码
package com.zbhgis.object6;

public interface C {
    void testc1();

    void testc2();
}

D.java

Java 复制代码
package com.zbhgis.object6;

public class D implements B, C{


    @Override
    public void testb1() {

    }

    @Override
    public void testb2() {

    }

    @Override
    public void testc1() {

    }

    @Override
    public void testc2() {

    }
}

接口的好处

弥补单继承的不足

解耦合,编程更加灵活

案例:通过接口实现两套方法,打印不同的学生信息和学生分数

Student.java

Java 复制代码
package com.zbhgis.object6;

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;
    }
}

ClassManager.java

Java 复制代码
package com.zbhgis.object6;

import java.util.ArrayList;

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

    public ClassManager() {
        students.add(new Student("明", '女', 66));
        students.add(new Student("山", '男', 33));
        students.add(new Student("水", '男', 99));
    }

    public void printInfo() {
        studentOperator.printAllInfo(students);
    }

    public void printScore() {
        studentOperator.printAverageScore(students);
    }
}

StudentOperator.java

Java 复制代码
package com.zbhgis.object6;

import java.util.ArrayList;

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

    void printAverageScore(ArrayList<Student> students);
}

StudentOperatorImpl1.java

Java 复制代码
package com.zbhgis.object6;

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 printAverageScore(ArrayList<Student> students) {
        double allScore = 0.0;
        for (int i = 0; i < students.size(); i++) {
            Student s = students.get(i);
            allScore += s.getScore();
        }
        System.out.println("平均分:" + allScore / students.size());
    }
}

StudentOperatorImpl2.java

Java 复制代码
package com.zbhgis.object6;

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);
        System.out.println("女生人数:" + count2);
        System.out.println("--------------------");
    }

    @Override
    public void printAverageScore(ArrayList<Student> students) {
        double allScore = 0.0;
        double maxScore = students.get(0).getScore();
        double minScore = students.get(0).getScore();
        for (int i = 0; i < students.size(); i++) {
            Student s = students.get(i);
            allScore += s.getScore();
            if (s.getScore() > maxScore) maxScore = s.getScore();
            if (s.getScore() < minScore) minScore = s.getScore();
        }
        System.out.println("最高分:" + maxScore);
        System.out.println("最低分:" + minScore);
        System.out.println("平均分:" + allScore / students.size());
    }
}

Object6Demo2.java

Java 复制代码
package com.zbhgis.object6;

public class Object6Demo2 {
    public static void main(String[] args) {
        ClassManager clazz = new ClassManager();
        clazz.printInfo();
        clazz.printScore();
    }
}

打印结果

Plain 复制代码
-------------------
姓名:明性别:女成绩:66.0
姓名:山性别:男成绩:33.0
姓名:水性别:男成绩:99.0
--------------------
平均分:66.0

接口的新特性

JDK8之后

1.默认方法,必须被default修饰,默认被public修饰

2.私有方法,必须被private修饰

3.静态方法,必须被static修饰,默认被public修饰

接口的注意事项

1、一个接口继承多个接口,如果多个接口中存在方法签名冲突,则此时不支持多继承。

2、一个类实现多个接口,如果多个接口中存在方法签名冲突,则此时不支持多实现。

3、一个类继承了父类,又同时实现了接口,父类中和接口中有同名的默认方法,实现类会优先用父类的。

4、一个类实现了多个接口,多个接口中存在同名的默认方法,可以不冲突,这个类重写该方法即可。

了解即可

总结

1.接口不能创建对象

2.接口通过类实现

3.一个类可以实现多个接口

4.一个类可以实现多个接口,实现类实现多个接口必须重写所有接口的所有抽象方法,否则实现类需要定义为抽象类

5.接口可以继承接口

相关推荐
love530love8 小时前
EPGF 新手教程 12在 PyCharm(中文版 GUI)中创建 Poetry 项目环境,并把 Poetry 做成“项目自包含”(工具本地化为必做环节)
开发语言·ide·人工智能·windows·python·pycharm·epgf
White_Can9 小时前
《C++11:列表初始化》
c语言·开发语言·c++·vscode·stl
White_Can9 小时前
《C++11:右值引用与移动语义》
开发语言·c++·stl·c++11
2501_941870569 小时前
从配置频繁变动到动态配置体系落地的互联网系统工程实践随笔与多语言语法思考
java·前端·python
比奇堡派星星9 小时前
Linux4.4使用AW9523
linux·开发语言·arm开发·驱动开发
民乐团扒谱机9 小时前
【微实验】数模美赛备赛MATLAB实战:一文速通各种“马尔可夫”(Markov Model)
开发语言·人工智能·笔记·matlab·数据挖掘·马尔科夫链·线性系统
Z1Jxxx9 小时前
字符串翻转
开发语言·c++·算法
菜的不敢吱声9 小时前
swift学习第2,3天
python·学习·swift
爱喝水的鱼丶9 小时前
SAP-ABAP:全面破解SAP与第三方系统集成超时难题:从应急排查到根治方案
开发语言·sap·abap·接口集成·开发交流
AI小怪兽9 小时前
基于YOLO11的航空安保与异常无人机检测系统(Python源码+数据集+Pyside6界面)
开发语言·人工智能·python·yolo·计算机视觉·无人机