什么是接口

2023-10-28

概念:
  1. 接口是更加彻底的抽象,接口中全部是抽象方法。接口是不能直接创建对象的。
  2. 从JDK8之后,接口中不再只是抽象方法,接口还可以有默认方法(也就是实例方法),和静态方法了,还包含了私有实例方法和私有静态方法
  3. 在JDK8之前,接口中的成分包含:抽象方法和常量。JDK8以后可以定义非抽象方法,但是需要使用default关键字修饰。
  4. 接口中的抽象方法默认会自动加上public abstract修饰程序员无需自己手写!
  5. 在接口中定义的成员变量默认会加上: public static final修饰。也就是说在接口中定义的成员变量实际上是一个常量。这里是使用public static final修饰后,变量值就不可被修改,并且是静态化的变量可以直接用接口名访问,所以也叫常量。常量必须要给初始值。常量命名规范建议字母全部大写,多个单词用下划线连接
  6. Java中接口存在的意义:用来定义规范,用来做功能的拓展

接口的使用思路:

  • 发现一个类都是抽象方法,就可以把这个类改进为一个接口
  • 设计到了接口大面积更新的方法,不想去修改每一个实现类,就可以把这个更新的方法改为带有方法体的默认方法
  • 希望默认方法调用的更加简洁,可以考虑设计为static静态方法(需要去掉default关键字)
  • 默认方法中出现了重复的代码,可以考虑抽取一个私有方法(需要去掉default关键字)

创建格式:

修饰符 interface 接口名称{
// 抽象方法
}
public interface Inter {
    public abstract void add(int a, int b);
}


public class InterImpl implements Inter {

    @Override
    public void add(int a, int b) {
        System.out.println("我是接口的实现类");
    }
}
接口的实现类

类与接口的关系为实现关系,即类实现接口,该类可以称为接口的实现类(子类),实现使用implements 关键字
接口是可以被多实现的
实现类必须重写接口中的所有抽象方法,或者定义自身为抽象类。

实现接口的格式:

修饰符 class 类名 implements 接口1,接口2,接口3...{
}

实现接口案例:
假如我们定义一个运动员的接口,代码如下:

public interface SportMan {
    void run(); // 抽象方法,跑步。

    void law(); // 抽象方法,遵守法律。

    String compittion(String project); // 抽象方法,比赛。
}

定义一个乒乓球运动员类,实现接口:

public class PingPongMan implements SportMan {

    @Override
    public void run() {
        System.out.println("乒乓球运动员稍微跑一下!!");
    }

    @Override
    public void law() {
        System.out.println("乒乓球运动员守法!");
    }

    @Override
    public String compittion(String project) {
        return "参加" + project + "得金牌!";
    }
}

测试类:

    public static void main(String[] args) {
// 创建实现类对象。
        PingPongMan zjk = new PingPongMan();
        zjk.run();
        zjk.law();
        System.out.println(zjk.compittion("全球乒乓球比赛"));
    }

接口的多实现:

  • 类与接口之间的关系是多实现的,一个类可以同时实现多个接口。
    代码演示:先定义两个接口
// 法律规范:接口
  public interface Law {
        void rule();
    }

    //  这一个运动员的规范:接口
    public interface SportMan {
        void run();
    }

定义实现类

public class JumpMan implements Law, SportMan {
        @Override
        public void rule() {
            System.out.println("尊长守法");
        }

        @Override
        public void run() {
            System.out.println("训练跑步!");
        }
    }

注意:

接口多实现,多个接口存在同名的静态方法不会有冲突,因为只能通过各自的接口名访问静态发方法。

接口的优先级:

当一个类,继承另一个类,并且,又实现多个接口时,父类中的成员方法与接口中的默认方法重名时,子类优先执行父类的成员方法(就近原则),可以理解为:谁离我近我就用谁的。

接口与继承:

Java中,接口与接口之间是可以多继承的:也就是一个接口可以同时继承多个接口。

说明:

  • 类和接口是实现关系
  • 接口与接口是继承关系
  • 接口继承接口就是把其他接口的抽象方法与本接口进行了合并。
  • 继承多个接口并且有相同的方法名时,子类必须重写接口同名的方法
public interface InterA {
    void showA();

    default void method() {
        System.out.println("InterA");
    }
}

