前面的章节我们讲的内容一直基于类,本章开始引入一个新的概念——接口。
首先我们来创建一个接口:
- 创建一个工程——创建包——右键包名——New——interface:
我们可以发现,我们创建的接口和类的结构很像,只不过它的修饰符是interface,类的修饰符用的是class,还有个区别是接口文件在eclipse上显示的图标是一个紫色的i,类的图标是一个绿色的c。
我们之前学过抽象类,抽象类的作用可以概括为:
- 通过继承它实现多态,后期绑定,可以为将来要实现的东西做好接口,实现重用性。
今天我们要学习的接口这方面的和抽象类相似,但是接口却不是类,它要比抽象类更加抽象。
-
接口的定义:
首先,接口中的方法定义默认为public abstract类型,接口中的成员变量类型默认为public static final
因此,这样定义一个接口就可以了:- public interface Test {
- int A = 1;
- String testMethod();
- }
之前,我们的抽象类,需要被类继承了才能去实例化,那么我们的接口的实例化方式是被类实现(implements):
- public class Demo implements Test{
- @Override
- public String testMethod() {
- // TODO Auto-generated method stub
- return null;
- }
- }
当我们去实现了一个接口之后,我们需要去实现它下面所有的方法,这点和抽象类是一致的。我们实现了一个接口,类名上会报错,只要鼠标指着错误,点击add unimplemented methods,就能自动帮我们重写实现类,我们只需要在每个类上增加相应的业务逻辑即可,我们重写的方法上面有个@Override,这个是一个注解,是重写的意思。 当然,如果我们的接口是被抽象类实现的,则不需要重写,如:
这个抽象类还可以继续写抽象方法,当他被继承时,子类需要重新抽象类下的所有方法和抽象类实现的接口下的所有方法。 抽象类和接口基本上可以相互代替,但是,也有一定的区别,我们可以通过表格来对比:
参数 | 抽象类 | 接口 |
---|---|---|
默认的方法实现 | 它可以有默认的方法实现 | 接口完全是抽象的。它根本不存在方法的实现 |
实现 | 子类使用extends关键字来继承抽象类。如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法的实现。 | 子类使用关键字implements来实现接口。它需要提供接口中所有声明的方法的实现 |
构造器 | 抽象类可以有构造函数 | 接口不能有构造函数 |
与正常Java类的区别 | 除了不能实例化抽象类之外,它和普通Java类没有任何区别 | 接口是完全不同的类型 |
访问修饰符 | 抽象方法可以有public、protected和default这些修饰符 | 接口方法默认修饰符是public。你不可以使用其它修饰符 |
main方法 | 抽象方法可以有main方法并且我们可以运行它 | 接口没有main方法,因此我们不能运行它 |
多继承 | 抽象方法可以继承一个类和实现多个接口 | 接口只可以继承一个或多个其它接口 |
速度 | 它比接口速度要快 | 接口是稍微有点慢的,因为它需要时间去寻找在类中实现的方法 |
添加新方法 | 往抽象类中添加新的方法,可以给它提供默认的实现。不需要改变代码 | 往接口中添加方法必须改变实现该接口的类 |
当然,最后还有一点就是一个类只能继承一个父类,但是一个类可以去实现多个接口。这就是java的单继承和多实现的特点