【Java基础篇 | 面向对象】—— 聊聊什么是接口(上篇)
个人主页:兜里有颗棉花糖
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创
收录于专栏【JavaSE_primary】
本专栏旨在分享学习JavaSE的一点学习心得,欢迎大家在评论区交流讨论💌
关于接口的简单的介绍请看这篇文章(接口的简单介绍),本文将继续接着上篇对接口进行更加详细的讲解。
目录
- 一、接口的代码实现(简单接口回顾)
- 二、接口特性
- 三、实现多个接口
- 四、接口间的继承(extends)
一、接口的代码实现(简单接口回顾)
这里由于代码过长所以只能以图片的方式进行呈现了,大家先凑活看哈,请看:
接口:
运行结果如下:
二、接口特性
接口是不能进行实例化的:
接口类型是一种引用类型,所以不能new
接口的对象。- 接口中的每个方法都是
public abstract
修饰的方法,接口中的方法都会被隐式的指定为public abstract
,也只能是被public abstract
修饰,使用其它的修饰符都会报错。 - 接口中的方法不能在接口中实现,只能在实现接口中的类进行实现,如果非要在接口中进行实现的话,该方法必须由
default
进行修饰。 - 子类实现接口中方法的时候,这个方法必须是由
public
进行修饰(因为接口中的抽象方法一定是由public abstract
进行修饰的)。 - 接口中可以含有变量,这个变量会被隐式的指定为
public static final
修饰。 - 接口中不能含有静态代码块和构造方法。
- 接口虽然不是类,但是接口编译完成后
字节码文件的后缀格式就是.class
- 如果类中没有实现接口中的所有抽象方法,则该类必须设置为抽象类(出来混迟早要还的)。
- jdb8中,接口中还可以包含
default
方法。
三、实现多个接口
下面来看多接口的代码:
interface IFlying {void fly();
}
interface ISwimming {void swim();
}
interface IRunning {void run();
}
abstract class Animal {public int age;public String name;public abstract void eat();
}
class Dog extends Animal implements IRunning,ISwimming {@Overridepublic void eat() {System.out.println(this.name + "正在吃狗粮");}@Overridepublic void run() {System.out.println(this.name + "正在跑步");}@Overridepublic void swim() {System.out.println(this.name + "正在狗刨式游泳");}
}
解释1:子类
Dog
必须先继承父类然后再实现接口中的方法。即class Dog extends Animal implements IRunning,ISwimming
java中之所以子类必须先继承父类然后再实现接口中的方法是因为java不支持多继承。
解释2:为什么不把三个接口中的方法写到抽象类
Animal
中?
在上述代码中,将飞行、游泳和奔跑这三个行为分别定义在了接口IFlying、ISwimming和IRunning中,而没有将它们写入抽象类Animal中的原因是因为接口和抽象类具有不同的设计目的和用途。
抽象类用于表示一类对象的通用特性和行为,并且可以包含具体的方法实现。抽象类可以作为其他类的基类,被继承和扩展。
(请结合上述代码加以理解。)
接口则用于定义一组行为或功能的契约,它只能包含方法声明,而不能包含方法的实现。接口允许一个类实现多个接口,从而具备多个角色或行为。接口实现了多态性的概念,使得不同的类可以实现相同的接口,并根据自己的需求来实现具体的方法。
在给定的例子中,抽象类Animal表示了动物的通用特性,并且包含了方法的具体实现(例如eat方法)。而接口IFlying、ISwimming和IRunning表示了特定的行为,是动态的、可扩展的契约。通过在Dog类中实现这些接口,Dog类表明自己具有飞行、游泳和奔跑的能力。(并不是所有的动物都会飞或者游泳或者跑
)
如果把接口换成类也是不可以的,因为java中只支持单继承。所以Java中的接口提供了一种解决多继承问题的机制
。
好了,现在我们对上述代码进行拓展方便大家能够更好的进行理解,代码如下:
interface IFlying {void fly();
}
interface ISwimming {void swim();
}
interface IRunning {void run();
}
abstract class Animal {private int age;private String name;public abstract void eat();public Animal(String name,int age) {this.name = name;this.age = age;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}
}
class Dog extends Animal implements IRunning,ISwimming {public Dog(String name, int age) {super(name, age);}@Overridepublic void eat() {System.out.println(this.getName() + "正在吃狗粮");}@Overridepublic void run() {System.out.println(this.getName() + "正在跑步");}@Overridepublic void swim() {System.out.println(this.getName() + "正在狗刨式游泳");}
}class Bird extends Animal implements IFlying {public Bird(String name, int age) {super(name, age);}@Overridepublic void eat() {System.out.println(this.getName() + "正在吃鸟粮!");}@Overridepublic void fly() {System.out.println(this.getName() + "正在用翅膀飞!");}
}class Robot implements IRunning {@Overridepublic void run() {System.out.println("机器人正在跑!");}
} // Robot甚至不是动物,但是机器人会跑啊,所以我们依然可以结合IRunning()接口来进行使用。public class Test {public static void test1(Animal animal) {animal.eat();}public static void test2(IFlying iFlying) {iFlying.fly();}public static void testRun(IRunning iRunning) {iRunning.run();}public static void testSwim(ISwimming iSwimming) {iSwimming.swim();}public static void main(String[] args) {test2(new Bird("小鸟3",3));testRun(new Dog("小狗2",2));testSwim((new Dog("小狗3",4)));testRun(new Robot());}public static void main1(String[] args) {test1(new Bird("小鸟1",3)); // 向上转型:父类引用引用了子类,子类中重写了父类中的抽象方法test1(new Dog("小狗1",3)); // 向上转型:父类引用引用了子类,子类中重写了父类中的抽象方法}
}
上述代码是java面向对象编程中最常见的一个用法:一个类继承父类,并且实现了多个接口。
继承表达的是一个
is a
的意思,即它是哪一类东西,而接口表达的具有某种特性
。举个栗子:
青蛙是一种动物
,它可以在水里游泳
老鹰也是一种动物
,它可以在天空中遨游
狼是一种动物
,它可以在草地上跑
java中的这种设计(
一个类继承父类,并且实现了多个接口
)提醒我们要忘记某一事物的类型,因为有了接口之后我们只需要关心该事物是否具有某种特性
。
四、接口间的继承(extends)
类和类之间是通过
extends
来来进行继承的。
类和接口之间的关系:通过implements来实现接口。
接口和接口之间也是存在关系的,是通过extends
来进行关联的。即拓展接口功能。
如下图,请看:
上图接口C不仅仅有自己的功能也会同时由接口A和接口B的功能。
上图中的类D不仅仅要实现接口C的功能,而且还需要实现接口A和接口B的功能。(接口间的继承可以理解为把多个接口合并在一起
)
好了,以上就是Java中接口中最基本的内容了。就到这里吧,再见啦友友们!!!
相关文章:

