【Java基础】23.接口

文章目录

  • 一、接口的概念
    • 1.接口介绍
    • 2.接口与类相似点
    • 3.接口与类的区别
    • 4.接口特性
    • 5.抽象类和接口的区别
  • 二、接口的声明
  • 三、接口的实现
  • 四、接口的继承
  • 五、接口的多继承
  • 六、标记接口


一、接口的概念

1.接口介绍

接口(英文:Interface),在 JAVA 编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。

接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念。类描述对象的属性和方法。接口则包含类要实现的方法。

除非实现接口的类是抽象类,否则该类要定义接口中的所有方法。

接口无法被实例化,但是可以被实现。一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类。另外,在 Java 中,接口类型可用来声明一个变量,他们可以成为一个空指针,或是被绑定在一个以此接口实现的对象。

2.接口与类相似点

  • 一个接口可以有多个方法。
  • 接口文件保存在 .java 结尾的文件中,文件名使用接口名。
  • 接口的字节码文件保存在 .class 结尾的文件中。
  • 接口相应的字节码文件必须在与包名称相匹配的目录结构中。

3.接口与类的区别

  • 接口不能用于实例化对象。
  • 接口没有构造方法。
  • 接口中所有的方法必须是抽象方法,Java 8 之后 接口中可以使用 default 关键字修饰的非抽象方法。
  • 接口不能包含成员变量,除了 static 和 final 变量。
  • 接口不是被类继承了,而是要被类实现。
  • 接口支持多继承。

4.接口特性

  • 接口中每一个方法也是隐式抽象的,接口中的方法会被隐式的指定为 public abstract(只能是 public abstract,其他修饰符都会报错)。
  • 接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量(并且只能是 public,用 private 修饰会报编译错误)。
  • 接口中的方法是不能在接口中实现的,只能由实现接口的类来实现接口中的方法。

5.抽象类和接口的区别

  • 抽象类中的方法可以有方法体,就是能实现方法的具体功能,但是接口中的方法不行。
  • 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的。
  • 接口中不能含有静态代码块以及静态方法(用 static 修饰的方法),而抽象类是可以有静态代码块和静态方法。
  • 一个类只能继承一个抽象类,而一个类却可以实现多个接口。

注意:JDK 1.8 以后,接口里可以有静态方法和方法体了。

注意:JDK 1.8 以后,接口允许包含具体实现的方法,该方法称为"默认方法",默认方法使用 default 关键字修饰。更多内容可参考 Java 8 默认方法。

注意:JDK 1.9 以后,允许将方法定义为 private,使得某些复用的代码不会把方法暴露出去。更多内容可参考 Java 9 私有接口方法。

二、接口的声明

接口的声明语法格式如下:

[可见度] interface 接口名称 [extends 其他的接口名] {
        // 声明变量
        // 抽象方法
}

Interface关键字用来声明一个接口。下面是接口声明的一个简单例子。

/**
 * @ClassName: SportManInterface
 * @Description: 接口
 * Interface关键字用来声明一个接口。
 * @author: Zh
 * @date: 2024/4/21 8:56
 */
public interface SportManInterface {
    // 接口中的成员:JDK 1.8之前只有 常量 和 抽象方法

    // 常量
    // public static final 可以省略不写,接口默认会为你加上!
    public static final String NAME = "孙悟空";
    String SCHOOL_NAME = "花果山";

    // 2、抽象方法
    //  public abstract 可以省略不写,接口默认会为你加上!
    public abstract void talk();
    void run();

    // 这也是抽象方法
    public void sleep(int a);
}

接口有以下特性:

  • 接口是隐式抽象的,当声明一个接口的时候,不必使用abstract关键字。
  • 接口中每一个方法也是隐式抽象的,声明时同样不需要abstract关键字。
  • 接口中的方法都是公有的。

三、接口的实现

当类实现接口的时候,类要实现接口中所有的方法。否则,类必须声明为抽象的类。

类使用implements关键字实现接口。在类声明中,Implements关键字放在class声明后面。

实现一个接口的语法,可以使用这个公式:

...implements 接口名称[, 其他接口名称, 其他接口名称..., ...] ...

IDEA 快捷键 Alt + Enter:
实现类快捷键
接口 SportManInterface 的实现类,实例:

public class SportManInterfaceImpl implements SportManInterface {
    @Override
    public void talk() {
        System.out.println("在聊天");
    }

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

    @Override
    public void sleep(int a) {
        System.out.println(a + "个人在睡觉");
    }

    public static void main(String[] args) {
        SportManInterfaceImpl s = new SportManInterfaceImpl();
        s.talk();
        s.run();
        s.sleep(5);
    }

}

编译运行结果如下:

在聊天
在跑步
5个人在睡觉

重写接口中声明的方法时,需要注意以下规则:

  • 类在实现接口的方法时,不能抛出强制性异常,只能在接口中,或者继承接口的抽象类中抛出该强制性异常。
  • 类在重写方法时要保持一致的方法名,并且应该保持相同或者相兼容的返回值类型。
  • 如果实现接口的类是抽象类,那么就没必要实现该接口的方法。

在实现接口的时候,也要注意一些规则:

  • 一个类可以同时实现多个接口。
  • 一个类只能继承一个类,但是能实现多个接口。
  • 一个接口能继承另一个接口,这和类之间的继承比较相似。

四、接口的继承

一个接口能继承另一个接口,和类之间的继承方式比较相似。接口的继承使用extends关键字,子接口继承父接口的方法。

实例:
父接口 People:

public interface People {
    void eat(); // 和接口 Law 的抽象方法一样

    void talk();
}

子接口 Teacher:

/**
 * @ClassName: Teacher
 * @Description: 接口的继承
 * 一个接口能继承另一个接口,和类之间的继承方式比较相似。
 * 接口的继承使用extends关键字,子接口继承父接口的方法。
 * @author: Zh
 * @date: 2024/4/21 10:12
 */
public interface Teacher extends People{
    void teach();
}

接口 Teacher 的实现类 TeacherImpl :

/**
 * @ClassName: TeacherImpl
 * @Description: 继承的接口,的实现类
 * @author: Zh
 * @date: 2024/4/21 10:14
 */
public class TeacherImpl implements Teacher {
    @Override
    public void eat() {
        System.out.println("在吃饭");
    }

    @Override
    public void talk() {
        System.out.println("在聊天");
    }

    @Override
    public void teach() {
        System.out.println("在教书");
    }
}

Teacher 接口自己声明了1个方法,从 People 接口继承了2个方法,这样,实现 Teacher 接口的类需要实现3个方法。

五、接口的多继承

在 Java 中,类的多继承是不合法,但接口允许多继承。
在接口的多继承中extends关键字只需要使用一次,在其后跟着继承接口。 如下所示:

public interface Hockey extends Sports, Event

以上的程序片段是合法定义的子接口,与类不同的是,接口允许多继承,而 Sports及 Event 可以定义或是继承相同的方法。

实例:
接口 People:

public interface People {
    void eat(); // 和接口 Law 的抽象方法一样

    void talk();
}

接口 Law:

public interface Law {
    void rule();

    void eat(); // 和接口 People 的抽象方法一样
}

接口 SportMan 继承接口 Law 和 People :

/**
 * @ClassName: SportMan
 * @Description: 接口的多继承
 * 一个接口可以同时继承多个接口
 * @author: Zh
 * @date: 2024/4/21 9:56
 */
public interface SportMan extends Law, People {
    void run();

    void competition();
}

接口 SportMan 的实现类 BasketballMan :

/**
 * @ClassName: BasketballMan
 * @Description: 多继承的接口,的实现类
 * @author: Zh
 * @date: 2024/4/21 9:59
 */
// 相当于:public class BasketballMan implements Law, SportMan, People {
public class BasketballMan implements SportMan {

    @Override
    public void rule() {
        System.out.println("遵守法律。");
    }

    @Override
    public void eat() { // 接口 People 和接口 Law 都有 eat 抽象方法,但只用实现一次
        System.out.println("人们在吃饭。");
    }

    @Override
    public void talk() {
        System.out.println("人们在聊天。");
    }

    @Override
    public void run() {
        System.out.println("人们在跑步。");
    }

    @Override
    public void competition() {
        System.out.println("人们在竞争。");
    }

    public static void main(String[] args) {
        BasketballMan man = new BasketballMan();
        man.talk();
        man.eat();
        man.run();
        man.rule();
        man.competition();
    }

}

编译运行结果如下:

