java中的接口interface

一、面向对象基本概念

Java是一种面向对象的语言,其中「对象」就相当于是现实世界中的一个个具体的例子,而「类」就相当于是一个抽象的模板,将抽象的概念模板转化为具体的例子的过程就叫做「实例化」。

比如说这个概念就是一个抽象化的「类」,而中国人、英国人、日本人、以色列人等就是由这个「类」具象化而来的「对象」。再比如说电器这个概念就可以看作是一个抽象化的「类」,而手机、冰箱、洗衣机、电脑等就可以看作是由电器这个类具象化而产生的一个个具体「对象」。

在这里插入图片描述

总结:对象是具体的例子,类是抽象的模板。我们通过将同类事物所共有的特点抽取出来,进而产生了类这个概念。

面向对象的优点:有了类这个概念,我们就可以大大提高代码的复用性,也就是说,只要我们先制作好了某一类事物的模板,下次再想创建同类的事物的时候,只要调用这个类进行创建,而不用再从头开始一步步进行创建,从而省去了大量的重复步骤。

二、面向对象中的「继承」

波兰Stefan Banach数学家说过这样一句话:

数学家能找到定理之间的相似之处,优秀的数学家能看到这些证明之间的相似之处,卓越的数学家能看到数学理论之间的相似之处。而最顶级的数学家能看到这些相似之处的相似之处。

通过面向对象这个概念,我们知道了可以对同类事物进行抽象,从而创建出「类」这一概念,但是这就结束了吗?从上面波兰数学家的话中我们可以发现,我们将同类事物进行抽象的过程只是进行了「一次抽象」。而实际上,我们还可以继续下去,我们还可以对已抽象过的概念再抽象一次,也就是进行所谓的「二次抽象」。

这种二次抽象的过程,在Java这种面向对象的编程语言也有与之类似的设定,称之为「继承」。

举例来说:我们从中国人、日本人、美国人、英国人这些概念中抽象出了「人类」这一概念,但是我们还可以继续下去。我们也可以从喜鹊、鹦鹉、大雁、秃鹫这些概念中抽象出「鸟类」这一概念。

接下来,我们将抽象过程再继续下去,我们可以从「人类」和「鸟类」这两个概念中再抽象出「动物」这一概念。那么我们现在就可以说「动物」这个概念是对「人类」和「鸟类」进行的一次抽象,而「人类」和「鸟类」又是对其所代表的基本对象进行的一次抽象。那么综合起来,「动物」这个概念就是对「人类」和「鸟类」所代表的基本对象进行了二次抽象。

在这里插入图片描述

那么在Java语言中,如果我们对某一类事物进行了一次抽象,那么就称这种被抽象出来概念为:类(class)。当我们再对这种被抽象过的概念进行二次抽象之后,一个新的概念出现了,我们称之为:父类(superclass),此时被父类直接抽象的那部分概念就称之为:子类(subclass)。

三、接口理解

刚才已经谈到了面向对象中的「子类」和「父类」的概念,下面就来谈一下一个新的概念,叫做「接口(interface)」。

那么如何理解「接口」这个概念呢?我们在编写程序的时候,有时候会有一些想法,或者说「规矩」,我们希望自己编写的类能够遵守某些「规矩」。有时候,我们希望某个类中一定要有某些功能,比如说,我们创建了一个「汽车类」,那么我们就希望所有的「汽车类」在创建的时候能够遵守这样一些规矩:

  1. 必须有品牌属性(Field)
  2. 必须有车型属性(Field)
  3. 必须有行驶功能(Method)
  4. 必须有刹车功能(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。

要点

  1. 子类通过 implements 来实现接口中的规范。
  2. 接口不能创建实例,但是可用于声明引用变量类型。
  3. 一个类实现了接口,必须实现接口中所有的方法,并且这些方法只能是 public 的。
  4. JDK1.8(不含 8)之前,接口中只能包含静态常量、抽象方法,不能有普通属性、构造方法、普通方法。
  5. 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() {}
}

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

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