【Java基础篇 | 面向对象】—— 聊聊什么是接口(上篇)
个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【JavaSE_primary】 本专栏旨在分享学习JavaSE的一点学习心得,欢迎大家在评论区交流讨论💌 关于接口的简单的介绍…...
golang实现函数yamlToStruct(infile,outFile)
问: golang实现函数yamlToStruct(infile,outFile),将yaml文件格式化成golang的结构体 gpt: 要实现一个将YAML文件格式化成Golang结构体的函数,你可以使用 yaml 和 reflect 包来处理。首先,你需要使用 yaml.Unmarshal 函数将YAML文件解析为一…...

产品成本收集器流程演示
感谢大佬的文章,我只是一个翻译搬运工,原文地址:产品成本收集器 概述 SAP 令人兴奋的部分之一是它在不同操作模块之间的集成程度。使用产品成本收集器来跟踪生产就是一个很好的例子。在本博客中,我计划遵循产品成本收集器流程&a…...

【微服务】springboot整合quartz使用详解
目录 一、前言 二、quartz介绍 2.1 quartz概述 2.2 quartz优缺点 2.3 quartz核心概念 2.3.1 Scheduler 2.3.2 Trigger 2.3.3 Job 2.3.4 JobDetail 2.4 Quartz作业存储类型 2.5 适用场景 三、Cron表达式 3.1 Cron表达式语法 3.2 Cron表达式各元素说明 3.3 Cron表达…...

Electron+Ts+Vue+Vite桌面应用系列:TypeScript常用时间处理工具
文章目录 1️⃣ 时间处理工具1.1 格式化时间1.2 把时间戳改成日期格式1.3 Day.js 工具类使用1.4 date-fns 工具类使用 优质资源分享 作者:xcLeigh 文章地址:https://blog.csdn.net/weixin_43151418/article/details/134712978 ElectronTsVueVite桌面应用…...

记录 | centos源码编译bazel
tensorflow的源码编译依赖于 bazel 这里进行 bazel 的源码编译 1、安装依赖 sudo yum install -y java-11-openjdk sudo yum install -y java-11-openjdk-devel sudo yum install -y protobuf-compiler zip unzip2、知悉要安装的 bazel 的版本 务必安装受支持的 Bazel 版本…...

