1.接口的概念
接口是特殊的抽象类,是Java独有的语法
接口是功能的集合,同时也是一种数据类型,是一种比抽象类更加抽象的抽象类
接口只是描述了应当具备的功能,并没有具体的实现的方法体 具体的实现交给接口的实现类
这样就可以将功能的定义和功能的实现进行分离,实现程序的优化设计
注意:一切事物均有功能 一切事物均有接口
2.接口的定义
接口定义中需要使用关键字:interface
定义接口后生成的仍是.class文件 源文件的类型仍是.java文件
//定义接口语法:
public interface 接口名{
抽象方法1:
抽象方法2:
抽象方法3:
·······
}
//例如:
public interface Person{
//接口中的方法为抽象方法 无方法体
public abstract void eat()
public abstract void sleep()
public abstract void run()
}
注意:
1.将class替换成interface
2.接口中的方法全部为 公共的 抽象方法 且没有方法体
3.类实现接口
概念:
类与接口是类实现接口的关系,即:类实现接口。
实现需要用到关键字:implement
类实现接口后就能证明自己已经具备了这种功能
实现:
实现类仍然需要覆盖(实现)方法以实现功能
//类实现接口语法:
class 类 implements 接口名{
重写接口中的方法
}
//例如:
public interface Person{
//接口中的方法为抽象方法 无方法体
public abstract void eat()
public abstract void sleep()
public abstract void run()
}
//Students类实现接口Person
class Students implements Person{
//重写接口中的方法
public void eat(){}
public void sleep(){}
public void run(){}
}
思考:类是现实事物的描述,接口是功能的集合。
4.接口中的成员(成员变量和成员方法)
(1)接口中的成员变量
①成员变量的特点:没有变量,全都是常量
②成员变量的固定格式:public static final 数据类型 变量名 =值
public interface Person{
//定义格式:public static final 数据类型 变量名 = 值
public static final int age =25;
}
修饰符 | 解释意思 |
public | 权限 公开 |
static | 可以被类名直接调用 |
final | 最终,固定住变量的值 |
以上三个修饰符在接口的定义中可以省略不写,但是,不写不等于没有,三个修饰符也可以,选择性书写
③使用接口中定义的常量
常量被静态修饰,可以被类名直接调用,被接口的名字直接调用
(2)接口中的成员方法
①接口中的成员方法都是抽象方法
②定义抽象方法(固定抽象方法)
public abstract 返回值类型 方法名 (参数列表)
注:此处写不写public都是public 不是默认default 默认是public
public interface Person{
//接口中的方法为抽象方法 无方法体
//固定格式:public abstract 返回值类型 方法名(参数表)
public abstract void eat()
public abstract int sleep(int age)
public abstract double run(int age)
}
特点:
1.接口不可以创建对象
2.子类必须覆盖掉接口中全部的抽象方法后,子类才可以实例化,否则子类只能是一个抽象类
5.接口的多实现
接口最重要的体现:解决多继承存在的弊端,将多继承的这种机制在Java中实现
public interface Person{
//定义格式:public static final 数据类型 变量名 = 值
public static final int age =25;
//接口中的方法为抽象方法 无方法体
//固定格式:public abstract 返回值类型 方法名(参数表)
public abstract void eat()
public abstract int sleep(int age)
public abstract double run(int age)
}
//接口Study
public interface Study{
//抽象的study(){}
public abstract void study(){}
}
//Students类实现接口Person,Study 多实现
class Students implements Person,Study{
//重写接口中的方法
public void eat(){}
public void sleep(){}
public void run(){}
public void study(){}
}
多继承的弊端是什么呢?
多继承时,当多个父类中相同的方法的时候,子类调用会产生不稳定性
为什么接口的多实现可以解决呢?
因为接口中的方法都是抽象的方法并且没有方法体,由子类来明确。
6.类继承类 同时实现接口
接口和类之间可以通过类的实现来实现接口的功能,同时我们之前已经知道类与类之间可以通过继承实现关系,当一个类已经继承了另一个父类,它又需要添加额外的功能时,这时候接口就可以派上用场了
子类通过继承父类扩展功能,通过继承拓展的功能都是子类具备的基础功能。如果子类想继续扩展其他的功能?这时可以通过接口来实现
//创建父类A
class A{
//A类中的方法eat()
public void eat(){}
}
//创建接口B
interface B{
//抽象方法sleep()
public abstract void sleep();
}
//C类继承A类 实现B类的接口
class C extends A implements B{
//C类实现了B接口的sleep()方法
public void sleep(){
}
}
//这样C类就具有了eat()和sleep()两种功能
7.接口与接口之间的关系(接口的多继承)
多个接口之间也可以相互继承
利用关键字 extends
//创建接口A
interface A{
//A接口中的方法eat()
public abstract void eat();
}
//创建接口B
interface B{
//抽象方法eat()
public abstract void eat();
}
interface C{
public abstract void eat();
}
//D接口继承A,B,C接口
interface D implements A,B,C{
//D接口需要重写eat方法
public void eat(){
}
}
//以上就是接口与接口之间的继承关系
由于接口中的方法都是抽象方法,所以当子类接口重写实现以后也不会出现调用不明确的情况
8.接口的好处:
开发中的好处:(1)接口的出现拓展了功能
(2)接口就是暴露出来的规则
(3)接口的出现降低了耦合性,即设备与设备之间的解耦
(4)接口的出现方便后期的更新和维护
9.接口和抽象的区别
明白了接口思想和接口的用法后,接口和抽象类的区别是什么呢?接口在生活体现也基本掌握,那在程序中接口是如何体现的呢?
通过实例进行分析和代码演示抽象类和接口的用法。
1、举例:
犬:
行为:
吼叫;
吃饭;
缉毒犬:
行为:
吼叫;
吃饭;
缉毒;
2、思考:
由于犬分为很多种类,他们吼叫和吃饭的方式不一样,在描述的时候不能具体化,也就是吼叫和吃饭的行为不能明确。当描述行为时,行为的具体动作不能明确,这时,可以将这个行为写为抽象行为,那么这个类也就是抽象类。
可是当缉毒犬有其他额外功能时,而这个功能并不在这个事物的体系中。这时可以让缉毒犬具备犬科自身特点的同时也有其他额外功能,可以将这个额外功能定义接口中。
如下代码演示:
interface 缉毒{
public abstract void 缉毒();
}
//定义犬科的这个提醒的共性功能
abstract class 犬科{
public abstract void 吃饭();
public abstract void 吼叫();
}
// 缉毒犬属于犬科一种,让其继承犬科,获取的犬科的特性,
//由于缉毒犬具有缉毒功能,那么它只要实现缉毒接口即可,这样即保证缉毒犬具备犬科的特性,也拥有了缉毒的功能
class 缉毒犬 extends 犬科 implements 缉毒{
public void 缉毒() {
}
void 吃饭() {
}
void 吼叫() {
}
}
class 缉毒猪 implements 缉毒{
public void 缉毒() {
}
}
3、通过上面的例子总结接口和抽象类的区别:
相同点:
- 都位于继承的顶端,用于被其他类实现或继承;
- 都不能直接实例化对象;
- 都包含抽象方法,其子类都必须覆写这些抽象方法;
区别:
- 抽象类为部分方法提供实现,避免子类重复实现这些方法,提高代码重用性;接口只能包含抽象方法;
- 一个类只能继承一个直接父类(可能是抽象类),却可以实现多个接口;(接口弥补了Java的单继承)
- 抽象类是这个事物中应该具备的你内容, 继承体系是一种 is..a关系
- 接口是这个事物中的额外内容,继承体系是一种 like..a关系
二者的选用:
- 优先选用接口,尽量少用抽象类;
- 需要定义子类的行为,又要为子类提供共性功能时才选用抽象类;