目录

1、接口的概念

2、语法规则

实现接口有几条规范需要我们注意

3、接口的使用

4、接口的特性

5、实现多个接口

6、接口间的继承


1、接口的概念

接口顾名思义,就是我们身边常用的行为规范。而接口在我们身边比比皆是,就比如电脑上的USB接口。USB接口插入U盘、鼠标、键盘....所有符合USB协议的设备,它把我们能用到的设备插头都统一起来,使得我们不用买大量的转换器,方便我们使用。

总结来说:接口就是公共的行为规范,大家在实现时,只要符合规范标准,就可以通用。

在Java中,接口可以看成是:多个类的公共规范,是一种引用数据类型。

2、语法规则

接口的定义格式与定义类的格式基本相同,将class关键字换成interface即可定义接口

interface 接口名称{//成员变量  必须要初始化public static final int a = 10;int b = 10;//抽象方法public abstract void method1();void method2();//接口的默认方法default void func()1{...}//接口静态成员方法static void func2(){...}
}

实现接口有几条规范需要我们注意

  1. 接口当中的成员变量,默认都是 public static final 修饰的
  2. 接口当中的成员方法,默认都是抽象方法,public abstract 修饰的
  3. 接口当中的普通成员方法,是不能有具体的实现的
  4. 接口当中的普通成员方法,如果要有具体实现,必须加上default修饰【从JDK8开始,才有】
  5. 接口当中可以有静态的成员方法
  6. 接口中不管是静态的方法还是default方法,都是public修饰的

书写接口规范

  1. 创建接口时,接口的命名一般以大写字母 I 开头。
  2. 接口命名一般使用“形容词”词性的单词。
  3. 阿里编码规范中约定,接口中的方法和属性不要加任何修饰符号,保持代码的简洁性。

        3、接口的使用

接口跟抽象类一样不能直接实例化,必须要有一个“实现类”来“实现”该接口,实现接口中的所有抽象方法。而类和接口的关系是使用 implements 来关联的

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

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

当类实现了接口,那么该类就必须实现接口中所有的抽象方法,否则编译器会报错

在IDEA中,有快捷键实现接口中的抽象方法。

首先把鼠标触碰implements,按下Alt+Shift+Enter 或点击 Implement methods 就会出现所有要实现抽象方法,点击OK即可完成

此外,接口也可以应用具体实现类。【向上转型】

