河南多地最新疫情/揭阳百度快照优化排名
🌿🌿🌿跟随博主脚步,从这里开始→博主主页🌿🌿🌿
接口介绍
- 接口
- 概述
- 接口定义
- 接口的实现
- 实战演练
- 👅接口的继承
- 实战演练
- 实战演练
- 接口的类型
- 常量
- 实战演练
- 静态方法
- 默认方法
- 解决默认方法冲突
- 实战演练
接口
概述
Java语言中所有的类都处于一个类层次结构中。
除Object类以外,所有类都只有一个直接父类,即子类与父类之间是单继承的关系,但不允许多重继承。
为了实现多重继承,java语言通过接口使得处于不同层次、甚至互不相关的类具有相同的行为。
接口定义
- 接口定义了一种可以被类层次中任何类实现的行为的协议
- 接口是常量、抽象方法、默认方法和静态方法的集合体
- 接口可以实现多重继承
- 接口声明使用interface关键字
- 接口定义,包含接口声明和接口体两部分
[public或者省略] interface 接口名称 [extends 父接口名列表]{[public][static][final] 数据类型 成员变量名=常量;……[public][abstract] 返回值的数据类型 方法名(参数表);……[public] static 返回值的数据类型 方法名(参数表){方法体}……[public] default 返回值的数据类型 方法名(参数表){方法体}……}
例:
public interface Eatable {接口被看作是一种特殊的类型。每个接口都被编译为独立的字节码文件。//抽象方法public abstract String howtoEat();
}
接口与抽象类相似:
接口可以作为引用变量数据类型或类型转换的结果;
接口与抽象类一样,不能用new运算符创建接口实例。
接口的抽象方法只有声明,没有实现。
抽象方法也可以省略修饰符,省略修饰符编译器自动加上public、abstract。
- 接口的UML表示
- 接口通常表示某种能力,因此接口名后缀通常是able。
接口的实现
接口的实现:利用接口的特性来建造类的过程。类似于继承,但不是extends,而是使用implements。
接口实现的语法格式:
class 类名称 implements 接口名表{……}
👀一个类实现一个接口应注意的问题:
- 如果实现某接口的类不是abstract的抽象类,则在类的定义部分必须实现指定接口的所有抽象方法。
- 一个类在实现某接口的抽象方法时,必须使用完全相同的方法头。
- 接口中抽象方法被指定为public,所以类在实现方法时,必须显示地使用public修饰符。
- 接口可以作为一种引用类型来使用,可以声明接口类型的变量或数组,并用它来访问实现该接口的类的对象。
(通过接口类型的变量可以访问类所实现的接口的方法)
实战演练
【例】Orange实现Eatable接口。
public interface Eatable {//抽象方法public abstract String howtoEat();
}
public class Orange @Overridepublic String howtoEat(){return “Make Orange Juice”}
}
👅接口的继承
- 定义一个接口时可通过extends关键字声明该新接口是某个已存在的父接口的派生接口。
- 与类继承的区别:一个接口可以有一个以上的父接口,它们之间用逗号隔开,形成父接口列表。
- 新接口将继承所有父接口的常量、抽象方法和默认方法,但不能继承父接口的静态方法(也不能被实现类所继承)。
- 多重继承:一个子类可以有一个以上的直接父类,该子类可以继承它所有直接父类的成员。
- Java语言虽不支持多重继承,但可以利用接口间接地解决多继承问题。
- 一个类只能有一个直接父类,但是它可以同时实现若干个接口(Java中接口的主要作用是可以帮助实现多重继承。)。一个类实现多个接口时,在implements子句中用逗号分隔各个接口名。
实战演练
【例】接口继承多个接口。CC接口继承AA接口和BB接口
public interface AA { int STATUS = 100;public abstract void display();
}
public interface BB { public abstract void show(); public default void print(){ System.out.println("这个是接口BB的默认方法");}
}
public interface CC extends AA, BB{ int NUM = 3;
}
public class DD implements CC {public void display() {System.out.println("接口AA的display方法");}public void show() {System.out.println("接口BB的show方法");}public static void main(String[] args) {DD dd = new DD();System.out.println(DD.STATUS);dd.show();dd.print(); AA aa = new DD();aa.display();}
}
运行结果:
解释代码:
上述AA、BB、CC接口与DD类之间的关系如图所示;图中虚线表示接口实现。
接口是允许多继承的,而类只能实现单继承。
实战演练
【例】类实现多个接口。AB类实现AA接口和BB接口
public class AB implements AA, BB{public void display(){System.out.println("接口AA的display方法");} public void show(){ System.out.println("接口BB的show方法");}
}
类实现多个接口需实现每个接口中的抽象方法。接口中的常量和默认方法都被继承了,但接口中的静态方不被继承
接口的类型
接口也是一种引用类型,任何实现该接口的实例都可以存储在该接口类型的变量中。
AA aa = new DD(); // 向上自动类型转换
BB bb = new DD();
CC cc = new DD();
当通过接口对象调用某个方法时,Java运行时系统确定该调用哪个类中的方法。
aa.display(); // 调用实现类的方法
bb.show();
cc.print(); // 调用继承的默认方法
常量
定义在接口中的任何变量都自动加上public、final、static属性,因此它们都是常量,常量的定义可以省略修饰符,下面三行代码效果相同。
int STATUS = 100;public int STATUS = 100;public final static int STATUS = 100;
不推荐在接口中定义常量,使用枚举类型描述一组常量集合比接口常量更好。
实战演练
1.设计一个名为Swimmable的接口,其中包含void swim()方法,设计另一个名为Flyable的接口,其中包含void fly()方法。
2.定义一个Duck类实现上述两个接口。
// Swimmable接口
interface Swimmable { void swim();
} // Flyable接口
interface Flyable { void fly();
} // Duck类实现Swimmable和Flyable接口
class Duck implements Swimmable, Flyable { // 实现Swimmable接口的swim方法 @Override public void swim() { System.out.println("The duck is swimming."); } // 实现Flyable接口的fly方法 @Override public void fly() { System.out.println("The duck is flying."); } // 可以在Duck类中添加其他方法和属性
} // 测试类
public class Main { public static void main(String[] args) { Duck duck = new Duck(); duck.swim(); // 调用swim方法 duck.fly(); // 调用fly方法 }
}
在这个例子中,Swimmable
和Flyable
是两个接口,它们分别定义了swim
和fly
方法。Duck
类通过implements
关键字实现了这两个接口,因此它必须提供这两个方法的具体实现。在main方法中,我们创建了一个Duck
对象,并调用了它的swim
和fly
方法,输出了相应的信息。
静态方法
- 在Java 8中,可以在接口中定义静态方法,定义静态方法使用static关键字,默认的访问修饰符是public。
- 接口的静态方法不能被子接口继承,也不被实现类继承。
- 接口中的静态方法不能被子接口和实现类继承,访问形式为:接口名.静态方法名( )。
public interface SS {int STATUS = 100; public static void display() {System.out.println(STATUS);}
}
默认方法
- 接口中的默认方法用default修饰符来定义,默认方法可以被子接口或被实现该接口的类所继承。访问形式为:对象名.默认方法名( )。
- 子接口中若定义名称相同的默认方法,则父接口中的默认方法被隐藏。
public interface BB { public void show(); public default void print(){ System.out.println("这个是接口BB的默认方法");}
}
解决默认方法冲突
- 如果子接口中定义了与父接口同名的常量或者相同的方法,则父接口中的常量被隐藏,方法被覆盖。
- 但在接口的多重继承中可能存在常量名或方法名重复的问题,即名字冲突问题。
- 对于常量,若名称不冲突,子接口可以继承多个父接口中的常量,如果多个父接口中有同名的常量,则子接口不能继承,但子接口中可以定义一个同名的常量。
- 对于多个父接口中存在同名的方法时,此时必须通过特殊的方式加以解决。
- 在多个父接口的实现类中解决同名默认方法的名字冲突问题有两种方法:一种是提供同名方法的一个新实现;另一种是委托一个父接口的默认方法。
- 如果两个父接口有一个提供的不是默认方法,而是抽象方法,则在实现类中提供同名方法的一个新实现即可。
- 如果一个类继承了一个父类并实现了一个接口,而从父类和接口中继承了同名的方法,此时采用“类比接口优先”的原则,即只继承父类的方法,而忽略来自接口的默认方法。
实战演练
【例】在两个接口Person和Identified中定义的同名默认方法getID ( ),在实现类中委托其中一个父接口的默认方法
public interface Person { public String getName();public default int getID(){return 0;}
}
public interface Identified {public default int getID(){return Math.abs(hashCode());}
}
public class Employee implements Person, Identified { String name;@Overridepublic String getName(){return this.name;} public int getID(){ return Identified.super.getID();} // 为getID()方法提供一个新的实现
}
博主用心写,读者点关注,互动传真情,知识不迷路。
相关文章:

Java语言程序设计——篇十(1)
🌿🌿🌿跟随博主脚步,从这里开始→博主主页🌿🌿🌿 接口介绍 接口概述接口定义接口的实现实战演练 👅接口的继承实战演练实战演练 接口的类型常量实战演练 静态方法默认方法解决默认方…...

Qt对比MFC优势
从Qt小白到现在使用了有四年的时间,之前也搞过MFC,WinForm,基本上都是桌面的框架, 从难易程度看MFC>QT>WinForm; 运行的效率上来看MFC>QT>WinForm; 开发效率上WinForm>QT>MFC; 跨平台Qt首选; 界面的美观难易程度Qt>…...

RuntimeError: No CUDA GPUs are available
RuntimeError: No CUDA GPUs are available 目录 RuntimeError: No CUDA GPUs are available 【常见模块错误】 【解决方案】 解决步骤如下: 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页,我是博主英杰,211科…...

URL参数中携带中文?分享 1 段优质 JS 代码片段!
本内容首发于工粽号:程序员大澈,每日分享一段优质代码片段,欢迎关注和投稿! 大家好,我是大澈! 本文约 800 字,整篇阅读约需 1 分钟。 今天分享一段优质 JS 代码片段,在发送 ajax 请…...

sass的使用
一、变量 //声明一个变量 $highlight-color: #F90; .selected {border: 1px solid $highlight-color; }//编译后 .selected {border: 1px solid #F90; }二、导入 import "xxx.scss"三、混合器简单定义 通过mixin定义,通过include调用 // mixin.scss /…...

【足球走地软件】走地数据分析预测【大模型篇】走地预测软件实战分享
了解什么是走地数据? 走地数据分析,在足球赛事的上下文中,是一种针对正在进行中的比赛进行实时数据分析的方法。这种方法主要用于预测比赛中的某些结果或趋势,如总进球数、比分变化、球队表现等。 在足球走地数据分析中…...

现在有什么赛道可以干到退休?
最近,一则“90后无论男女都得65岁以后退休”的消息在多个网络平台流传,也不知道是真是假,好巧不巧今天刷热点的时候又看到一条这样的热点:现在有什么赛道可以干到退休? 点进去看了几条热评,第一条热评说的…...

c程序杂谈系列(职责链模式与if_else)
从处理器的角度来说,条件分支会导致指令流水线的中断,所以控制语句需要严格保存状态,因为处理器是很难直接进行逻辑判断的,有可能它会执行一段时间,发现出错后再返回,也有可能通过延时等手段完成控制流的正…...

前端开发技术之CSS(层叠样式表)
盒模型(Box Model) CSS盒模型描述了如何计算一个元素的总宽度和高度。 它包括以下几个部分: 1. 内容(Content):元素的实际内容,比如文本或图片。 2. 内边距(Padding)&…...

go语言day20 使用gin框架获取参数 使用自定义的logger记录日志
Golang 操作 Logger、Zap Logger 日志_golang zap-CSDN博客 目录 一、 从控制器中获取参数的几种形式 1) 页面请求url直接拼接参数。 2) 页面请求提交form表单 3) 页面请求发送json数据,使用上下文对象c的BindJSON()方法接…...

