接口的定义
- java的设计语言中,接口不是类,而是对类一组需求的描述,这些类要遵从接口描述的统一格式进行定义
- 一个类可以实现一个或者多个接口,并在需要接口的地方,随时使用实现了相应接口的对象。
- 接口中的所有方法自动属于public
接口的特性
- 与可以建立类的继承关系一样,接口也可被扩展,允许存在多条从具有较高通用性的接口到较高专用性的接口的链,即:接口之间也可以存在继承关系
- 接口中不能包含实例域或者静态方法,但可以包含常量。常量自动设置为静态的
public interface MoveParent{
void move(double x);
}
public interface MoveChild extends MoveParent{
double a = 1;
void moveChild(double a);
}
public class achieve implements MoveChild{
@Override
public void move(double x) {
}
@Override
public void moveChild(double a) {
}
- 前面提到接口中不允许接入静态方法,但是在JSE8中,增加了允许接口中存在静态方法,即一般类中实现的静态方法,在接口中现在可以加入,但是不建议这么做,目前为止通常的做法,都是将静态方法放在伴随类中的。
默认方法
- 可以在接口中以default修饰符,修饰方法提供默认实现。
ps:一般情况下是使用不到这个默认实现的,除非接口中定义的接口,实现类中没必要进行实现,那么可以使用default修饰方法,在实现类中选择性的实现或者重写默认实现的方法。.
public interface MoveChild extends MoveParent{
double a = 1;
void moveChild(double a);
default void getname(){
System.out.println("这是一个接口中默认实现的方法,实现类可以选择性的实现
,编译器不会报错");
}
}
接口实现中出现的重复方法问题
-
接口的默认方法冲突。
一个实现类同时实现两个接口,而两个接口的都提供了同一个方法,其中一个,或者两个都进行了默认实现。这时,编译器就会报错,需要程序员解决这个二义性。-
这个时候需要在实现类中定义一个相同的方法,return [接口名].super.[方法名],直接指定实现哪个接口中这个方法。
-
-
类优先原则
接口实现类中,这个类可能还继承了一个超类,并且这个超类中定义了与接口中一样的方法,这种情况下只会考虑超类方法,接口中定义的所有默认方法都会被忽略,这就是类优先原则。