interface  IShape{void draw();
}class Rect implements IShape{@Overridepublic void draw() {System.out.println("画一个正方形");}
}class Flower implements IShape{@Overridepublic void draw() {System.out.println("画一朵花");}
}public class test {public static void drawMap(IShape iShape){iShape.draw();}public static void main(String[] args) {drawMap(new Rect());drawMap(new Flower());IShape iShape = new Flower();//向上转型}
}

4、接口的特性

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

2.接口中的每一个方法都是 public 的抽象方法,即接口中普通侧成员方法会被隐式指定为 public abstract,且只能是 public abstract,其他修饰符都会报错。

3.接口中的方法一般不能在接口中实现,基本上都在实现接口的类来实现(在接口中default 修饰的方法可以具体实现)

4.重写接口方法时,所加访问权限必须要大于重写方法的访问权限

如下,draw() 方法默认是public修饰。Rect类要重写draw方法,就必须要加public,否则会报错

5.接口中可以含有变量,但是会被隐式指定为 public static final 变量

interface  IShape{double kind = 2.0;//默认被:public static final 修饰void draw();//默认public
}
public class test {public static void main(String[] args) {System.out.println(IShape.kind);//可以通过接口名访问//IShape.brand = 2.0;//无法为最终变量brand 分配值}
}

6.接口中不能有静态代码块和构造方法

7.接口虽然不是类,但是接口编译完成后字节码文件的后缀格式也是.class

        5、实现多个接口

在Java中,一个类只能继承一个父类,不支持多继承,而一个类却可以实现多个接口

“假设有一条 鱼 和一只 鸟,让我们来写一串代码来实现它们的行为”。

首先它们都是动物,我们都能给它们起名字,比如 “小花”、“小飞”....

那我们能不能定义抽象类,来统一规范动物的特性和行为。如下

abstract class Animal{public String name;public Animal(String name) {this.name = name;}
}

然后同时创建一个 鱼 类和一个鸟类,并继承Animal类

class Fish extends Animal{public Fish(String name) {super(name);}
}class Bird extends Animal{public Bird(String name) {super(name);}
}

现在我们来思考一下,鱼和鸟都有什么行为?

鱼能吃饭、能游泳

鸟能吃饭、能飞

他们共同的共性是吃饭,不同的特性是游泳和飞

特性分析出来了,那我们该如何实现呢?

思考:我们能不能在 Animal 类中写 eating、swimming、flying这三个方法,并让子类继承并重写这些方法呢?


答:肯定是不行的,这样虽然能让Fish类和Bird类获各自的行为,但是鱼也获得了‘上天’【flying】的能力,鸟也获得了‘下海’【swimming】的能力,所以这样做法不行。

那假设我另创建一个游泳类,在类中实现游泳方法,并让Fish继承,大家想想这样可以吗?答案肯定也是不行的。

Java中只能单继承,所以这时我们要用接口来实现这一功能

既然我们不能把 鱼 和 鸟 的所有行为特性都写到父类当中,那么我们就把他们相同的特性行为写到父类中,然后再把他们特有的行为写到接口中。

所以我们可以直接定义三个接口,分别为ISwimming、IFlying、IEating。分比让Fish类和Bird类实现,下面以Fish类实现接口为例

此时我们可以定义三个方法来方便我们调用swmming、flying、eating等

这些方法分别用相应的接口接收参数,并在main函数中调用

结果如下

此时如果 bird 能充当 swim 方法的参数吗?很明显不能。因为Bird类没有实现ISwimming接口。但是bird 和 fish 都能调用 eating 方法,这是因为 Fish 和 Bird 类都实现了IEating接口

interface ISwimming{void swimming();
}interface IFlying{void flying();
}interface IEating{void eating();
}
abstract class Animal{public String name;public Animal(String name) {this.name = name;}
}class Fish extends Animal implements ISwimming,IEating{public Fish(String name) {super(name);}@Overridepublic void swimming() {System.out.println(name+"正在游泳");}@Overridepublic void eating() {System.out.println(name+"正在吃鱼食");}
}class Bird extends Animal implements IFlying,IEating{public Bird(String name) {super(name);}@Overridepublic void flying() {System.out.println(name+"正在飞");}@Overridepublic void eating() {System.out.println(name+"正在此鸟粮");}
}public class Test {public static void swim(ISwimming iSwimming){iSwimming.swimming();}public static  void fly(IFlying iFlying){iFlying.flying();}public static void eat(IEating iEating){iEating.eating();}public static void main(String[] args) {Fish fish = new Fish("小鱼");swim(fish);eat(fish);Bird bird = new Bird("小鸟");fly(bird);eat(bird);}
}

上面代码展示了Java 面向对象编程中最常见的用法:一个类继承一个父类,同时实现多个接口。

继承表达的含义时 is-a 含义,而接口表达的含义时 具有xxxx特性

  • 鱼是一种动物,能吃,能游泳
  • 鸟也是一种动物,能吃,能飞

这样设计什么好处呢?可以我们

【Java课堂】接口详解相关推荐

  1. java小程序详解_微信小程序登录Java后台接口(详解,附示例代码)

    首先看一下官方文档 地址:微信小程序官方文档API登录接口 我们先对官方给的时序图进行简单的分析 1.当小程序调用wx.login()时,会获得一个code(临时登录凭证),然后我们需要用wx.req ...

  2. Java Map 接口详解

    软件包:java.util 接口:Map 描述:将键映射到值的对象 一,Map与Collection Collection接口:定义了单列集合规范,集合中的元素是独立存在的,每次存储一个(单个)元素 ...

  3. Java Map接口详解

    Map接口 Map接口概述 Map与Collection并列存在.用于保存具有映射关系的数据:key-value Map 中的 key 和 value 都可以是任何引用类型的数据 Map 中的 key ...

  4. java函数式接口-详解(狗头保命)

    函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口. 函数式接口可以被隐式转换为 lambda 表达式. JDK 1.8 之前已有的函数 ...

  5. Java Collection接口详解

    Collection 接口是 List.Set 和 Queue 接口的父接口,通常情况下不被直接使用.Collection 接口定义了一些通用的方法,通过这些方法可以实现对集合的基本操作.定义的方法既 ...

  6. 接口详解(JAVA)

    接口详解(JAVA) 文章目录 接口详解(JAVA) 接口 接口的定义和使用 练习 接口的细节:成员特点和接口的各种关系 接口中成员的特点 接口和类之间的关系 接口中新增方法,接口应用和适配器设计模式 ...

  7. Java接口 详解(二)

    上一篇Java接口 详解(一)讲到了接口的基本概念.接口的使用和接口的实际应用(标准定义).我们接着来讲. 一.接口的应用-工厂设计模式(Factory) 我们先看一个范例: package com. ...

  8. java基础(十三)-----详解内部类——Java高级开发必须懂的

    java基础(十三)-----详解内部类--Java高级开发必须懂的 目录 为什么要使用内部类 内部类基础 静态内部类 成员内部类 成员内部类的对象创建 继承成员内部类 局部内部类 推荐博客 匿名内部 ...

  9. Java类加载机制详解【java面试题】

    Java类加载机制详解[java面试题] (1)问题分析: Class文件由类装载器装载后,在JVM中将形成一份描述Class结构的元信息对象,通过该元信息对象可以获知Class的结构信息:如构造函数 ...

  10. java拉姆达表达式事例,Java Lambda表达式详解和实例

    简介 Lambda表达式是Java SE 8中一个重要的新特性.lambda表达式允许你通过表达式来代替功能接口. lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体( ...

最新文章

  1. 真正的人工智能不应该只有统计学
  2. python编写异常处理_Python 简明教程 --- 23,Python 异常处理
  3. Oracle获取最近执行的SQL语句
  4. PHP中功能强大却少使用的函数 -- 为你提供更多的思路
  5. CentOS 编译 Nginx 服务
  6. ps练习实例_拥有一份史上最全面的50集ps抠图学习教程是什么一种体验?
  7. FPGA设计中遇到的奇葩问题之“芯片也要看出身”(二)
  8. 计算机网络与多媒体专科测试,上海第二工业大学2021年专科层次依法自主招生生考试职业技能测试考纲...
  9. itextpdf paragraph使用
  10. 微软苏州校招笔试 12月27日
  11. 在线ps,修改证件照背景色
  12. 以太坊概念知识入门篇 1
  13. 解决Win10系统“win32错误报告,拒绝访问”问题,正解!!!
  14. MySQL Bug一例-----ibuf cursor restoration fails
  15. R语言使用rnorm函数生成正太分布数据、使用boxplot函数可视化箱图、中间黑线为中位数位置、上下框线为上下四分位数位置、上下触须为1.5倍四分位数间距、如果有孤立点表示异常值
  16. zpl指令打印中文内容_大疆机甲大师Python开发: 中文命名变量初尝试
  17. chmod的使用 czy:czy 文件名
  18. macOS Monterey 12.5 (21G72) 正式版 ISO、IPSW、PKG 下载
  19. 关于tensorflow的报错NodeDef mentions attr ‘xxx‘ not in Op的解决方案和产生原因
  20. SpringBoot+Vue 实现大文件断点下载

热门文章

  1. 计算机三级网络题,计算机三级网络试题及答案解析
  2. 大乐透号码 及数据库查询语句
  3. pandas的使用(一)
  4. C++调用Boost库编写Python扩展模块
  5. 函数分离常数法 oracle,函数值域之《分离常数法》正确打开方式
  6. Win7宝典 / Windows7宝典
  7. 学习了那么多SEO大神的教程,为什么你的网站还是没有排名呢?
  8. codeforces1407C Chocolate Bunny
  9. LINUX Beyond-Compare 4
  10. Fiddler修改请求、响应数据