接口以及多态

什么是接口

    接口是一种抽象的数据类型,它定义了一组方法的规范,但没有具体的实现。接口可以被类实现,一个类实现了接口后,必须实现接口中定义的所有方法。接口可以被多个类实现,用以实现多重继承。

接口的定义使用关键字interface,并且可以包含以下内容:

  1. 常量:接口可以定义常量,常量的值在接口中是不能修改的,默认为public static final
  2. 抽象方法:接口中的方法没有方法体,只有方法的声明。默认为public,并且不能包含方法体。实现接口的类必须实现接口中的所有抽象方法。
  3. 默认方法:接口中可以定义默认方法,即带有方法体的方法。默认方法可以在实现接口的类中重写,也可以直接继承使用。
  4. 静态方法:接口中可以定义静态方法,即带有静态修饰符的方法。静态方法可以直接通过接口名调用,不需要实现类的实例。
  5. 私有方法:接口中可以定义私有方法,它们可以被默认方法或静态方法调用,用于代码的复用和封装。

       通过实现接口,类可以具有多态性,同时可以实现不同的接口来实现多重继承的效果。

接口的作用是什么   

   接口的作用主要有以下几点:

  1. 实现多继承:Java不支持多继承,一个类只能继承一个父类,但一个类可以实现多个接口。通过实现接口,一个类可以获得多个接口定义的方法。

  2. 实现特定的行为:接口可以定义一组特定的行为,一个类如果实现了该接口,就必须实现接口定义的所有方法。这样可以确保一组相关的类具有一致的行为。

  3. 实现解耦和扩展:接口可以将类之间的耦合度降低,使得各个类之间的关系更加灵活。通过接口,可以定义对外提供的一组方法,而不需要关心具体的实现细节。这样,当需要修改具体实现时,只需修改实现类,而不需要修改接口定义。

  4. 实现回调函数:接口可以用于实现回调函数。回调函数是一种程序设计模式,在某些事件发生时,系统会通过调用接口中的方法来通知相应的类。通过回调函数,可以实现异步处理、事件驱动等功能。

接口的应用场景  

     接口的应用场景有以下几种:

  1. 定义回调函数:接口可以用于定义回调函数,让一个对象能够通知另一个对象发生了某个事件。通过实现接口,在事件发生时调用接口的方法,可以实现对象之间的解耦。
  2. 定义规范:接口可以定义一组规范,让多个类实现相同的接口,从而保证它们拥有相同的行为和功能。这样可以提高代码的可读性和可维护性。
  3. 实现多态:通过接口,可以实现多态的特性。一个类可以实现多个接口,从而可以被当做多种类型来使用。
  4. 定义常量:接口可以定义一组常量,这些常量可以在不同的类中使用,避免了重复定义和管理的问题。
  5. 开发插件:接口可以用于开发插件系统。插件可以实现特定的接口,从而扩展主程序的功能。这样可以实现开放封闭原则,使主程序更具有扩展性。
  6. 定义事件监听器:接口可以用于定义事件监听器。通过实现接口,可以监听某个事件的发生,并在事件发生时执行相应的操作。
  7. 定义服务提供者接口:接口可以用于定义服务提供者接口,让不同的类实现该接口提供不同的服务,从而实现面向接口的编程,提高代码的可扩展性和可维护性。

实例代码     

   接口的实例代码:

interface Animal {void eat();void sleep();
}class Cat implements Animal {public void eat() {System.out.println("Cat eats fish");}public void sleep() {System.out.println("Cat sleeps on bed");}
}class Dog implements Animal {public void eat() {System.out.println("Dog eats bone");}public void sleep() {System.out.println("Dog sleeps in dog house");}
}public class Main {public static void main(String[] args) {Cat cat = new Cat();cat.eat();cat.sleep();Dog dog = new Dog();dog.eat();dog.sleep();}
}

        首先,我们定义了一个叫做Animal的接口,它包含了两个方法:eat()sleep()。这两个方法没有具体的实现,只是声明了方法的存在。

      然后,我们创建了两个类CatDog,它们分别实现了Animal接口。这意味着这两个类必须要实现eat()sleep()方法,并提供具体的实现。

      在Main类中,我们创建了一个Cat对象和一个Dog对象,并调用它们的eat()sleep()方法。由于它们都实现了Animal接口,所以可以使用相同的代码来调用这些方法。