public interface InterB {
    void showB();

    default void method() {
        System.out.println("InterB");
    }
}

public interface InterC extends InterA, InterB {
    @Override
    default void method() {
        System.out.println("子类必须重写");
    }
}
接口中的方法:
  • 默认方法:

JDK8以后允许接口中定义非抽象方法,但是需要用default关键字修饰,用于解决接口升级问题,默认方法不是抽象方法,不被强制重写,实现类重写默认方法不加default
实现类实现了多个接口,多个接口中存在相同的方法声明,子类必须重写

    public default void show() {
        System.out.println("我就是默认方法");
    }
  • 静态方法:

静态方法只能通过接口名调用,不能通过实现类名或者对象名调用

public static void show() { }
  • 私有方法和私有静态方法:

私有方法产生原因:

  • Java 9中新增了带方法体的私有方法,这其实在Java 8中就埋下了伏笔:Java8允许在接口中定义带方法体的默认方法和静态方法。这样可能就会引发一个问题:当两个默认方法或者静态方法中包含一段相同的代码实现时,程序必然考虑将这段实现代码抽取成一个共性方法,而这个共性方法是不需要让别人使用的,因此用私有给隐藏起来,这就是Java9增加私有方法的必然性。
  • 默认方法可以调用私有的静态方法和非静态方法
    静态方法只能调用私有的静态方法
    私有方法外类调用不了

格式:

 // 私有方法
 private void show() { }

 // 私有静态方法
 private static void method() { }

总结:

实现类直接访问接口的非私有方法,接口非私有静态方法通过类名调用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