DHCP笔记
DHCP---动态主机配置协议 作用:为终端动态提供IP地址,子网掩码,网关,DNS网址等信息 具体流程 报文抓包 在DHCP服务器分配iP地址之间会进行广播发送arp报文,接收IP地址的设备也会发送,防止其他设备已经使用…...

TCP为什么需要四次挥手?
tcp为什么需要四次挥手? 答案有两个: 1.将发送fin包的权限交给被动断开发的应用层去处理,也就是让程序员处理 2.接第一个答案,应用层有了发送fin的权限,可以在发送fin前继续向对端发送消息 为了搞清楚这个问题&…...

MySQL 索引相关基本概念
文章目录 前言一. B Tree 索引1. 概念2. 聚集索引/聚簇索引3. 辅助索引/二级索引4. 回表5. 联合索引/复合索引6. 覆盖索引 二. 哈希索引三. 全文索引 前言 InnoDB存储引擎支持以下几种常见索引:BTree索引,哈希索引,全文索引 一. B Tree 索引…...

Neutralinojs教程项目实战初体验(踩坑指南),干翻 electron
Neutralinojs 项目实战初体验(踩坑指南),干翻 electron Neutralinojs 官方文档 卧槽卧槽,!这个年轻人居然用浏览器把电脑关机了_哔哩哔哩_bilibili正是在下 本教程搭建的是纯原生项目,没有和其它前端框架…...