常见的Bean工厂后置处理器
此代码在jdk11上测试通过,SpringBoot版本为2.7.14 1.上代码 导入坐标 <dependencies><!-- spring数据坐标 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-rest</art…...
代码随想录算法训练营第四十二天| 416 分割等和子集
目录 416 分割等和子集 416 分割等和子集 class Solution { public:const int N 210;bool canPartition(vector<int>& nums) {vector<int>f(N);int sum 0;for(auto num : nums)sum num;if(sum % 2 1)return false;//如果int target sum / 2;for(int i …...

memmove 和 memcpy的区别
函数原型及作用 memcpy 和 memmove 都是C语言中的库函数,在头文件string.h中,作用是拷贝一定长度的内存的内容,原型分别如下: void* memcpy(void *dst, const void *src, size_t count); void* memmove(void *dst, const void *…...
C实现的双向链表队列
如下代码所示,一个头文件实现的双向链表,用c代码实现: #ifndef _LINUX_LIST_H #define _LINUX_LIST_H#include "stddef.h" #include "poison.h"#ifndef ARCH_HAS_PREFETCH #define ARCH_HAS_PREFETCH static inline voi…...

自适应中值滤波器的python代码实现-----冈萨雷斯数字图像处理
基本原理: 自适应中值滤波器是一种图像处理技术,用于去除图像中的噪声。其原理是根据像素周围邻域内像素值的特性,动态地选择滤波器的大小和中值滤波的程度。 **邻域选择:**对于每个像素点,选取一个窗口或者邻域&…...
Python作业答疑_6.22~6.25
一、Python 一班 1. 基数分割列表 1.1 问题描述 给定一无序数列,把数列的第一个数字当成基数,让数列中基数小的数字排在数列前面,比基数大的数字排在数列的后面。 1.2 问题示例 如数列:num[4,1,8,3,9,2,10,7]。基数为 4&…...

Uber Go 语言编码规范
uber-go/guide 的中文翻译 English 文档链接 Uber Go 语言编码规范 Uber 是一家美国硅谷的科技公司,也是 Go 语言的早期 adopter。其开源了很多 golang 项目,诸如被 Gopher 圈熟知的 zap、jaeger 等。2018 年年末 Uber 将内部的 Go 风格规范 开源到 G…...
UniRepLKNet:用于音频、视频、点云、时间序列和图像识别的通用感知大内核ConvNet
摘要 https://arxiv.org/abs/2311.15599 大核卷积神经网络(ConvNets)最近受到了广泛的研究关注,但存在两个未解决的关键问题需要进一步研究。(1)现有大核ConvNets的架构在很大程度上遵循传统ConvNets或Transformers的设计原则,而大核ConvNets的架构设计仍未得到充分解决。(2…...

Http协议与Tomcat
HTTP协议 HTTP协议(HyperText Transfer Protocol)即超文本传输协议 ,是TCP/IC网络体系结构应用层的一个客户端-服务端协议,是所有客户端,服务端数据传输的基石(数据传输规则) 特点 ⭐基于TCP协…...

Spring AOP从入门到精通
目录 1. AOP的演化过程 1. 代理模式 2. 动态代理 2.1 JDK动态代理 2.2 Cglib动态代理 3. Spring模式 3.1 ProxyFactory 3.2 ProxyFactoryBean 3.3 AbstractAutoProxyCreator 2. Spring AOP抽象 1. 核心术语 1.1 连接点(JoinPoint) 1.2 切点(Pointcut) 1.3 增强(Ad…...

Tap虚拟网卡
1 概述 Tap设备通常用于虚拟化场景下,其驱动代码位于drivers/net/tun.c,tap与tun复用大部分代码, 注:drivers/net/tap.c并不是tap设备的代码,而是macvtap和ipvtap; 下文中,我们统一称tap&#…...

【数电笔记】53-与非门构成的基本RS触发器
目录 说明: 1. 电路组成 2. 逻辑功能 3. 特性表 4. 特性方程 5. 状态转换图 6. 驱动表 7. 例题 例1 例2 说明: 笔记配套视频来源:B站;本系列笔记并未记录所有章节,只对个人认为重要章节做了笔记;…...

kubernetes(k8s)容器内无法连接同所绑定的Service ClusterIP问题记录
kubernetes(k8s)容器内无法连接同所绑定的Service ClusterIP问题记录 1. k8s环境 k8s使用kubernetes-server-linux-amd64_1.19.10.tar.gz 二进制bin 的方式手动部署 k8s 版本: [rootmaster ~]# kubectl version Client Version: version.Info{Major:"1", Minor:&…...

Hadoop入门学习笔记
视频课程地址:https://www.bilibili.com/video/BV1WY4y197g7 课程资料链接:https://pan.baidu.com/s/15KpnWeKpvExpKmOC8xjmtQ?pwd5ay8 这里写目录标题 一、VMware准备Linux虚拟机1.1. VMware安装Linux虚拟机1.1.1. 修改虚拟机子网IP和网关1.1.2. 安装…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...

MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...

HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

SpringCloudGateway 自定义局部过滤器
场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...
前端高频面试题2:浏览器/计算机网络
本专栏相关链接 前端高频面试题1:HTML/CSS 前端高频面试题2:浏览器/计算机网络 前端高频面试题3:JavaScript 1.什么是强缓存、协商缓存? 强缓存: 当浏览器请求资源时,首先检查本地缓存是否命中。如果命…...