总结

  1. 定义接口: 接口使用interface关键字来定义,接口名应该按照Java类的命名规范来命名。接口可以包含常量、抽象方法和默认方法。
public interface MyInterface {// 常量public static final int MY_CONSTANT = 10;// 抽象方法public void doSomething();// 默认方法public default void doDefault() {// 实现代码}
}

  1. 实现接口: 类可以通过实现接口来定义自己的行为。使用implements关键字来实现接口。
public class MyClass implements MyInterface {@Overridepublic void doSomething() {// 实现代码}
}

一个类可以实现多个接口,实现接口的类必须实现接口中的所有抽象方法。

  1. 接口与抽象类的区别: 接口与抽象类类似,都是用来定义抽象类型的。它们的主要区别在于:
  • 一个类可以实现多个接口,但只能继承一个抽象类。
  • 接口中的方法都是公共的抽象方法,而抽象类可以包含具体方法和抽象方法。
  • 接口中不能有实例变量,抽象类可以有实例变量。
  1. 接口的继承: 接口可以继承其他接口,使用extends关键字来继承。
public interface MyInterface2 extends MyInterface {// 可以定义新的抽象方法public void doSomething2();
}

继承接口可以使得接口具有更多的行为规范,并且实现这个接口的类需要实现所有继承的抽象方法。

