接口
定义:公共的规范标准

接口是多个类的公共规范,上图描述了不同版本jdk的包含内容,现在我用的是9,所以常量,抽象方法,默认方法,静态方法,私有方法都可以有
格式public interface 接口名{},
使用intelliJ用新建选择interface


然后就自动创建了我们起名的interface接口
接口定义抽象方法格式public abstract xx(参数列表);接口中的抽象方法,修饰必须是public abstract(2个修饰符可以选择性省略,但是不建议)

使用接口抽象方法
接口使用和抽象类类似,但是不一样
格式 public class 类名 implements 接口名称{...} 这里关键字为implements而不是extends
接口的实现类必须重写接口的所有抽象方法,去掉abstract,加上{代码},最后创建实现类的实例
这里IDE IntelliJ还是可以通过alt+enter实现快速添加复写抽象方法



如上使用实现类implements接口,然后使用main类实例实现类调用复写方法
使用接口默认方法
从java8开始,接口可以定义默认default方法,为什么要考虑默认方法呢,比如我们定义了一个接口,然后其他人继承写了2个实现类,复写了对应抽象方法,但是如果这个接口升级了,多添加抽象方法就会使2个实现类都报错,这时就考虑使用default方法实现


如上2个图,我们给接口添加了抽象方法,实现类没更新就会标红保错

而当我们使用默认方法,报错就会消失,这里可以看到public是灰色的,证明可以省略,但是不建议,接口的默认方法记得关键字default,而且要有方法体,default默认方法子类是默认继承的,不复写的话可以直接调用

使用接口静态方法
从java8开始,接口可以使用静态方法,我们使用其静态方法一般不需要继承,直接使用静态方法即可,和之前的工具类的思想一样


使用接口私有方法
从java9开始,接口允许使用私有方法

如上我们在一个接口里定义了2个默认函数,里面有很多重复的部分,我们可以定义一个公共方法打印后3行,但是我们不希望这个公共方法被子例访问到,希望是私有化的,我们就需要定义私有方法
私有方法格式
普通私有方法 public 返回类型 方法名(参数列表){...} 用于解决普通成员方法间重复代码
静态私有方法 public static 返回类型 方法名(参数列表){...} 用于解决静态方法间重复代码,这里区别是因为静态代码无法访问非静态变量,方法
私有化的好处时,有人可能尝试实例化后调用这段方法,但是这部分是不能独立存在,必须依赖于几个方法中的,我们就不让其被外部调用,只让其在内部函数间调用
接口常量使用
我们在接口里也可以成员变量,其实这相当于是常量定义
格式 public static final 数据类型 数据名 = 值;
关键字里public我们知道是公有的,static我们知道是静态,使用接口来调用,不用实例,而final我们之后会讲,这里我们需要知道的就是不能修改

我们可以看到定义常量,public,static,final都是灰色的,即这些都是可以省略的,而且必须赋值不能只声明,而且建议常量名称全部大写,用下划线进行分割,如NUM_OF_MY_CLASS
注意:接口没有构造方法和静态代码块
我们知道类只能继承一个父类,但是实现类可以implements多个接口

如上,定义了MyInf继承InfA,InfB,这时候就需要同时复写2个接口的抽象方法,当然还是用IDE的ALT+ENTER。如果implements的多个接口有重名,只需要重写1次即可,因为写成了自己的
如果我们就是想不复写所有的方法,这样普通类implements就会报错,我们只能使用abstract抽象类来实现
如果我们implements了多个接口,而他们有不同的重名默认方法,我们实现类就需要复写方法
如果类继承父类又implements接口,2者有重名的默认方法,则我们子类调用的时候是使用父类的方法




网友评论