【轻松拿捏】Java-List、Set、Map 之间的区别是什么?
List、Set、Map 之间的区别是什么? 一、List 二、Set 三、Map 🎈边走、边悟🎈迟早会好 一、List 有序性:List 保持元素的插入顺序,即元素按添加的顺序存储和访问。允许重复:List 可以包含重复的元素。…...

用户史订单查询业务
文章目录 概要整体架构流程技术细节小结 概要 在电商、金融、物流等行业中,用户历史订单查询是一项常见的业务需求。这项功能允许用户查看他们过去的交易记录,包括但不限于购买的商品、服务详情、交易金额、支付状态、配送信息等。对于企业而言…...

第8节课:CSS布局与样式——掌握盒模型与定位的艺术
目录 盒模型:网页布局的基础盒模型的属性盒模型的示例 定位:控制元素位置定位的类型定位的示例 实践:使用CSS布局创建响应式网页结语 CSS布局是网页设计中的基石,它决定了网页元素的排列和分布。盒模型和定位是CSS布局中的两个核心…...

electron 主进程和渲染进程
最近在整理electron 相关的项目问题,对自己来说也是温故知新,也希望能对小伙伴们有所帮助,大家共同努力共同进步。加油!!!! 虽然最近一年前端大环境不好,但是大家还是要加油鸭&#…...

