Java程序员都知道他们需要针对接口进行编程。你知道Java中的接口除了定义接口方法外还能怎么用吗?今天阿粉就带大家看看Java中接口的其他用途还有哪些。基本功能让我们先来看看界面的基本功能。接口的定义需要使用关键字interface;接口定义的所有方法默认都是publicabstract;当具体类实现接口时,需要使用关键字implements;接口类之间可以多继承,但类只能单继承;如下图,我们定义一个接口;包com.example.demo.inter;导入java.io.Serializable;导入java.util.RandomAccess;publicinterfaceITestextendsSerializable,RandomAccess{publicabstractStringsayHello();StringsayHello2();}默认方法是JDK8之前接口不支持默认方法,JDK8之后接口支持默认方法,默认方法使用关键字default语句。publicinterfaceITestextendsSerializable,RandomAccess{publicabstractStringsayHello();字符串sayHello2();默认字符串sayHello3(){返回“hello3”;}}默认方法不同于抽象方法,抽象方法定义在接口中,当接口被其他类实现时需要完整实现,但是默认方法可以不实现直接使用,类似直接调用父类的方法,所以很多时候,我们已经继承了一个类,想要有一个可以使用但又不想被每个子类都实现的方法时,可以考虑添加一个默认方法要使用的界面。简单的说,实现类不需要重写默认方法。默认方法的作用是,在我们完成的项目中,如果直接在一个接口中添加一个方法,当没有默认方法时,我们需要为所有的实现类都实现相应的方法,但是这个方法不一定是每个实现类都需要,所以这个时候default方法很好的解决了这个问题。我们只需要添加一个默认方法,然后在需要使用的实现类中实现或者使用即可。其他实现该类不需要任何代码更改。标记界面的另一个非常常见的功能是标记功能。对此你可能没有印象,但是说到序列化接口java.io.Serializable;你一定知道我们经常在对应的POJO接口中实现这个序列,而这个序列化的接口,如果你看过源码,你一定知道里面没有任何内容。除了序列化的接口,同样的功能还有很多类似的空接口。例如,java.util.RandomAccess也是一个空接口。之前也有粉丝写过RandomAccess接口的用途。如果你有兴趣,可以去看看。RandomAccess明明是一个空接口,它能做什么呢?通过源码我们可以知道,RandomAccess是用来识别子类是否实现接口的。如果实施,它将遵循实施的逻辑。如果不实现,就会遵循不实现的逻辑,所以我们在日常开发中也可以使用这个特性。当我们有不同的子类需要根据情况实现不同的实现逻辑时,我们可以定义一个空接口来标记,方便后续处理。静态方法与默认方法相同。JDK8还支持向接口添加静态方法。虽然在接口中定义静态方法并不常见,但在需要的时候可以支持,避免创建单独的工具类,就像在类中定义静态方法一样,我们可以直接通过接口名来引用静态方法。当然静态变量也是可以的,使用方法也是一样的。publicinterfaceITestextendsSerializable,RandomAccess{publicabstractStringsayHello();字符串sayHello2();默认字符串sayHello3(){System.out.println(sayHello4());返回“你好3”;}publicstaticStringsayHello4(){返回“hello4”;}}私有方法大家有没有注意到上面的默认方法和静态方法其实都是publicpublic的,可以直接被实现类或者其他类使用。是否可以在界面中定义一个?私有方法呢?在JDK9之前是不行的,但是JDK9支持了,如下图}privatestaticvoidprivateStaticMethod(){System.out.println("private私有静态方法被调用");从官方文档中,我们可以找到如下描述。在JDK9中,接口支持私有方法,主要用于在不同的非抽象方法中共享代码。我们可以看到在JDK9中是可以这样写的,但是在JDK8中是不行的,无法编译,会提示不允许使用private修饰符。小结今天阿粉给大家总结一下接口的使用方法。后来在日常开发中,我们不仅在接口中定义抽象方法,还可以根据需求,需要使用标签的时候,添加默认方法或者私有方法。也可以通过定义一个空接口来实现。不是很好吗?随意移动。
