接口的定义
当一个类中的所有方法都是抽象方法时,我们可以将它定义为接口,接口也是一种引用数据类型,它比抽象类还要抽象。
接口存在的两个意义:
- 规则的定义
- 程序的扩展性
接口的定义和特点
为了区分接口和继承的区别,建议阅读我的另一篇文章Java-----继承
- 接口使用关键字interface来定义,定义格式为:public interface 接口名{}
- 接口不能实例化(与抽象类类似,因为内部有抽象方法所以不能被创建对象)
- 接口与类之间是实现关系,通过关键字implements关键字表示,格式为:
public class 类名 implements 接口名{}
这里需要注意和继承的区别,继承是使用extends关键字,一个类只能继承一个父类,但是一个类可以实现多个接口,接口名之间用逗号分开。如果一个类实现了n个接口,那么它需要重写这n个接口中的所有方法。
接口中的成员特点
- 成员变量只能是常量,默认修饰符: public static final
- 没有构造方法
- jdk7及以前的版本:成员方法只能是抽象方法,默认修饰符: public abstract
- JDK8版本后:允许在接口中定义非抽象方法,但是需要使用关键字default修饰,这些方法就是默认方法。
之所以在jdk8以后版本对成员方法加入该特性,是因为在开发中有需求,比如我们需要在一个接口中新增几个方法,如果我们增加抽象方法,会导致需要实现了该接口的所有类都去重写这几个抽象方法,所以jdk8以后就增加了可以在接口中定义非抽象方法的功能。 - JDK8版本后允许在接口中定义静态方法,但是定义的静态方法只能通过接口名的方式来调用(静态变量的第二种调用方式),不能通过该接口的实现类以及实现类的对象来调用。
- JDK9版本后允许将接口中的非抽象方法和静态方法私有化。
接口中默认方法的注意事项:
- 默认方法不是抽象方法,所以不强制被重写。但是可以被重写, 重写的时候去掉default关键字
- public可以省略, default不能省略
- 如果实现了多个接口,多个接口中存在相同的方法声明,子类就必须对该方法进行重写
类和接口的关系
- 类和类的关系
继承关系,只能单继承,但是可以多层继承 - 类和接口的关系
实现关系,可以单实现,也可以多实现,还可以在继承-一个类的同时实现多个接口 - 接口和接口的关系
继承关系,可以弹继承,也可以多继承
上述关于接口每句话都是自己踩坑总结出来的,每一句都是精髓,虽然没有demo演示,但值得细细研读。
网友评论