持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第28天,点击查看活动详情
关于接口
接口就是用来实现类之间多重继承功能的一种结构,是相对独立的完成特定功能的属性集合。
问:Java 中类是支持单继承还是多继承?
答案:java 类只支持单继承。
在 Java 中由于类只能继承一个类,为了改进就有了接口,所以接口模拟的实现了多继承。
接口结构
我们来看一下接口声明的格式:
[public] interface 接口名{
// 声明常量
// 声明抽象方法
}
抽象方法也类似一种约定,比抽象类更进一步抽象
对于接口的修饰符,只有 public,用 public 修饰的接口称为公共接口。被修饰为 public 的接口,接口名必须和文件名一致。
类通过关键字 class 标识,而接口通过关键字 interface 来标识。 从结构上来看,接口就是特殊的抽象类。看一下具体的代码:
interface InterfaceA{
int ID = 100;
void method1();
}
等价于:
interface InterfaceA{
public static final int ID = 100;
public abstract void method1();
}
我们可以看到在接口里面只有常量和方法的声明,所以说接口是由常量和抽象方法组成的。
一般我们建议,在接口中常量前的修饰符全部省略书写,而抽象方法省略 abstract 关键字的书写。
同样也需要注意以下的写法都是不允许存在的,在接口中不能存在构造方法和方法的方法体。
interface InterfaceC{
public InterfaceC(){
}
public void method3(){
}
}
同理,接口也是不能实例化的。
接口的继承
和类一样,接口也具有继承性,它将继承父接口的所有属性和方法。
不过接口可以继承多个父接口,实现了多继承。
语法结构:
[public] interface 接口名 extends 父接口名1[, 父接口名2,... 父接口名n]{
// 可以继承父接口中所有的属性和方法
}
接口的实现
由上面介绍我们可以知道,接口不能实例化,没有构造方法,对于怎么使用接口,我们需要给他提供子类,来具体实现接口里面的方法
实现接口需要使用关键字 implements 。
语法结构:
[public] class 类名 implments 接口名1[, 接口名2, ...接口名n]{
// 可以调用接口中所有属性
// 实现接口中所有的抽象方法
}
每个类最多只能继承一个父类,不能同时继承多个类,也就是不允许多重继承。而接口不存在这方面的限制,可以只实现一个接口,也可以同时实现两个接口、三个接口等等。
如果子类没有实现父类的接口里面全部方法,那么编译会报错。但是把类设置成为抽象类,那么就不需要实现所有方法
abstract class ClassB implements InterfaceD, InterfaceE{
}
- 不同的类可以实现相同的接口
接下来,我们来看看以下代码:👇
interface InterfaceX{
public void method1();
}
interface InterfaceY{
public void method1();
}
class ClassZ implements InterfaceX,InterfaceY{
@Override
public void method1(){
}
}
🤔 可能你会想相同的方法名 method1() ,会冲突吧 ~
但是这个程序没有任何问题,在 ClassZ 中所写的 method1() 方法既实现了 InterfaceX 接口中的 method1() 方法,也实现了 InterfaceY 接口中的 method1() 方法。
总结:
- 声明接口采用 interface 关键字来标识的,在接口中只有常量和方法的声明。
- 接口可以采用 extends 关键字完成多继承,也就是说接口可以继承一个接口,也可以继承多个接口。
- 接口不能实例化,必须通过子类才能获取实例,那么子类需要通过 implements 关键字实现该接口。
接口与类的不同之处:
-
凡是类都有构造方法,即便是抽象类也支持定义构造方法,但接口不允许定义构造方法。
-
在 JDK8 以前,接口内部的所有方法都必须是抽象方法,但可以省略 abstract 关键字的修饰。
-
接口里声明的属性默认是 public final static 修饰,就是一个常量值。
-
判断继承和接口 继承就是’是‘的关系,比如对象是xx,接口就是拥有关系,比如门有锁
练习
3种,接口 C 继承接口 A 和 B,不同的方法都被直接继承下来,相同的方法合并后被继承下来。