【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. 安装…...

cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...

莫兰迪高级灰总结计划简约商务通用PPT模版
莫兰迪高级灰总结计划简约商务通用PPT模版,莫兰迪调色板清新简约工作汇报PPT模版,莫兰迪时尚风极简设计PPT模版,大学生毕业论文答辩PPT模版,莫兰迪配色总结计划简约商务通用PPT模版,莫兰迪商务汇报PPT模版,…...
关于uniapp展示PDF的解决方案
在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项: 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库: npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...
MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用
文章目录 一、背景知识:什么是 B-Tree 和 BTree? B-Tree(平衡多路查找树) BTree(B-Tree 的变种) 二、结构对比:一张图看懂 三、为什么 MySQL InnoDB 选择 BTree? 1. 范围查询更快 2…...
C语言中提供的第三方库之哈希表实现
一. 简介 前面一篇文章简单学习了C语言中第三方库(uthash库)提供对哈希表的操作,文章如下: C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障
关键领域软件测试的"安全密码":Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力,从金融交易到交通管控,这些关乎国计民生的关键领域…...
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析 一、第一轮基础概念问题 1. Spring框架的核心容器是什么?它的作用是什么? Spring框架的核心容器是IoC(控制反转)容器。它的主要作用是管理对…...
41道Django高频题整理(附答案背诵版)
解释一下 Django 和 Tornado 的关系? Django和Tornado都是Python的web框架,但它们的设计哲学和应用场景有所不同。 Django是一个高级的Python Web框架,鼓励快速开发和干净、实用的设计。它遵循MVC设计,并强调代码复用。Django有…...