当前位置: 首页 > news >正文

3分钟带你快速了解 Java 接口

我醉欲眠卿且去

明朝有意抱琴来


目录

接口的概念

定义接口 

接口格式 

接口的特性 

(1)接口不能直接创建对象

(2)接口不能用 final 修饰

(3)接口中定义的变量

(4)接口中定义的方法

接口的作用

抽象类与接口

抽象类

接口

 

 

接口的概念

在我们现实生活中接口的例子十分的常见。比如:USB接口、插座接口等等


电脑的USB口上,可以插:U盘、鼠标、键盘等等所有符合USB协议的设备

电源插座插孔上,可以插:电脑、电视机、电饭煲等等所有符合规范的设备

通过上述例子可以看出:接口就是公共的行为规范标准,大家在实现时,只要符合规范标准,就可以通用。 在 Java 中,接口可以看成是:多个类的公共规范,是一种引用数据类型

定义接口 

接口格式 

定义一个接口跟定义一个类的格式差不多,只不过是将 class 关键字换成 interface 关键字

[public] interface <接口名> {//常量//抽象方法、静态方法、默认方法
}
public接口的修饰符只能是 public ,只有这样接口才能被任何包中的接口或者类访问
interface 接口的关键字
接口名定义方式跟类名一样 
常量在接口中不能声明变量,因为接口要具备三个特征,公共性、静态的、最终的

接口的特性 

我们一旦在 Java 程序中创建了接口后,接口的方法和抽象类是一样的,它的方法都是抽象的,也就是说接口不具备有实现的功能(不能被创建对象)它只是指定要做那些工作,而不管怎么去做。接口就如用户提出的需求,最后由你去扩展它的实现类

(1)接口不能直接创建对象

接口类型是一种引用类型,但是不能直接 new 接口的对象

(2)接口不能用 final 修饰

因为接口就是为了让子类实现的,如果将接口封闭了,那么接口将没有任何意义

(3)接口中定义的变量

我们现在接口中定义一个变量,我们发现编译器会提示我们进行初始化

 当我们初始化后就正常了,这是什么回事呢?

 看一下这段代码反编译后的字节码,如下图:

我们发现接口中定义的变量会在编译的时候自动加上 public static final 修饰符,这样我们在接口中便只能定义常量了 ~

(4)接口中定义的方法

接口中可以定义抽象方法、静态方法、默认方法(我们这里主要讲抽象方法)

public interface newJie {int a = 10;static void Func1(){System.out.println("这是一个静态方法");}void Func2();default void Func3() {System.out.println("这是一个默认方法");}
}

普通方法会默认转化成抽象方法:如下图我们给 Func2 加上方法体就报错了

在 Java 程序中,接口里的方法都是抽象的或者是公有的,在声明的时候可以省略掉关键字 public 和 abstract,因为它的方法都是编译器隐式加上的(与上文的接口中的变量一样)。当然我们添加了关键字也没有事 ~

 

接口的作用

接口不能直接使用,必须要有一个 "实现类" 来 "实现" 该接口,实现接口中的所有抽象方法

接口的格式

public  class 类名称 implements 接口名称{// ...} 

子类和父类之间是 extends 继承关系,类与接口之间是 implements 实现关系

interface Person{void eat();
}class Student implements Person{public void eat(){System.out.println("吃学生餐");}
}

 

一个接口继承多个接口

在 Java 程序中,接口的继承与类的继承不一样。接口是支持多继承的,即一个接口可以有多个父类接口,与类的继承相似,子类接口要扩展某个父类接口,将会获得父类接口中的所有抽象方法、常量属性、等等。但一个接口继承多个父接口时,多个父接口排在 extendds 关键字之后,多个父接口之间以英文符号 “,” 隔开

interface A{int add();
}interface B{int sub();
}interface C{int mul();
}interface D extends A,B,C{}class E implements D{private int a;private int b;public E(int a, int b) {this.a = a;this.b = b;}public int add(){return a+b;}public int sub(){return a-b;}public int mul(){return a*b;}
}public class Test {public static void main(String[] args) {E e = new E(3,4);System.out.println("add="+e.add());System.out.println("sub="+e.sub());System.out.println("mul="+e.mul());}
}

我们发现 接口D 中继承了 接口A、B、C 中所有的抽象方法,因为 E类 继承了 接口D 能实现所有的抽象方法

一个类继承多个接口

我们在继承中讲过,Java 是不支持多继承的:

错误示范

class A{protected int a;
}class B{protected int b;
}class C extends A,B{}

虽然 Java 中不能实现类继承多个类,但是可以一个类继承多个接口 :

public interface Father {void Character();
}
---------------------------------------
public interface Mother {void Appearance();
}
---------------------------------------
class Child1 implements Father,Mother{protected String Name;protected int Age;@Overridepublic void Character(){System.out.println("勇气");}@Overridepublic void Appearance(){System.out.println("蓝眼睛");}public Child1(String name, int age) {Name = name;Age = age;}public void PrintChild() {System.out.println("姓名:"+this.Name+" 年龄:"+this.Age);}
}class Child2 extends Child1{public Child2(String name, int age) {super(name, age);}@Overridepublic void Character(){System.out.println("帅气");}@Overridepublic void Appearance(){System.out.println("勤快");}
}
---------------------------------------
public class Test {public static  void Character(Child1 d){d.Character();}public static void Appearance(Child1 d){d.Appearance();}public static void main(String[] args) {Child1 child1 = new Child1("张三",18);child1.PrintChild();System.out.println("特征:");child1.Appearance();child1.Character();System.out.println("---------------------------------");Child2 child2 = new Child2("小美",19);child2.PrintChild();System.out.println("特征:");child2.Appearance();child2.Character();}
}

代码虽然有点长,我们来慢慢分析一下

问题:如何描述两个孩子的不太特征?

首先一个孩子的特性可以与父母有关:

于是我们可以定义了两个接口:Father、Mother

 