什么是接口 的相关文章

  • 如何让 BlazeDS 忽略属性?

    我有一个 java 类 它有一个带有 getter 和 setter 的字段 以及第二对 getter 和 setter 它们以另一种方式访问 该字段 public class NullAbleId private static final
  • Mockito:如何通过模拟测试我的服务?

    我是模拟测试新手 我想测试我的服务方法CorrectionService correctPerson Long personId 实现尚未编写 但这就是它将执行的操作 CorrectionService将调用一个方法AddressDAO这将
  • 如何通过 javaconfig 使用 SchedulerFactoryBean.schedulerContextAsMap

    我使用 Spring 4 0 并将项目从 xml 移至 java config 除了访问 Service scheduleService 带注释的类来自QuartzJobBean executeInternal 我必须让它工作的 xml 位
  • 在内存中使用 byte[] 创建 zip 文件。 Zip 文件总是损坏

    我创建的 zip 文件有问题 我正在使用 Java 7 我尝试从字节数组创建一个 zip 文件 其中包含两个或多个 Excel 文件 应用程序始终完成 没有任何异常 所以 我以为一切都好 当我尝试打开 zip 文件后 Windows 7 出
  • 为 java 游戏创建交互式 GUI

    大家好 我正在创建一个类似于 java 中的 farmville 的游戏 我只是想知道如何实现用户通常单击以与游戏客户端交互的交互式对象 按钮 我不想使用 swing 库 通用 Windows 看起来像对象 我想为我的按钮导入自定义图像 并
  • 动态选择端口号?

    在 Java 中 我需要获取端口号以在同一程序的多个实例之间进行通信 现在 我可以简单地选择一些固定的数字并使用它 但我想知道是否有一种方法可以动态选择端口号 这样我就不必打扰我的用户设置端口号 这是我的一个想法 其工作原理如下 有一个固定
  • 从最终实体获取根证书和中间证书

    作为密码学的菜鸟 我每天都会偶然发现一些简单的事情 今天只是那些日子之一 我想用 bouncy castle 库验证 java 中的 smime 消息 我想我几乎已经弄清楚了 但此时的问题是 PKIXparameters 对象的构建 假设我
  • 没有 Spring 的自定义 Prometheus 指标

    我需要为 Web 应用程序提供自定义指标 问题是我不能使用 Spring 但我必须使用 jax rs 端点 要求非常简单 想象一下 您有一个包含键值对的映射 其中键是指标名称 值是一个简单的整数 它是一个计数器 代码会是这样的 public
  • java.lang.IllegalStateException:提交响应后无法调用 sendRedirect()

    这两天我一直在尝试找出问题所在 我在这里读到我应该在代码中添加一个返回 我做到了 但我仍然得到 java lang IllegalStateException Cannot call sendRedirect after the respo
  • Eclipse Maven Spring 项目 - 错误

    I need help with an error which make me crazy I started to study Java EE and I am going through tutorial on youtube Ever
  • 内部类的构造函数引用在运行时失败并出现VerifyError

    我正在使用 lambda 为内部类构造函数创建供应商ctx gt new SpectatorSwitcher ctx IntelliJ建议我将其更改为SpectatorSwitcher new反而 SpectatorSwitcher 是我正
  • Java ResultSet 如何检查是否有结果

    结果集 http java sun com j2se 1 4 2 docs api java sql ResultSet html没有 hasNext 方法 我想检查 resultSet 是否有任何值 这是正确的方法吗 if resultS
  • 如何在谷歌地图android上显示多个标记

    我想在谷歌地图android上显示带有多个标记的位置 问题是当我运行我的应用程序时 它只显示一个位置 标记 这是我的代码 public class koordinatTask extends AsyncTask
  • 为什么 Java 8 不允许非公共默认方法?

    让我们举个例子 public interface Testerface default public String example return Hello public class Tester implements Testerface
  • 我如何在java中读取二进制数据文件

    因此 我正在为学校做一个项目 我需要读取二进制数据文件并使用它来生成角色的统计数据 例如力量和智慧 它的设置是让前 8 位组成一个统计数据 我想知道执行此操作的实际语法是什么 是不是就像读文本文件一样 这样 File file new Fi
  • 找不到符号 NOTIFICATION_SERVICE?

    package com test app import android app Notification import android app NotificationManager import android app PendingIn
  • 如何使用mockito模拟构建器

    我有一个建造者 class Builder private String name private String address public Builder setName String name this name name retur
  • 如果没有抽象成员,基类是否应该标记为抽象?

    如果一个类没有抽象成员 可以将其标记为抽象吗 即使没有实际理由直接实例化它 除了单元测试 是的 将不应该实例化的基类显式标记为抽象是合理且有益的 即使在没有抽象方法的情况下也是如此 它强制执行通用准则来使非叶类抽象 它阻止其他程序员创建该类
  • Spring Boot 无法更新 azure cosmos db(MongoDb) 上的分片集合

    我的数据库中存在一个集合 documentDev 其分片键为 dNumber 样本文件 id 12831221wadaee23 dNumber 115 processed false 如果我尝试使用以下命令通过任何查询工具更新此文档 db
  • Java中super关键字的范围和使用

    为什么无法使用 super 关键字访问父类变量 使用以下代码 输出为 feline cougar c c class Feline public String type f public Feline System out print fe