人们在聊天。
人们在吃饭。
人们在跑步。
遵守法律。
人们在竞争。

六、标记接口

最常用的继承接口是没有包含任何方法的接口。

标记接口是没有任何方法和属性的接口.它仅仅表明它的类属于一个特定的类型,供其他代码来测试允许做一些事情。

标记接口作用:简单形象的说就是给某个对象打个标(盖个戳),使对象拥有某个或某些特权。

例如:java.awt.event 包中的 MouseListener 接口继承的 java.util.EventListener 接口定义如下:

package java.util;
public interface EventListener
{}

没有任何方法的接口被称为标记接口。标记接口主要用于以下两种目的:

  • 建立一个公共的父接口
    正如EventListener接口,这是由几十个其他接口扩展的Java API,你可以使用一个标记接口来建立一组接口的父接口。例如:当一个接口继承了EventListener接口,Java虚拟机(JVM)就知道该接口将要被用于一个事件的代理方案。
  • 向一个类添加数据类型
    这种情况是标记接口最初的目的,实现标记接口的类不需要定义任何接口方法(因为标记接口根本就没有方法),但是该类通过多态性变成一个接口类型。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/563577.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

运维小技能:nacos部署(外接mysql)

文章目录 I 安装nacos(m1版本)1.1 镜像启动1.2 查看docker容器日志1.3 开启鉴权II 外接mysql的docker部署方式2.1 复制mysql-schema.sql2.2 导入mysql-schema.sqlIII 配置远程用户3.1 创建数据库远程用户3.2 查看远程用户是否有密码I 安装nacos(m1版本) docker search nacos:查…

【前端工程化指南】Git常见操作之仓库相关操作

初始化本地仓库(init) 我们可以使用git init命令在当前或指定目录中初始化一个新的本地仓库,创建.git目录并设置仓库的基本配置。初始化仓库完成后,你可以使用其他 Git 命令来进行版本控制、提交更改以及与远程仓库进行交互。 命…

3月衣物清洁行业数据概况和趋势分析:总销额环比上涨超60%!

人们日常生活离不开衣物清洁产品,同时随着生活品质得提高和消费者健康意识得增强,对于衣物清洁行业的需求量与日俱增。作为日常必备的消耗品,衣物清洁产品备受消费者关注。借此,衣物清洁行业在3月份表现出稳定的发展态势。 根据鲸…

HANA SQL消耗内存和CPU线程的限制参数