 我们由第一个孩子 Child1 继承这两个接口,并实现接口中的抽象类

 这个时候第二个孩子 Child2 就不用继承这两个接口了,我们直接继承 Child1 并重写接口方法

注意:一个类实现多个接口时,每个接口中的抽象方法都要实现,否则类必须设置为抽象类

错误示范:

interface A{void Func1();void Func2();
}class B implements A{public void Func1(){System.out.println("B");}
}

 

如果你此时不想实现,你可以将该类定义为抽象类,从而来避免这个错误

一个类只能继承一个类,但是一个类可以继承多个接口。这在编写程序时解决了一个类要具备多方面的特征 ~

抽象类与接口

抽象类

通过关键字 abstract 定义的类叫做抽象类。在 Java 中所有的对象都是通过类来描述的;但反过来,并不是所有的类都是用来描述对象的,抽象类就是其中的一种

这里展示一下什么叫抽象类: 

abstract class C{abstract void Func();public void Func1(){System.out.println("C");}
}

我们知道抽象类是至少有一个抽象方法的类叫做抽象类,这也意味着抽象类中存在不是抽象方法的方法。这样抽象类就不能算作是纯粹的接口,而是介于普通类与接口之间。

接口

是一个抽象类型,是抽象方法的集合;接口通过关键字 interface 来定义。接口与抽象类的不同之处在于:

接口中的成员变量隐式为 static final,但抽象类不是的
一个类可以实现多个接口,但只能继承一个抽象类
抽象类中可以存在有方法的方法,而接口中(除了静态方法、默认方法这些特殊方法)就只有抽象方法

接口是隐式抽象的,所以声明时没有必要使用 abstract 关键字

接口中的方法都是隐式 public 的

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 模板:软件验收文档
  • 【STM32系统】基于STM32设计的智能垃圾桶(语音、颜色识别、称重、光强、烟雾、人体识别、步进电机、水泵)——文末资料下载
  • 157-安全开发-Python 自动化挖掘项目SRC 目标FOFA 资产Web 爬虫解析库
  • oracle 条件取反
  • discuz论坛3.4 截图粘贴图片发帖后显示不正常问题
  • Qt_控件的QWidget属性介绍
  • C/C++调试工具GDB简单介绍
  • 蓝桥杯真题——数星星
  • gitlab无法push(pre-receive hook declined)
  • vue3 响应式 API:readonly() 与 shallowReadonly()
  • MMdetection改进的目标检测算法
  • Mysql基础练习题 1407.排名靠前的旅行者(力扣)
  • ICLR2024: 大视觉语言模型中对象幻觉的分析和缓解
  • C#编写上位机通过OPC DA读取西门子PLC数据
  • EmguCV学习笔记 C# 11.3 DNN其它
  • Android框架之Volley
  • css的样式优先级
  • Docker: 容器互访的三种方式
  • GitUp, 你不可错过的秀外慧中的git工具
  • HTTP 简介
  • HTTP传输编码增加了传输量,只为解决这一个问题 | 实用 HTTP
  • JS+CSS实现数字滚动
  • JSDuck 与 AngularJS 融合技巧
  • js数组之filter
  • JS字符串转数字方法总结
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • Spark RDD学习: aggregate函数
  • windows下mongoDB的环境配置
  • 阿里云Kubernetes容器服务上体验Knative
  • 持续集成与持续部署宝典Part 2:创建持续集成流水线
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 类orAPI - 收藏集 - 掘金
  • 盘点那些不知名却常用的 Git 操作
  • 数据结构java版之冒泡排序及优化
  • 线性表及其算法(java实现)
  • 学习ES6 变量的解构赋值
  • 一份游戏开发学习路线
  • 原生JS动态加载JS、CSS文件及代码脚本
  • 在Docker Swarm上部署Apache Storm:第1部分
  • 第二十章:异步和文件I/O.(二十三)
  • 直播平台建设千万不要忘记流媒体服务器的存在 ...
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • #NOIP 2014# day.2 T2 寻找道路
  • (10)STL算法之搜索(二) 二分查找
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (待修改)PyG安装步骤
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (强烈推荐)移动端音视频从零到上手(上)
  • (四)Controller接口控制器详解(三)
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • (转)Google的Objective-C编码规范
  • (转)winform之ListView