随机推荐

  • 解决Windows中d3dcompiler_39.dll缺少问题

    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题 如果是新手第一时间会认为是软件或游戏出错了 其实并不是这样 其主要原因就是你电脑系统的该dll文件丢失了或者损坏了 这时你只需下载这个d3dcompiler 39 dll文件进行安装
  • python判断数是整数还是小数

    a 98 5 s str a split if float s 1 0 print 整数 else print 小数 数转化为字符串并通过split在小数点处分割形成一个列表 转化为浮点型后我们只需要判断s 1 是否为0就可以看出a是否为小
  • Springboot测试类之@RunWith注解

    runWith注解作用 RunWith就是一个运行器 RunWith JUnit4 class 就是指用JUnit4来运行 RunWith SpringJUnit4ClassRunner class 让测试运行于Spring测试环 境 以便
  • flex&bison编写语法分析器

    使用flex和bison 对c语言代码块进行词法分析 识别词法错误 按照c 语法规则进行文法分析 并形成c语言代码块的语法树 syntax tree 并将语法树按照特定的格式打印出来 如何编译 两种方法 1 使用make命令 先将要执行的所
  • 奇数判断

    public class LeetCode03 public static double findMedianSortedArrays int nums1 int nums2 int size nums1 length nums2 leng
  • 力扣:验证回文串

    给定一个字符串 验证它是否是回文串 只考虑字母和数字字符 可以忽略字母的大小写 class Solution public boolean isPalindrome String s int left 0 right s length 1
  • Nginx下载和安装

    1 1 介绍 Nginx是一款轻量级的Web服务器 反向代理服务器及电子邮件 IMAP POP3 代理服务器 其特点是占有内存少 并发能力强 事实上nginx的并发能力在同类型的网页服务器中表现较好 中国大陆使用nginx的网站有 百度 京
  • 时间序列基础包(zoo,zooreg)

    参考 R的极客理想 工具篇 zoo包介绍 zoo是一个R语言类库 zoo类库中定义了一个名为zoo的S3类型对象 用于描述规则的和不规则的有序的时间序列数据 zoo对象是一个独立的对象 包括索引 日期 时间 只依赖于基础的R环境 zoore
  • 统计所有可行路径

    统计所有可行路径 给你一个 互不相同 的整数数组 其中 locations i 表示第 i 个城市的位置 同时给你 start finish 和 fuel 分别表示出发城市 目的地城市和你初始拥有的汽油总量 每一步中 如果你在城市 i 你可
  • java 动态添加字段 以及 动态新增字段注解

    本文是从别的文章作为基础进行创建的 方便自己进行相关操作 引入依赖
  • 量化投资学习-3:股票与美女3-美女的股东婆家和娘家

    股票的价值 除了股票自身的走势和价格 还需要关注股票的股东 股东决定了股票长期向好的程度能走多远 能涨多高 能走多长时间 它们就像美女的婆家和娘家以及他们的亲戚 有实例雄厚的婆家和娘家与亲戚 与没有实力的婆家和娘家和亲戚 对股票的长期走势是
  • Mac安装虚拟机和CentOS

    文章目录 一 下载虚拟机 VMware Fusion和 CentOS 1 下载虚拟机 2 下载CentOS 二 安装CentOS 三 配置CentOS 四 配置虚拟机NAT网络 1 修改宿主机虚拟机配置 2 配置虚拟机偏好设置 3 配置虚拟
  • 软件测试饮料的自动售货机,测试用例设计—自动售货机因果图分析

    测试用例设计 自动售货机因果图分析 6页 本资源提供全文预览 点击全文预览即可全文预览 如果喜欢文档就下载吧 查找使用更方便哦 19 90 积分 命题有一个处理单价为5角钱的饮料的自动售货机软件测试用例的设计 其规格说明如下若投入5角钱或1
  • SpringBoot+Vue 前后端分离跨域导致session不一致的问题

    我今天忙了一晚上才发现根本问题 首先浏览器它有个同源策略 简单来说就是浏览器发送请求的协议 域名和端口要和服务器接收请求的协议 域名以及端口一致 这样才能完成交互 但是很显然这样是不可能的 尤其在对于在同一台电脑上开发前后端分离的项目的时候
  • Python2个自动化键盘鼠标的库 PyAutoGUI和Pywinauto

    Python2个自动化键盘鼠标的库 PyAutoGUI和Pywinauto
  • JWT java代码实现

    JWT JSON Web Token 是一种用于身份验证和授权的开放标准 下面是使用Java实现JWT的示例代码 首先 你需要引入以下库
  • ChatGPT引领AI新浪潮,AIGC商业化启

    ChatGPT引领AI技术新一轮热潮 预示着NLP技术有望迅速进入平民化应用时代 ChatGPT引领AI新浪潮 AIGC商业化启 up pdf https url39 ctfile com f 2501739 805099732 b7842
  • 操作系统学习笔记--信号量(整型信号量、记录型信号量)

    信号量是一种数据结构 可以是整型数 整型数组 链表 记录型变量 结构体 信号量的值与相应资源的使用情况有关 信号量的值仅由P V操作改变 整型信号量S 数据结构是一个整型数 用整型数代表信号可用不可用 小于等于0时不可用 大于0时可用 整型
  • maven的版本号version的总结及理解

    maven的版本号version的总结及理解 本文目的 接上一篇 maven的基本概念介绍 大概了解maven里边的坐标 仓库的概念 其中 坐标里有版本号
  • 什么是接口

    概念 接口是更加彻底的抽象 接口中全部是抽象方法 接口是不能直接创建对象的 从JDK8之后 接口中不再只是抽象方法 接口还可以有默认方法 也就是实例方法 和静态方法了 还包含了私有实例方法和私有静态方法 在JDK8之前 接口中的成分包含 抽