java中的接口interface
一、面向对象基本概念
Java是一种面向对象的语言,其中「对象」就相当于是现实世界中的一个个具体的例子,而「类」就相当于是一个抽象的模板,将抽象的概念模板转化为具体的例子的过程就叫做「实例化」。
比如说人这个概念就是一个抽象化的「类」,而中国人、英国人、日本人、以色列人等就是由人这个「类」具象化而来的「对象」。再比如说电器这个概念就可以看作是一个抽象化的「类」,而手机、冰箱、洗衣机、电脑等就可以看作是由电器这个类具象化而产生的一个个具体「对象」。

总结:对象是具体的例子,类是抽象的模板。我们通过将同类事物所共有的特点抽取出来,进而产生了类这个概念。
面向对象的优点:有了类这个概念,我们就可以大大提高代码的复用性,也就是说,只要我们先制作好了某一类事物的模板,下次再想创建同类的事物的时候,只要调用这个类进行创建,而不用再从头开始一步步进行创建,从而省去了大量的重复步骤。
二、面向对象中的「继承」
波兰Stefan Banach数学家说过这样一句话:
数学家能找到定理之间的相似之处,优秀的数学家能看到这些证明之间的相似之处,卓越的数学家能看到数学理论之间的相似之处。而最顶级的数学家能看到这些相似之处的相似之处。
通过面向对象这个概念,我们知道了可以对同类事物进行抽象,从而创建出「类」这一概念,但是这就结束了吗?从上面波兰数学家的话中我们可以发现,我们将同类事物进行抽象的过程只是进行了「一次抽象」。而实际上,我们还可以继续下去,我们还可以对已抽象过的概念再抽象一次,也就是进行所谓的「二次抽象」。
这种二次抽象的过程,在Java这种面向对象的编程语言也有与之类似的设定,称之为「继承」。
举例来说:我们从中国人、日本人、美国人、英国人这些概念中抽象出了「人类」这一概念,但是我们还可以继续下去。我们也可以从喜鹊、鹦鹉、大雁、秃鹫这些概念中抽象出「鸟类」这一概念。
接下来,我们将抽象过程再继续下去,我们可以从「人类」和「鸟类」这两个概念中再抽象出「动物」这一概念。那么我们现在就可以说「动物」这个概念是对「人类」和「鸟类」进行的一次抽象,而「人类」和「鸟类」又是对其所代表的基本对象进行的一次抽象。那么综合起来,「动物」这个概念就是对「人类」和「鸟类」所代表的基本对象进行了二次抽象。

那么在Java语言中,如果我们对某一类事物进行了一次抽象,那么就称这种被抽象出来概念为:类(class)。当我们再对这种被抽象过的概念进行二次抽象之后,一个新的概念出现了,我们称之为:父类(superclass),此时被父类直接抽象的那部分概念就称之为:子类(subclass)。
三、接口理解
刚才已经谈到了面向对象中的「子类」和「父类」的概念,下面就来谈一下一个新的概念,叫做「接口(interface)」。
那么如何理解「接口」这个概念呢?我们在编写程序的时候,有时候会有一些想法,或者说「规矩」,我们希望自己编写的类能够遵守某些「规矩」。有时候,我们希望某个类中一定要有某些功能,比如说,我们创建了一个「汽车类」,那么我们就希望所有的「汽车类」在创建的时候能够遵守这样一些规矩:
- 必须有品牌属性(Field)
- 必须有车型属性(Field)
- 必须有行驶功能(Method)
- 必须有刹车功能(Method)
这些规矩就是我们在创建类的时候必须要遵守,那么我们就可以将这些指导类的创建的规矩放在一个新的框架中,这个框架在Java中就叫做「接口(interface)」,以后当我们想要创建一个符合这些规矩的类的时候,就需要先引用这些「接口」。
总结一下:现在我们在创建子类的时候,可以从更抽象的父类那里「继承」过来一些属性和功能。与此同时,我们也在创建类的时候,也可以让这个类必须「符合某些规矩」。所以从这个层面上来说,「父类」这个概念和「接口」这个概念是同一级别的概念,子类直接「继承」父类的属性和方法,而子类也要「符合」接口定下的规矩才能进行创建,这二者都是对最基本的对象进行了「二次抽象」。

