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

Java进阶_接口

接口的概念

       在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。

        接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念。类描述对象的属性和方法。接口则包含类要实现的方法。

        接口无法被实例化,但是可以被实现。一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类。另外,在 Java 中,接口类型可用来声明一个变量,他们可以成为一个空指针,或是被绑定在一个以此接口实现的对象。

接口与类相似点

  • 一个接口可以有多个方法。
  • 接口文件保存在 .java 结尾的文件中,文件名使用接口名。
  • 接口的字节码文件保存在 .class 结尾的文件中。
  • 接口相应的字节码文件必须在与包名称相匹配的目录结构中。

接口与类的区别

  • 接口不能用于实例化对象。
  • 接口没有构造方法。
  • 接口中所有的方法必须是抽象方法,Java 8 之后 接口中可以使用 default 关键字修饰的非抽象方法。
  • 接口不能包含成员变量,除了 static 和 final 变量。
  • 接口不是被类继承了,而是要被类实现。
  • 接口支持多继承。

接口特性

  • 接口中每一个方法也是隐式抽象的,接口中的方法会被隐式的指定为 public abstract(只能是 public abstract,其他修饰符都会报错)。
  • 接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量(并且只能是 public,用 private 修饰会报编译错误)。
  • 接口中的方法是不能在接口中实现的,只能由实现接口的类来实现接口中的方法。

抽象类和接口的区别

  • 1. 抽象类中的方法可以有方法体,就是能实现方法的具体功能,但是接口中的方法不行。
  • 2. 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的。
  • 3. 接口中不能含有静态代码块以及静态方法(用 static 修饰的方法),而抽象类是可以有静态代码块和静态方法。
  • 4. 一个类只能继承一个抽象类,而一个类却可以实现多个接口。

JDK版本迭代注意内容

  • JDK 1.8 以后,接口里可以有静态方法和方法体了。
  • JDK 1.8 以后,接口允许包含具体实现的方法,该方法称为"默认方法",默认方法使用 default 关键字修饰。
  • JDK 1.9 以后,允许将方法定义为 private,使得某些复用的代码不会把方法暴露出去。

重写接口中声明的方法注意规则

  • 类在实现接口的方法时,不能抛出强制性异常,只能在接口中,或者继承接口的抽象类中抛出该强制性异常。
  • 类在重写方法时要保持一致的方法名,并且应该保持相同或者相兼容的返回值类型。
  • 如果实现接口的类是抽象类,那么就没必要实现该接口的方法。

 实现接口注意规则

  • 一个类可以同时实现多个接口。
  • 一个类只能继承一个类,但是能实现多个接口。
  • 一个接口能继承另一个接口,这和类之间的继承比较相似。

接口的声明

语法:

[可见度] interface 接口名称 [extends 其他的接口名] {
        // 声明变量
        // 抽象方法

/* 文件名 : Animal.java */
interface Animal {public void eat();public void travel();
}

接口的实现

语法:

...implements 接口名称[, 其他接口名称, 其他接口名称..., ...] ...

/* 文件名 : MammalInt.java */
public class MammalInt implements Animal{public void eat(){System.out.println("Mammal eats");}public void travel(){System.out.println("Mammal travels");} public int noOfLegs(){return 0;}public static void main(String args[]){MammalInt m = new MammalInt();m.eat();m.travel();}
}

接口的继承 

        一个接口能继承另一个接口,和类之间的继承方式比较相似。接口的继承使用extends关键字,子接口继承父接口的方法。实现子类接口的类必须实现子类及父类中的所有方法,除非声明为抽象类。

// 文件名: Sports.java
public interface Sports{public void setHomeTeam(String name);public void setVisitingTeam(String name);
}// 文件名: Football.java
public interface Football extends Sports{public void homeTeamScored(int points);public void visitingTeamScored(int points);public void endOfQuarter(int quarter);
}// 文件名: Hockey.java
public interface Hockey extends Sports{public void homeGoalScored();public void visitingGoalScored();public void endOfPeriod(int period);public void overtimePeriod(int ot);
}

接口的多继承

        在Java中,类的多继承是不合法,但接口允许多继承。在接口的多继承中extends关键字只需要使用一次,在其后跟着继承接口。

public interface Hockey extends Sports, Event{//方法
}

标记接口

        标记接口是没有任何方法和属性的接口.它仅仅表明它的类属于一个特定的类型,供其他代码来测试允许做一些事情。标记接口作用:简单形象的说就是给某个对象打个标(盖个戳),使对象拥有某个或某些特权。

例如:java.awt.event 包中的 MouseListener 接口继承的 java.util.EventListener 接口定义如下:

package java.util;
public interface EventListener
{}

没有任何方法的接口被称为标记接口。标记接口主要用于以下两种目的:

建立一个公共的父接口:

        正如EventListener接口,这是由几十个其他接口扩展的Java API,你可以使用一个标记接口来建立一组接口的父接口。例如:当一个接口继承了EventListener接口,Java虚拟机(JVM)就知道该接口将要被用于一个事件的代理方案。

向一个类添加数据类型:

        这种情况是标记接口最初的目的,实现标记接口的类不需要定义任何接口方法(因为标记接口根本就没有方法),但是该类通过多态性变成一个接口类型。

相关文章:

  • MySQL周内训参照1、ER实体关系图与数据库模型图绘制
  • wma和mp3哪个音质好?让我告诉你哪个更胜一筹
  • CAN总线终端电阻作用
  • Redis基本操作介绍
  • CATIA入门操作案例——创成式曲面设计案例,吹风机的绘制,多截面曲面的绘制,曲面偏移和修剪
  • SQLserver前五讲课堂笔记
  • GaussDB的数种形态
  • 谷粒商城实战(033 业务-秒杀功能4-高并发问题解决方案sentinel 1)
  • idea如何使用git reset进行回退以及如何使用git stash将暂存区文件储藏,打包后重新恢复暂存区文件
  • 【EBS】通过SQL查找所有的定时请求
  • 【HarmonyOS】逻辑类中调用通用弹窗的处理
  • 旅游卡免费旅游的使用条件有哪些?
  • Python自动化测试框架:unittest与pytest的深度对比
  • Android ServiceManager和它的兄弟们
  • 来自中国信通院的认可!上海斯歌受邀加入“EP-Link 智能流程推进计划”
  • 【翻译】babel对TC39装饰器草案的实现
  • CSS实用技巧
  • django开发-定时任务的使用
  • js面向对象
  • Laravel 实践之路: 数据库迁移与数据填充
  • Median of Two Sorted Arrays
  • React-生命周期杂记
  • vue从创建到完整的饿了么(18)购物车详细信息的展示与删除
  • 大型网站性能监测、分析与优化常见问题QA
  • 多线程 start 和 run 方法到底有什么区别?
  • 精彩代码 vue.js
  • 聊聊directory traversal attack
  • 深入浅出webpack学习(1)--核心概念
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 我是如何设计 Upload 上传组件的
  • 运行时添加log4j2的appender
  • 【云吞铺子】性能抖动剖析(二)
  • ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  • ​油烟净化器电源安全,保障健康餐饮生活
  • ‌移动管家手机智能控制汽车系统
  • #NOIP 2014#Day.2 T3 解方程
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • (¥1011)-(一千零一拾一元整)输出
  • (27)4.8 习题课
  • (7)STL算法之交换赋值
  • (delphi11最新学习资料) Object Pascal 学习笔记---第13章第6节 (嵌套的Finally代码块)
  • (Forward) Music Player: From UI Proposal to Code
  • (SERIES12)DM性能优化
  • (第27天)Oracle 数据泵转换分区表
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (二刷)代码随想录第16天|104.二叉树的最大深度 559.n叉树的最大深度● 111.二叉树的最小深度● 222.完全二叉树的节点个数
  • (附源码)ssm考试题库管理系统 毕业设计 069043
  • (附源码)ssm旅游企业财务管理系统 毕业设计 102100
  • (附源码)计算机毕业设计SSM疫情居家隔离服务系统
  • (利用IDEA+Maven)定制属于自己的jar包
  • (文章复现)基于主从博弈的售电商多元零售套餐设计与多级市场购电策略
  • .apk文件,IIS不支持下载解决
  • .NET / MSBuild 扩展编译时什么时候用 BeforeTargets / AfterTargets 什么时候用 DependsOnTargets?
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes
  • .net core docker部署教程和细节问题