抽象类是从多个类中抽象出来的模板,如果将这种抽象进行的更彻底,则可以提炼出一种更加特殊的“抽象类”——接口(Interface)。

接口是 Java 中最重要的概念之一,它可以被理解为一种特殊的类,不同的是接口的成员没有执行体,是由全局常量和公共的抽象方法所组成。

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

定义接口

Java 接口的定义方式与类基本相同,不过接口定义使用的关键字是 interface,接口定义的语法格式如下:

[public] interface interface_name [extends interface1_name[, interface2_name,…]] {// 接口体,其中可以包含定义常量和声明方法[public] [static] [final] type constant_name = value;    // 定义常量[public] [abstract] returnType method_name(parameter_list);    // 声明方法
}

对以上语法的说明如下:

  • public 表示接口的修饰符,当没有修饰符时,则使用默认的修饰符,此时该接口的访问权限仅局限于所属的包;
  • interface_name
    表示接口的名称。接口名应与类名采用相同的命名规则,即如果仅从语法角度来看,接口名只要是合法的标识符即可。如果要遵守 Java可读性规范,则接口名应由多个有意义的单词连缀而成,每个单词首字母大写,单词与单词之间无需任何分隔符。
  • extends 表示接口的继承关系;
  • interface1_name 表示要继承的接口名称;
  • constant_name 表示变量名称,一般是 static 和 final 型的;
  • returnType 表示方法的返回值类型;
  • parameter_list 表示参数列表,在接口中的方法是没有方法体的。

注意:一个接口可以有多个直接父接口,但接口只能继承接口,不能继承类。

接口与类的区别:

  • 接口不能用于实例化对象。

  • 接口没有构造方法。

  • 接口中所有的方法必须是抽象方法。

     1. 接口里的方法都有个修饰词组合: public abstract2.跟接口方法一样, 这两个修饰词也可以省略不写.3.既然是抽象方法, 则不能包含方法体.而且接口里不允许存在非抽象的方法
    
  • 接口不能包含成员变量,除了 static 和 final 变量。

1.不能用protected 或 private 来修饰成员, 否则编译失败.
2.public static final int i =10;

  • 接口不是被类继承了,而是要被类实现(implements)。
  • 接口支持多继承。

接口特性

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

接口对于其声明、变量和方法都做了许多限制,这些限制作为接口的特征归纳如下:

  • 具有 public 访问控制符的接口,允许任何类使用;没有指定 public 的接口,其访问将局限于所属的包。
  • 方法的声明不需要其他修饰符,在接口中声明的方法,将隐式地声明为公有的(public)和抽象的(abstract)。
  • 在 Java 接口中声明的变量其实都是常量,接口中的变量声明,将隐式地声明为 public、static 和
    final,即常量,所以接口中定义的变量必须初始化。
  • 接口没有构造方法,不能被实例化。例如:
public interface A {publicA(){…}    // 编译出错,接口不允许定义构造方法
}
  • 一个接口不能够实现另一个接口,但它可以继承多个其他接口。子接口可以对父接口的方法和常量进行重写。例如:
public interface StudentInterface extends PeopleInterface {// 接口 StudentInterface 继承 PeopleInterfaceint age = 25;    // 常量age重写父接口中的age常量void getInfo();    // 方法getInfo()重写父接口中的getInfo()方法
}

例如,定义一个接口 MyInterface,并在该接口中声明常量和方法,如下:

public interface MyInterface {    // 接口myInterfaceString name;    // 不合法,变量name必须初始化int age = 20;    // 合法,等同于 public static final int age = 20;void getInfo();    // 方法声明,等同于 public abstract void getInfo();
}

实现接口(implements)

接口的主要用途就是被实现类实现,一个类可以实现一个或多个接口,继承使用 extends 关键字实现则使用 implements 关键字。因为一个类可以实现多个接口,这也是 Java 为单继承灵活性不足所作的补充。类实现接口的语法格式如下:

<public> class <class_name> [extends superclass_name] [implements interface1_name[, interface2_name…]] {// 主体
}

对以上语法的说明如下:

  • public:类的修饰符;
  • superclass_name:需要继承的父类名称;
  • interface1_name:要实现的接口名称。

实现接口需要注意以下几点:

  • 实现接口与继承父类相似,一样可以获得所实现接口里定义的常量和方法。如果一个类需要实现多个接口,则多个接口之间以逗号分隔。
  • 一个类可以继承一个父类,并同时实现多个接口,implements 部分必须放在 extends 部分之后。
  • 一个类实现了一个或多个接口之后,这个类必须完全实现这些接口里所定义的全部抽象方法(也就是重写这些抽象方法);否则,该类将保留从父接口那里继承到的抽象方法,该类也必须定义成抽象类。

例 1
在程序的开发中,需要完成两个数的求和运算和比较运算功能的类非常多。那么可以定义一个接口来将类似的功能组织在一起。下面创建一个示例,具体介绍接口的实现方式。

1)创建一个名称为 IMath 的接口,代码如下:

public interface IMath {public int sum();    // 完成两个数的相加public int maxNum(int a,int b);    // 获取较大的数
}

2)定义一个 MathClass 类并实现 IMath 接口,MathClass 类实现代码如下:

public class MathClass implements IMath {private int num1;    // 第 1 个操作数private int num2;    // 第 2 个操作数public MathClass(int num1,int num2) {// 构造方法this.num1 = num1;this.num2 = num2;}// 实现接口中的求和方法public int sum() {return num1 + num2;}// 实现接口中的获取较大数的方法public int maxNum(int a,int b) {if(a >= b) {return a;} else {return b;}}
}