相关文章

VSCode 快速移动光标至行尾

最近在用vscode进行C编程,经常需要把光标跳到行尾去添加符号。 手动到行尾太麻烦了。 一种快捷方式是:用键盘上的“END”快捷键。 但是用这个键也不是很方便,因为“end”键离主键盘区太远。 另一种便捷的方式是:给vscode设置自定义…

TypeScript React(上)

目录 扩展学习资料 TypeScript设计原则 TypeScript基础 语法基础 变量声明 JavaScript声明变量 TypeScript声明变量 示例 接口 (标准类型-Interface) 类型别名-Type 接口 VS 类型别名 类型断言:欺骗TS&#xff0c;肯定数据符合结构 泛型、<大写字母> 扩展学习…

小谈设计模式(24)—命令模式

小谈设计模式&#xff08;24&#xff09;—命令模式 专栏介绍专栏地址专栏介绍 命令模式角色分析命令&#xff08;Command&#xff09;具体命令&#xff08;ConcreteCommand&#xff09;接收者&#xff08;Receiver&#xff09;调用者&#xff08;Invoker&#xff09;客户端&am…

Linux 网络编程 tcp server 笔记

一、TCP 服务器的创建 在 Linux 上创建一个简单的 tcp 服务器步骤如下&#xff1a; ①创建套接字 ②将套接字绑定到 IP 地址和端口号 ③监听来自客户端的连接 ④接受连接并创建新的套接字用于与客户端通信 ⑤通过新建的套接字发送和接收数据 ⑥关闭套接字 流程框图如下&#xf…

Spring是什么?为什么要使用Spring?

目录 前言 一、Spring是什么&#xff1f; 1.1 轻量级 1.2 JavaEE的解决方案 二、为什么要使用Spring 2.1 传统方式完成业务逻辑 2.2 使用Spring模式完成业务逻辑 三、为什么使用Spring&#xff1f; 前言 本文主要介绍Spring是什么&#xff0c;并且解释为何要去使用Spring&…

C语言实现数据结构顺序查找和折半查找代码