四、接口八股文
1.接口的作用
为什么需要接口?接口和抽象类的区别?
接口就是比“抽象类”还“抽象”的“抽象类”,可以更加规范的对子类进行约束。全面地专业地实现了:规范和具体实现的分离。
接口和抽象类的区别?:
1、接口只能定义抽象方法不能实现方法,抽象类既可以定义抽象方法,也可以实现方法。
2、单继承,多实现。接口可以实现多个,只能继承一个抽象类。
3、接口强调的是功能,具有什么能力。抽象类强调的是所属关系。
4、接口中的所有成员变量 为public static final(默认,变量也是属于全局变量), 静态不可修改,当然必须初始化。接口中的所有方法都是public abstract 公开抽象的(public可不写)。而且不能有构造方法。抽象类就比较自由了,和普通的类差不多,可以有抽象方法也可以没有,可以有正常的方法,也可以没有。5.Interface是为了把程序模块进行固化的契约,是为了降低偶合,abstractclass是为了把相同的东西提取出来,即重用
接口是两个模块之间通信的标准,通信的规范。如果能把你要设计的模块之间的接口定义好,就相当于完成了系统的设计大纲,剩下的就是添砖加瓦的具体实现了。大家在工作以后,做系统时往往就是使用“面向接口”的思想来设计系统。
接口和实现类不是父子关系,是实现规则的关系。比如:我定义一个接口 Runnable, Car 实现它就能在地上跑,Train 实现它也能在地上跑,飞机实现它也能在地上跑。就是说, 如果它是交通工具,就一定能跑,但是一定要实现 Runnable 接口。
2.如何定义和使用接口
声明格式:
[访问修饰符] interface 接口名 [extends 父接口 1,父接口 2…] {常量定义;方法定义;
}
定义接口的详细说明:
- 访问修饰符:只能是 public 或默认。
- 接口名:和类名采用相同命名机制。
- extends:接口可以多继承。
- 常量:接口中的属性只能是常量,总是:public static final 修饰。不写也是。
- 方法:接口中的方法只能是:public abstract。 省略的话,也是 public abstract。
要点
- 子类通过 implements 来实现接口中的规范。
- 接口不能创建实例,但是可用于声明引用变量类型。
- 一个类实现了接口,必须实现接口中所有的方法,并且这些方法只能是 public 的。
- JDK1.8(不含 8)之前,接口中只能包含静态常量、抽象方法,不能有普通属性、构造方法、普通方法。
- JDK1.8(含 8)后,接口中包含普通的静态方法、默认方法。
4.接口中定义静态方法和默认方法(JDK8)
JDK8 新特性_默认方法
Java 8 及以上新版本,允许给接口添加一个非抽象的方法实现,只需要使用 default 关键字即可,这个特征又叫做默认方法(也称为扩展方法)。 默认方法和抽象方法的区别是抽象方法必须要被实现,默认方法不是。作为替代方式, 接口可以提供默认方法的实现,所有这个接口的实现类都可以得到默认方法。
public class Test {public static void main(String[] args) {A a = new Test_A();a.moren();}
}interface A {default void moren(){System.out.println("我是接口 A 中的默认方法!");}
}class Test_A implements A {@Overridepublic void moren() {System.out.println("Test_A.moren");}
}
JDK8 新特性_静态方法
JAVA8 以后,我们也可以在接口中直接定义静态方法的实现。这个静态方法直接从属于接口(接口也是类,一种特殊的类),可以通过接口名调用。
如果子类中定义了相同名字的静态方法,那就是完全不同的方法了,直接从属于子类。 可以通过子类名直接调用。
public class Test {public static void main(String[] args) {A.staticMethod();Test_A.staticMethod();}
}interface A {public static void staticMethod(){System.out.println("A.staticMethod");}
}class Test_A implements A {public static void staticMethod(){System.out.println("Test_A.staticMethod");}
}
5.接口的多继承
接口支持多继承。和类的继承类似,子接口 extends 父接口,会获得父接口中的一切。
interface A {void testa();
}
interface B {void testb();
}/**接口可以多继承:接口 C 继承接口 A 和 B*/
interface C extends A, B {void testc();
}public class Test implements C {public void testc() {}public void testa() {}public void testb() {}
}
相关文章:
java中的接口interface
一、面向对象基本概念 Java是一种面向对象的语言,其中「对象」就相当于是现实世界中的一个个具体的例子,而「类」就相当于是一个抽象的模板,将抽象的概念模板转化为具体的例子的过程就叫做「实例化」。 比如说人这个概念就是一个抽象化的「…...
多个git提交,只推送其中一个到远程该如何处理
用新分支去拉取当前分支的指定commit记录,之后推送到当前分支远程仓库实现推送指定历史提交的功能 1.查看当前分支最近五次提交日志 git log --oneline -5 2.拉取远程分支创建临时本地分支 localbranch 为本地分支名 origin/dev 为远程目标分支 git checkout …...
uniapp中input的disabled属性
uniapp中input的disabled属性: 小程序中兼容性好; 在H5中兼容性差; 在H5中使用uniapp的input的disabled属性,属性值只能是true或false,如果为0, "都会为true; <input class"in…...
Jmeter连接mysql数据库详细步骤
一、一般平常工作中使用jmeter 连接数据库的作用 主要包括: 1、本身对数据库进行测试(功能、性能测试)时会需要使用jmeter连接数据库 2、功能测试时,测试出来的结果需要和数据库中的数据进行对比是否正确一致。这时候可以通过j…...
Xcode 14.3.1build 报错整理
1、Command PhaseScriptExecution failed with a nonzero exit code 2、In /Users/XX/XX/XX/fayuan-mediator-app-rn/ios/Pods/CocoaLibEvent/lib/libevent.a(buffer.o), building for iOS Simulator, but linking in object file built for iOS, file /Users/XX/XX/XX/fayuan…...
TensorFlow入门(十三、动态图Eager)
一个图(Graph)代表一个计算任务,且在模型运行时,需要把图放入会话(session)里被启动。一旦模型开始运行,图就无法修改了。TensorFlow把这种图一般称为静态图。 动态图是指在Python中代码被调用后,其操作立即被执行的计算。 它与静态图最大的区别是不需要使用session来建立会话…...
批量执行insert into 的脚本报2006 - MySQL server has gone away
数据库执行批量数据导入是报“2006 - MySQL server has gone away”错误,脚本并没有问题,只是insert into 的批量操作语句过长导致。 解决办法: Navicat ->工具 ->服务器监控->mysql ——》变量 修改max_allowed_packet大小为512…...
翻译docker官方文档(残缺版)
Build with docker(使用 Docker 技术构建应用程序或系统镜像) Overview (概述) 介绍(instruction) 层次结构(Layers) The order of Dockerfile instructions matters. A Docker build consists of a series of ordered build ins…...
PySpark 概述
文章最前: 我是Octopus,这个名字来源于我的中文名--章鱼;我热爱编程、热爱算法、热爱开源。所有源码在我的个人github ;这博客是记录我学习的点点滴滴,如果您对 Python、Java、AI、算法有兴趣,可以关注我的…...
『heqingchun-ubuntu系统下Qt报错connot find -lGL解决方法』
ubuntu系统下Qt报错connot find -lGL解决方法 问题: Qt报错 connot find -lGL collect2:error:ld returned 1 exit status 解决方式: cd /usr/lib/x86_64-linux-gnu查看一下 ls | grep libGLlibGLdispatch.so.0 libGLdispatch.so.0.0.0 libGLESv2.so.…...
代码整洁之道:程序员的职业素养(十六)
辅导、学徒期与技艺 导师的重要性在职业发展中是不可低估的。尽管最好的计算机科学学位教学计划可以提供坚实的理论基础,但面对实际工作中的挑战,年轻毕业生往往需要更多指导。幸运的是,有许多优秀的年轻人可以通过观察和模仿他们的导师来快…...
OSPF的原理与配置
第1章 OSPF[1] 本章阐述了OSPF协议的特征、术语,OSPF的路由器类型、网络类型、区域类型、LSA类型,OSPF报文的具体内容及作用,描述了OSPF的邻居关系,通过实例让读者掌握OSPF在各种场景中的配置。 本章包含以下内容: …...
uni-app : 生成三位随机数、自定义全局变量、自定义全局函数、传参、多参数返回值
核心代码 function generateRandomNumber() {const min 100;const max 999;// 生成 min 到 max 之间的随机整数// Math.random() 函数返回一个大于等于 0 且小于 1 的随机浮点数。通过将其乘以 (max - min 1),我们得到一个大于等于 0 且小于等于 (max - min 1…...
EF core 如何撤销对对象的更改
一般情况下 DB.SaveChanges() 就可以正常提交更改了. 但是如何撤销更改, 可以使用下面的代码. //撤销更改 //放弃更改. 防止后面的finally出错 DB.ChangeTracker.Entries().Where(e > e.Entity ! null).ToList().ForEach(e > e.State EntityState.Detached);...
以字符串mark作为分隔符,对字符串s进行分割
int main() {string s "How are you?";string mark " ";string tmp;int cur 0, first 0;//找到第一个标记while ((cur s.find_first_of(mark, cur)) ! string::npos){//获取第一个标记前的子串tmp s.substr(first, cur - first);cout << tmp …...
c++day6(菱形继承、虚继承、多态、模板、异常)
今日任务 1.思维导图 2.编程题: 代码: #include <iostream>using namespace std; /*以下是一个简单的比喻,将多态概念与生活中的实际情况相联系: 比喻:动物园的讲解员和动物表演 想象一下你去了一家动物园&a…...
外卖跑腿系统开发的最佳实践和成功案例
外卖跑腿系统的开发既涉及技术实现,也需要考虑用户体验、运营策略和合规性。以下是一些最佳实践和一些成功的案例,以帮助您更好地理解这个领域的要点。 1. 技术框架的选择 选择适合的技术框架是外卖跑腿系统成功的关键。您可以考虑使用以下技术&#…...
python中的range()函数详解
range() 是 Python 内置的一个函数,用于生成一个整数序列。 range([start], [stop], [step])start、stop、step 分别表示序列的起始值、终止值和步长。start 和 step 是可选参数,如果不指定则默认为 0 和 1。 一、range()传递不…...
【taro react】 ---- 常用自定义 React Hooks 的实现【四】之遮罩层
1. 问题场景 在实际开发中我们会遇到一个遮罩层会受到多个组件的操作影响,如果我们不采用 redux 之类的全局状态管理,而是选择组件之间的值传递,我们就会发现使用组件的变量来控制组件的显示和隐藏很不方便,更不要说像遮罩层这样一个项目多处使用的公共组件,他的隐藏和显示…...
【git】git命令行
首先要了解git整个流程的一个分类: workspace:工作区staging area:暂存区/缓存区local repository:版本库或本地仓库remote repository:远程仓库 创建仓库 git clone gitgithub.comxxxxxxxxxxxx//拷贝一份远程仓库 …...
华为云AI开发平台ModelArts
华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...
基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...
视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...
vulnyx Blogger writeup
信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...
【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)
LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 题目描述解题思路Java代码 题目描述 题目链接:LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...
Web后端基础(基础知识)
BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端。 优点:维护方便缺点:体验一般 CS架构:Client/Server,客户端/服务器架构模式。需要单独…...