在实现类中,所有的方法都使用了 public 访问修饰符声明。无论何时实现一个由接口定义的方法,它都必须实现为 public,因为接口中的所有成员都显式声明为 public。

3)最后创建测试类 NumTest,实例化接口的实现类 MathClass,调用该类中的方法并输出结果。该类内容如下:

public class NumTest {public static void main(String[] args) {// 创建实现类的对象MathClass calc = new MathClass(100, 300);System.out.println("100 和 300 相加结果是:" + calc.sum());System.out.println("100 比较 300,哪个大:" + calc.maxNum(100, 300));}
}

程序运行结果如下所示。

100 和 300 相加结果是:400
100 比较 300,哪个大:300

在该程序中,首先定义了一个 IMath 的接口,在该接口中只声明了两个未实现的方法,这两个方法需要在接口的实现类中实现。在实现类 MathClass 中定义了两个私有的属性,并赋予两个属性初始值,同时创建了该类的构造方法。因为该类实现了 MathClass 接口,因此必须实现接口中的方法。在最后的测试类中,需要创建实现类对象,然后通过实现类对象调用实现类中的方法。

1.12 接口(Interface)的定义和实现相关推荐

  1. java 接口的访问权限_证明接口interface中定义的方法的访问权限为public

    如题,证明Java中接口文件中定义的方法访问权限为public. 众所周知,接口中的方法默认是public abstract 类型的,它必须由子类实现之.那怎么证明呢,反射. 定义接口文件 packa ...

  2. Java接口属性值定义_Java接口(interface)的定义和使用

    Java-接口interface定义和使用 1.什么是接口 Java为单继承,当父类的方法种类无法满足子类需求时,可实现接口扩容子类能力. 即:Java中使用抽象类/父类表示通用属性时,每个类只能继承 ...

  3. 12、Interface (接口)克隆

    文章目录 (一)Interface Note 1.概念 2.基本语法 声明接口 继承接口 实现接口 3.特点 4.抽象类与接口的区别 共同点 区别 选择 5.克隆 附:抽象类 PK 接口 (二)Int ...

  4. Go 学习笔记(35)— Go 接口 interface (接口声明、接口初始化、接口方法调用、接口运算、类型断言、类型查询、空接口)

    1. 接口概念 接口是双方约定的一种合作协议.接口实现者不需要关心接口会被怎样使用,调用者也不需要关心接口的实现细节.接口是一种类型,也是一种抽象结构,不会暴露所含数据的格式.类型及结构. 接口内部存 ...

  5. php中的抽象类(abstract class)和接口(interface)

    一. 抽象类abstract class 1 .抽象类是指在 class 前加了 abstract 关键字且存在抽象方法(在类方法 function 关键字前加了 abstract 关键字)的类. 2 ...

  6. Java的类(class)、包(package)和接口(interface)

    在Java中,类(class)是用来代表对象的基本单元.对象(object)可以是现实世界中的任何一个实体,它具有若干区别于其它对象的属性和操作.而类则通过为对象定义属性和操作来概括一类实体.它封装了 ...

  7. Java接口(interface)的概念及使用

    在抽象类中,可以包含一个或多个抽象方法:但在接口(interface)中,所有的方法必须都是抽象的,不能有方法体,它比抽象类更加"抽象". 接口使用 interface 关键字来声 ...

  8. TypeScript 接口(Interface)

    TypeScript 接口(Interface) 本节介绍 TypeScript 各种类型接口的声明及其使用方法,接口在 TypeScript 中是极其重要的,我们使用接口来定义契约,如类型命名.属性 ...

  9. typescript中的类型type与接口interface

    typescript中的type相当于是给类型起一个新的名字 基本用法: 比如我想声明一个类型为number的年龄age,刚开始学typescript,我们可能会这样写 let age:number ...

最新文章

  1. React 项目--引入bebal 解析JSX(5)
  2. 【NOI2002】贪吃的九头龙
  3. 几种流行Webservice控制框架
  4. easy ui dialog 关闭之后的怪异问题
  5. 【linux】——Linux tar打包命令
  6. 万字长文!搞定逃不脱的 DNS 面试题
  7. Eclipse插件安装之,使用(已经下载的zip)安装包直接安装插件(例:glassfish 插件 plugin)
  8. 使用jsp:include嵌入页面的两种方式
  9. win10系统开启扫描仪服务器,win10通用扫描仪安装步骤
  10. 本机授权git授权,并绑定github操作流程
  11. python展示水果价格_小姨开水果店的,所以今天用Python写了一个水果店小系统!...
  12. python Requests+正则表达式爬取猫眼电影top100
  13. win10打开Android模拟器后电脑重启问题
  14. bootstrap-select 滚轴_Bootstrap-Select插件
  15. Mac系统随笔 | (2) Macbook WiFi共享
  16. 最新,2022年JCR正式发布(附影响因子名单下载)
  17. 基于LM358的几种外围电路
  18. 软考复习资料:专题一:计算机系统知识
  19. 基本靠谱的渗透测试书籍
  20. Java生成微信分享海报小工具EasyPoster

热门文章

  1. BlockChain:BlockChain周边概念详解+个人理解
  2. win10下使用wget
  3. python中的argparse包——用于解析命令行参数
  4. 从Activity中返回数据
  5. Coursera Algorithms week1 算法分析 练习测验: Egg drop 扔鸡蛋问题
  6. jQuery $.ajax传递数组的traditional参数传递必须true 对象的序列化
  7. [唐胡璐]Java操作Sql Server 2008数据库
  8. 如何编写高质量CSS
  9. GIS数据的查找,插入,删除,更新(ArcEngine)
  10. 进程环境详解(四)---getenv、putenv和setenv函数详解