文章目录 一、顺序查找二、折半查找 一、顺序查找 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> typedef struct {//查找表的数据结构int *data;//动态数组基址int TableLen;//表长 }SSTable;void InitTable(SSTable *L) {//初始化一个…

云上攻防-云原生篇Docker安全权限环境检测容器逃逸特权模式危险挂载

文章目录 前言1、Docker是干嘛的&#xff1f;2、Docker对于渗透测试影响&#xff1f;3、Docker渗透测试点有那些&#xff1f;4、前渗透-判断在Docker中方式一&#xff1a;查询cgroup信息方式二&#xff1a;检查/.dockerenv文件方式三&#xff1a;检查mount信息方式四&#xff1…

国外互联网巨头常用的项目管理工具揭秘

大型互联网公司有涉及多个团队和利益相关者的复杂项目。为了保持项目的组织性和效率&#xff0c;他们中的许多人依赖于项目管理工具。这些工具有助于跟踪任务&#xff0c;与团队成员沟通&#xff0c;并监控进度。让我们来看看一些大型互联网公司正在使用的项目管理工具。 1、Zo…

【git】git命令行

首先要了解git整个流程的一个分类&#xff1a; workspace&#xff1a;工作区staging area&#xff1a;暂存区/缓存区local repository&#xff1a;版本库或本地仓库remote repository&#xff1a;远程仓库 创建仓库 git clone gitgithub.comxxxxxxxxxxxx//拷贝一份远程仓库 …

TensorFlow入门(十七、神经元的拟合原理)

深度学习的概念源于人工神经网络的研究,神经网络是由多个神经元组成,。一个神经元由以下几个关键知识点组成: ①激活函数 ②损失函数 ③梯度下降 单个神经元的网络模型如图所示 用计算公式表达如下: z为输出的结果,x为输入,w为权重,b为偏置值。z…

十六、 代码校验(3)

本章概要 测试驱动开发 测试驱动 vs 测试优先 日志 日志信息日志等级 测试驱动开发 之所以可以有测试驱动开发&#xff08;TDD&#xff09;这种开发方式&#xff0c;是因为如果你在设计和编写代码时考虑到了测试&#xff0c;那么你不仅可以写出可测试性更好的代码&#xff…

GEE:使用中文做变量和函数名写GEE代码

作者&#xff1a;CSDN _养乐多_ 啊&#xff1f;最近在编写GEE代码的时候&#xff0c;无意中发现 JavaScript 已经能够支持中文字符作为变量名和函数名&#xff0c;这个发现让我感到非常兴奋。这意味着以后在编程过程中&#xff0c;我可以更自由地融入中文元素&#xff0c;不再…

[Python]黑色背景白色块滑动视频

黑色背景白色块滑动视频&#xff0c;单帧效果如下&#xff1a; 配置参数 1920 1080 400 400 300 60 1920x1080.avi import numpy as np import cv2 as cv import os import syswidth 1920 height 1080 rect_szx 400 rect_szy 300 sz_y_init 400 fps 24width int(sys.a…

1.1 向量与线性组合

一、向量的基础知识 两个独立的数字 v 1 v_1 v1​ 和 v 2 v_2 v2​&#xff0c;将它们配对可以产生一个二维向量 v \boldsymbol{v} v&#xff1a; 列向量 v v [ v 1 v 2 ] v 1 v 的第一个分量 v 2 v 的第二个分量 \textbf{列向量}\,\boldsymbol v\kern 10pt\boldsymbol …

Linux 测试端口是否放行

Linux 测试端口是否放行 1、准备2、在 CentOS 7 上放行端口&#xff0c;你可以使用以下方法&#xff1a;4、错误解决&#xff1a;[rootlocalhost backup]# netcat -l -p 11111 netcat: cannot use -p and -l 装了netcat不能用5、能用telnet去测试吗6、效果&#xff1a; 1、准备…

开源在线客服系统源码微信小程序

又来啦&#xff01;今天要给大家分享的是一款在线客服微信小程序源码系统&#xff0c;在外面现在的日常生活中&#xff0c;客服是不可或缺的岗位&#xff0c;下面我们一起来看看这款系统的功能介绍吧。下面是部分的代码截图&#xff1a; 在线客服系统源码微信小程序的功能主要包…

【使用 TensorFlow 2】02/3 使用 Lambda 层创建自定义激活函数

一、说明 TensorFlow 2发布已经接近2年时间&#xff0c;不仅继承了Keras快速上手和易于使用的特性&#xff0c;同时还扩展了原有Keras所不支持的分布式训练的特性。3大设计原则&#xff1a;简化概念&#xff0c;海纳百川&#xff0c;构建生态.这是本系列的第三部分&#xff0c;…

JMeter性能测试,完整入门篇

1. Jmeter简介 Apache JMeter是一款纯java编写负载功能测试和性能测试开源工具软件。相比Loadrunner而言&#xff0c;JMeter小巧轻便且免费&#xff0c;逐渐成为了主流的性能测试工具&#xff0c;是每个测试人员都必须要掌握的工具之一。 本文为JMeter性能测试完整入门篇&…

Web自动化测试入门 : 前端页面的组成分析详解

目前常见的前端页面是由HTMLcssJavaScript组成。 一、HTML&#xff1a; 作用&#xff1a;定义页面呈现的内容 HTML 是用来描述网页的一种语言。 HTML 指的是超文本标记语言 (Hyper Text Markup Language)HTML 不是一种编程语言&#xff0c;而是一种标记语言 (markup langua…

并发编程——1.java内存图及相关内容

这篇文章&#xff0c;我们来讲一下java的内存图及并发编程的预备内容。 首先&#xff0c;我们来看一下下面的这两段代码&#xff1a; 下面&#xff0c;我们给出上面这两段代码在运行时的内存结构图&#xff0c;如下图所示&#xff1a; 下面&#xff0c;我们来具体的讲解一下。…