接口的好处
1、什么是接口
接口比抽象类抽象的更加彻底,接口定义了一批类所需要遵守的规范。接口是不用关心这些类中方法的实现细节的。
接口做到了规范与实现的分离,是一种松耦合设计。软件系统的各个模块之间也应该采用这种面向接口的耦合,从而尽量降低各个米快直接的耦合,为系统提供更好的可扩展性和可维护性。
2、定义接口
// [修饰符] interface [接口名] extends 父级接口1,父级接口2,注,只能继承接口
// 如果省略public访问控制符,则默认采用包权限访问控制符
public interface SonInter extends ParentInter {
// 接口中不能包含构造器和初始化块定义
// 内部访问修饰符是public
// 常量定义 (需指定默认值,总是使用public static final修饰符修饰常量)
public static final int MAX_SIZE =10;
// 抽象方法定义
void eat();
// 默认方法或者类方法
default void run(){
System.out.println("默认方法run()");
}
// 内部类、接口、枚举(默认采用public abstrator修饰符)
}
3、接口继承
接口支持多继承,即一个接口可以继承多个直接父级接口。
父级接口s:
//第一个父级接口
public interface ParentInter {
int NUM0= 0;
}
//第二个父级接口
public interface ParentInter1 {
int NUM1= 1;
}
//第三个父级接口
public interface ParentInter2 {
int NUM2= 2;
}
子级接口:
//子级接口
public interface SonInter extends ParentInter,ParentInter1,ParentInter2 {
}
测试:
public class Test02 {
public static void main(String[] args) {
System.out.println(SonInter.NUM0);
System.out.println(SonInter.NUM1);
System.out.println(SonInter.NUM2);
}
}
注,此处只做常量演示,如果父级接口中有相同名称的常量值等会有问题。
4、使用接口
实现类:
//实现SonInter接口
public class SonImpl implements SonInter {
// 实现接口的eat()方法
@Override
public void eat() {
System.out.println("接口实现类实现eat()方法");
}
}
测试:
public class Test02 {
public static void main(String[] args) {
//接口
SonInter son = new SonImpl();
son.eat(); // 接口的抽象方法
son.run(); // 接口的默认方法
}
}
5、接口和抽象类对比
共同点:
- 都不能被实例化。
- 都可以包含抽象方法,子类需要对抽象方法进行实现。
不同点:
- 设计目的不一样。接口体现的是一种规范,降低系统模块间耦合度;抽象类体现的是一种模板式设计,可以当作是系统实现过程中的中间产品,这个产品必须经过进一步完善才能成为最终产品。
- 接口只能包含抽象方法和默认方法,会给方法自动加上public abstract 修饰符,以至于方法是抽象方法,所以形似普通方法的抽象方法不能写方法体;抽象类可以定义普通方法。
- 接口中不能定义i静态方法;抽象类可以定义普通方法。
- 接口不能定义变量,定义的量会默认加上public abstract final修饰符也就是只能定义为静态常量;抽象类可以定义变量和静态常量。
- 接口中不能定义构造器;抽象类可以定义构造器,但是不是用来创建实例对象,而是给子类调用的。
- 接口不能定义初始化块;抽象类可以定义初始化块。
- 一个类只能继承一个父类(包括抽象类),但是可以实现多个接口。接口中可以继承多个接口。