java中的接口用于描述类应该具备什么样的功能,而不给出具体的实现,一个类可以“实现”多个接口
【注意】接口不是类,而是对类的一组描述
还是让我们通过一个例子来看看接口如何运作吧!
java文件结构:
├─myInterface.java └─Myclass.java
myInterface.java :
public interface myInterface { int function ( int arg ) ; }
Myclass.java:
public class Myclass implements myInterface{ public int function(int arg) { return 0; } }
在上面这个例子中,我们称 Myclass实现了(implements了)myInterface这个接口
接口的一些特性
1.置入一个接口的所有字段都自动具有static 和final 属性, 也就是说,所有的字段都是静态常量
2.字段和方法只能被public修饰, 而不能被private或者protected修饰(你可以不写出public,因为默认就是由public修饰的)
例如,如下用private修饰一个字段会导致报错
public interface myInterface { private int a; }
报的错误是:
Illegal modifier for the interface field myInterface.a; only public, static & final are permitted
对比是学习的一种方式,下面我对接口的介绍,将在一系列的对比中展开
接口和超类的差异
我们发现,接口的定义方式和使用和超类很相似,例如:
超类的定义和使用:
public class superClass { ... } public class subClass extends superClass { ...}
接口的定义和使用:
public interface myInterface { ... } public class Myclass implements myInterface{ ...}
就使用而言,超类通过class关键字定义, 并通过extends去“继承”,而接口通过interface关键字定义,并通过implement去“实现”
那么“接口”和“超类”有什么不同呢?
超类是一个“模板”,而接口是一种“契约”
1.超类的作用是为子类提供可复用(继承)的方法和域,并允许子类在此基础上添加新的方法和域,超类是一个“模板”
2.接口却不一样,接口并不提供给子类能够使用的方法。相反,接口约定了一组方法,并强制要求implements了(也即实现了)这个接口的类去“实现”接口约定的方法,接口是一种“契约”
如果你在implements了接口的类中没有按要求“实现”接口约定的方法的话,是会导致报错的,例如:
报的错误是:
The type Myclass must implement the inherited abstract method myInterface.function(int)
我们通过提示的quick fix修复一下:
可以看到,“实现”了接口约定的这个function方法后,报错消失了, 那怎么才算符合约定呢?这要求对应的方法的返回值类型和参数类型都和接口里的相同
让我对接口和超类的作用打个比方:
超类继承