  1. 接口的用途:包括:
  • 定义规范:接口定义了一组方法的规范,可以用来制定程序员必须遵循的接口约定。
  • 实现多态:接口可以作为类型来引用多个实现它的类的对象,实现了多态的特性。
  • 减少耦合:接口将声明和实现分离,使得类之间的耦合度降低,增加了代码的灵活性。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于SSM的社区老年人关怀服务系统

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…

【Vue自定义指令详细介绍】

Vue自定义指令详细介绍 1. 自定义指令1.1 局部1.2 全局 1. 自定义指令 在 Vue.js 中,除了默认提供的核心指令(如 v-model、v-show、v-if 等),Vue.js 也允许注册自定义指令,自定义指令给你提供了一种方法来扩展 Vue 的…

【23种设计模式应用场景汇总】

23种设计模式应用场景汇总 设计模式是一种在软件开发中解决特定问题的通用解决方案。下面我将尝试将23种设计模式融入到一个场景中: 假设我们正在开发一个在线购物系统,我们可以使用以下设计模式: 1. 工厂方法模式:当用户在网站上…

力扣hot100 只出现一次的数字 位运算

Problem: 136. 只出现一次的数字 文章目录 思路复杂度Code 思路 复杂度 时间复杂度: O ( n ) O(n) O(n) 空间复杂度: O ( n ) O(n) O(n) Code class Solution {public int singleNumber(int[] nums) {int res 0;for(int x : nums)res ^ x;return res;} }

UI自动化测试框架

文章目录 UI自动化基础什么是UI自动化测试框架UI自动化测试框架的模式数据驱动测试框架关键字驱动测试框架行为驱动测试框架 UI自动化测试框架的作用UI自动化测试框架的核心思想UI自动化测试框架的步骤UI自动化测试框架的构成UtilsLog.javaReadProperties.Java coreBaseTest.ja…

【分布式技术】监控技术zabbix实操

目录 一、脚本监控nginx的连接状态 步骤一:做好nginx的配置 步骤二:完成监控数据脚本编写,并使用zabbix_get测试 步骤三:在zabbix agent配置目录中,编写以conf结尾的用户参数文件 步骤四:在zabbix web…

Python 网络编程之TCP详细讲解

【一】传输层 【1】概念 传输层是OSI五层模型中的第四层,负责在网络中的两个端系统之间提供数据传输服务主要协议包括**TCP(传输控制协议)和UDP(用户数据报协议)** 【2】功能 **端到端通信:**传输层负责…

HackerGPTWhiteRabbitNeo的使用及体验对比

1. 简介 WhiteRabbitNeo(https://www.whiterabbitneo.com/)是基于Meta的LLaMA 2模型进行特化的网络安全AI模型。通过专门的数据训练,它在理解和生成网络安全相关内容方面具有深入的专业能力,可广泛应用于教育、专业培训和安全研究…

MongoDB系统性能调优(持续更新)

cache_size 指定WT存储引擎内部cache的内存用量上限。 需要注意的是,仅作用于WiredTiger cache,而非mongod进程的内存用量上限。MongoDB同时使用WT cache和文件系统cache,往往mongod进程的内存用量高于该值。cache_size相对于物理内存总量不要…

聊聊PowerJob的TransportServiceAware

序 本文主要研究一下PowerJob的TransportServiceAware TransportServiceAware tech/powerjob/server/remote/aware/TransportServiceAware.java public interface TransportServiceAware extends PowerJobAware {void setTransportService(TransportService transportServi…

什么是非电离辐射与电离辐射?

摘要: 非电离辐射和电离辐射是两种不同类型的辐射,它们主要区别在于能量水平和与物质相互作用的方式。 非电离辐射 非电离辐射是指能量较低,不足以使原子或分子的电子脱离其原子核束缚而产生电离现象的电磁波。这类辐射不 ... 非电离辐射和电离辐射是两…

多角度俯瞰Python函数及作用

什么是函数 我们应该都学过三角函数吧,比如正弦函数,在最初接触到这方面的知识的时候,我们要求sin30是不是要去查一个叫做“三角函数值查表”的东西,然后得出sin30 0.5。 那么问题来了,sin30为什么会等于0.5呢&…

嵌入式培训机构四个月实训课程笔记(完整版)-C++和QT编程第四天-C++动态联编和虚函数(物联技术666)

链接:https://pan.baidu.com/s/1QO44mZtlgbiStTuI6sQP4g?pwd=1688 提取码:1688 上午:动态联编和虚函数 下午:QT介绍 教学内容: 1、动态联编和虚函数: 编译程序在编译阶段并不能确切知道将要调用的函数,只有在程序运行时才能确定将要调用的函数,这要求联编工作要…

国内环境 GitHub 拉取仓库速度慢的缓解方案

第一步: 浏览器打开如下两个网址,找到对应 IP 地址: GitHub.com - GitHub: Lets build from here GitHubgithub.global.ssl.fastly.net 假设对应 IP 地址分别为 140.82.xx.xxx 和 199.232.yy.yyy 第二步: 编辑 hosts 文件 sud…

openssl3.2 - 官方demo学习 - kdf - scrypt.c

文章目录 openssl3.2 - 官方demo学习 - kdf - scrypt.c概述笔记END openssl3.2 - 官方demo学习 - kdf - scrypt.c 概述 设置 kdf-SCRYPT算法的参数, 取key 笔记 /*! \file scrypt.c \note openssl3.2 - 官方demo学习 - kdf - scrypt.c 设置 kdf-SCRYPT算法的参数, 取key */…

Centos 更换内核

文章目录 一、查看/更换系统内核1.1 查看当前运行环境的内核1.2 查看系统上所有可用内核1.3 切换内核方法一:通过启动菜单更换内核方法二:更换默认启动内核 二、安装内核2.1 使用ELRepo安装2.2 安装指定内核版本参考资料 一、查看/更换系统内核 1.1 查看…

docker搭建SSH镜像、systemctl镜像、nginx镜像、tomcat镜像

目录 一、SSH镜像 二、systemctl镜像 三、nginx镜像 四、tomcat镜像 五、mysql镜像 一、SSH镜像 1、开启ip转发功能 vim /etc/sysctl.conf net.ipv4.ip_forward 1sysctl -psystemctl restart docker 2、 cd /opt/sshd/vim Dockerfile 3、生成镜像 4、启动容器并修改ro…

面试题:你知道 Spring lazy-init 懒加载的原理吗?

文章目录 前言一、先睹为快二、原理分析三、总结 前言 普通的bean的初始化是在容器启动初始化阶段执行的,而被lazy-init修饰的bean 则是在从容器里第一次进行context.getBean(“”)时进行触发。 Spring 启动的时候会把所有bean信息(包括XML和注解)解析转化成Spring…

这可能是最全面的Java并发编程八股文了

内容摘自我的学习网站:topjavaer.cn 分享50道Java并发高频面试题。 线程池 线程池:一个管理线程的池子。 为什么平时都是使用线程池创建线程,直接new一个线程不好吗? 嗯,手动创建线程有两个缺点 不受控风险频繁创…

SpringBoot基础:一步步创建SpringBoot工程

摘要 本文介绍了,从零开始创建SpringBoot工程,且在每一步给出分析和原因。创建maven – 转Springboot – 引入jdbc – 引入数据库操作框架,最后给出了不同场景指定不同配置文件的方案。 背景 为什么要使用SpringBoot工程? 使用Sp…