HANA再处理大数据表相关的复杂Sql时,如果没有设置Memory和CPU线程上限的话,会将HANA的资源占用殆尽,造成HANA无法响应其他Sql请求,导致表现在应用服务器上就是系统卡顿的情况。解决上述问题的办法就是按照下图设置Memory(图1&…

如何封装Vue组件并上传到npm

前言 环境准备 1.注册npm账号:npm | Home (npmjs.com) 2.保证当前环境安装了vue、webpack、node,以下工作将在该环境下进行(没有的小伙伴自行百度安装哈~) 3.一下用到的环境版本 webpack:v5.1.4node:v…

编程实践:使用C语言计算k阶常系数线性递归序列

开篇 本文的目的是使用C语言模拟k阶常系数线性递归的运算过程,题目来源为《编程珠玑》第3章【数据决定程序结构】的课后习题2。具体的题目概要和代码实现,请看下文。 问题概要 因为这种问题涉及到的数学公式不太方便打出来,我直接用我笔记的原…

c++ 二分查找

二分查找(Binary Search)是一种在有序数组中查找特定元素的高效算法。它通过不断将搜索范围减半来查找目标元素。其时间复杂度为 O(log n),这是因为每一步都将搜索范围减半,因此算法的性能非常高。 二分查找的基本思想是&#xf…

openwrt局域网配置多个IP

在局域网配置过程中,若是DHCP服务器关闭,又忘记了配置的ip,将很难访问到路由器重新进行配置。这种情况可以在路由器出厂时做一个备用ip去避免。 1.配置 以下是备用ip的配置方法,以SKYLAB的SKW99 WIFI模组为例进行说明&#xff1…

Java 网络编程之TCP(一):基于BIO

环境: jdk 17 IntelliJ IDEA 2023.1.1 (Ultimate Edition) Windows 10 专业版 22H2 TCP:面向连接的,可靠的数据传送协议 Java中的TCP网络编程,其实就是基于常用的BIO和NIO来实现的,本文先讨论BIO; BIO…

Xilinx 7系列FPGA 高性能(HP)接口与2.5V/3.3V 外设IO接口设计考虑

引言:Xilinx 7系列FPGA IO Bank分为HP Bank和HR Bank,HP IO接口电压范围为1.2V~1.8V,可以实现高性能,HR IO接口电压范围为1.2V~3.3V。当HR Bank与2.5V或者3.3V外设互联时,需要考虑接口电平的兼容性。根据性能需求、功能…

在Linux操作系统中介绍文件属性

查看文件属性,,可以使用命令lsattr 文件路径 使用命令lsattr 文件路径 查看文件属性 如上图所示,没有给文件 /etc/fstab 文件设置任何属性。 设置文件属性,,可以使用命令chattr 需要为文件加上的属性&#xff0…

葡萄书--深度学习基础

卷积神经网络 卷积神经网络具有的特性: 平移不变性(translation invariance):不管检测对象出现在图像中的哪个位置,神经网络的前面几层应该对相同的图像区域具有相似的反应,即为“平移不变性”。图像的平移…

DHT11实验

文章目录 11.11.2 234 DS18B20 只能检测温度 右边这几个 都能 1 1.1 数字信号输出 指 0/1使用单总线通信 1个IO口就能获取温湿度 T/H要有 模数转化(内部还有个8位单片机)电容感湿元件 白色的 还有个ic NTC测温 可能在ic内部 使用单片机内部测温 精确度不…

服务器渲染技术(JSPELJSTL)

目录 前言 一.JSP 1.基本介绍 3.page指令(常用) 4.JSP三种常用脚本 4.1 声明脚本 <%! code %> 4.2 表达式脚本 <% code %> 4.3 代码脚本 <% code %> 4.4 注释 <%-- 注释 --%> 5. JSP 内置对象 5.1 基本介绍 5.2 九个内置对象 6.JSP域对象 二…

Python 物联网入门指南(六)

原文&#xff1a;zh.annas-archive.org/md5/4fe4273add75ed738e70f3d05e428b06 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第十七章&#xff1a;机器人学 101 一提到机器人&#xff0c;我们就会被科幻小说所包围。我们可能会想起动画片《杰森一家》或者电影《终结…

MySQL如何避免全表扫描?

MySQL如何避免全表扫描&#xff1f; 这篇文章解释了何时以及为什么MySQL会执行全表扫描来解析查询&#xff0c;以及如何避免在大型表上进行不必要的全表扫描。 何时会发生全表扫描 MySQL使用全表扫描&#xff08;在EXPLAIN输出中的type列显示为ALL&#xff09;来解析查询的几…

汇智知了堂晨会聚焦:NAS应用如何赋能网络安全实战

在近期汇智知了堂网络安全75班的晨会上&#xff0c;一场关于NAS应用的深入分享完美展开。学员们以饱满的热情投入到这场安全讨论中&#xff0c;共同探索网络安全的新天地。 此次分享会聚焦于NAS的应用&#xff0c;旨在帮助学员们更好地了解NAS的定义与功能&#xff0c;掌握其在…

Reddit数据API 获取reddit的帖子、评论、按关键字搜索

近期调研发现 iDataRiver平台 https://www.idatariver.com/zh-cn/ 提供开箱即用的Reddit数据采集API&#xff0c;是目前用下来最方便简单的API&#xff0c;可以抓取 reddit 公开数据&#xff0c;例如 subreddit 中的帖子、按关键字搜索以及文章评论等&#xff0c;供用户按需调用…

智慧养老平台|基于SprinBoot+vue的智慧养老平台系统(源码+数据库+文档)

智慧养老平台目录 基于SprinBootvue的外贸平台系统 一、前言 二、系统设计 三、系统功能设计 前台 后台 管理员功能 老人功能 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农…

【计算机组成原理】定点数的乘法运算

定点数的乘法运算 定点乘法运算人工算法和机器的矛盾不带符号的阵列乘法器带符号的阵列乘法器求补电路求补电路的思想 ✨️间接补码乘法运算的步骤 定点乘法运算 在定点计算机中&#xff0c;两个原码表示的数相乘的运算规则是&#xff1a;乘积的符号位 两数的符号位异或&…