redis的高可用及性能管理和雪崩
redis的高可用 redis当中,高可用概念更宽泛一些。 除了正常服务以外,数据量的扩容,数据安全。 实现高可用的方式: 1、持久化 最简单的高可用方法,主要功能就是备份数据。 把内存当中的数据保存到硬盘当中。 2、主…...

php基础语法
文章目录 1. PHP(1) 安装php 2. 基础语法(1) 格式(2) 输出语法(3) 注释(4) 变量(无变量类型自动识别)(5) 输入获取(6) 定界符(7) 换行 3. 基本数据类型(1) 字符串(2) 整数(3). 浮点数(4). boolean类型(5). 数组(6). null值 4. 运算符(1) 算术运算符(2) 比较运算符(3) 逻辑运算符…...

js抓取短信验证码发送
油猴(Tampermonkey)是一个流行的浏览器扩展,它允许用户在浏览器中运行自定义的JavaScript脚本。下面是一个简单的示例脚本,用于收集网站上发送短信验证码的API请求,并以JSON格式存储这些信息。请注意,这个脚本需要根据实际网站的API请求进行调整,因为不同的网站可能有不…...

视频怎么加密?常见的四种视频加密方法和软件
视频加密是一种重要的技术手段,用于保护视频内容不被未经授权的用户获取、复制、修改或传播。在加密过程中,安企神软件作为一种专业的加密工具,可以发挥重要作用。 以下将详细介绍如何使用安企神软件对视频进行加密,并探讨视频加密…...

聚焦全局应用可用性的提升策略,详解GLSB是什么
伴随互联网的快速发展和全球化趋势的深入,企业对网络应用的需求日渐增长。为满足全球范围内用户大量的访问需求,同时解决容灾、用户就近访问以及全球应用交付等问题,GLSB(全局负载均衡)也因此应运而生。那么GLSB是什么…...

无水印下载视频2——基于tkinter完成头条视频的下载
在数字化时代的浪潮中,视频内容以其丰富性和便捷性,逐渐成为了我们获取信息和娱乐的重要途径。尤其是在短视频平台上,各种创意十足、内容精彩的视频层出不穷,更是吸引了数以亿计的用户。然而,随着视频内容的增加&#…...

Java学习Day17:基础篇7
继承 Java中的继承是面向对象编程中的一个核心概念,它允许我们定义一个类(称为子类或派生类)来继承另一个类(称为父类或基类)的属性和方法。继承提高了代码的复用性,使得我们不必从头开始编写所有的代码&a…...

Vue3 Pinia的创建与使用代替Vuex 全局数据共享 同步异步
介绍 提供跨组件和页面的共享状态能力,作为Vuex的替代品,专为Vue3设计的状态管理库。 Vuex:在Vuex中,更改状态必须通过Mutation或Action完成,手动触发更新。Pinia:Pinia的状态是响应式的,当状…...

手撕数据结构02--二分搜索(附源码)
一、理论基础 二分搜索,也称折半搜索、对数搜索,是一种在有序数组中查找某一特定元素的搜索算法。 二分搜索是一种高效的查找算法,适用于在已排序的数组中查找特定元素。它的基本思想是通过不断将搜索区间对半分割,从而快速缩小…...

单片机工程师继续从事硬件设计还是涉足 Linux 开发?
在开始前刚好我有一些资料,是我根据网友给的问题精心整理了一份「linux的资料从专业入门到高级教程」,点个关注在评论区回复“666”之后私信回复“666”,全部无偿共享给大家!!! 怎么说呢,感觉绝…...

《昇思25天学习打卡营第25天|第28天》
今天是打卡的第二十八天,实践应用篇中的计算机视觉中Vision Transformer图像分类。 从Vision Transformer(ViT)简介开始了解,模型结构,模型特点,实验的环境准备和数据读取,模型解析(…...

Flutter Dio网络请求报错FormatException: Unexpected character
最近开发Flutter项目,网络请求采用的是Dio框架,在发起网络请求的时候报错: 网络请求返回的数据为: var returnCitySN {"cip": "127.0.0.1", "cid": "00", "cname": "未…...