`n
在NET/" style="text-decoration: none; color: inherit;" title="NET">NET/" style="text-decoration: none; color: inherit;" title="java">java 8及其后续版本中,接口可以包含默认方法,允许开发人员在接口中定义实现代码。这种方法避免了在实现类中重复编写代码,提高了代码的可维护性。默认方法通过`default`关键字实现,并且可以被实现该接口的类覆写,从而获得灵活性。
接口的定义形式如下:
```NET/" style="text-decoration: none; color: inherit;" title="NET">NET/" style="text-decoration: none; color: inherit;" title="java">javapublic interface MyInterface { default void myDefaultMethod() { System.out.println("这是默认方法"); }}```
在这个示例中,`myDefaultMethod`是一个默认方法,任何实现`MyInterface`的类都可以直接调用此方法,或者选择重写这个方法来提供特定的实现。
实现接口的类可以选择是否重写默认方法。如果决定重写,可以像重写任何其他方法一样实现。例如:
```NET/" style="text-decoration: none; color: inherit;" title="NET">NET/" style="text-decoration: none; color: inherit;" title="java">javapublic class MyClass implements MyInterface { @Override public void myDefaultMethod() { System.out.println("重写了默认方法"); }}```
通过这种方式,`MyClass`中的`myDefaultMethod`会优先于`MyInterface`中定义的默认实现。
接口中的默认方法可以包含具体的逻辑和调用其他方法,增强了接口的灵活性。可以使多个实现类共享相同的行为,减少了代码重复。例如,多个实现类可能需要相同的计算方法,可以在接口中定义该计算方法为默认实现。
如果多个接口中定义了同名的默认方法,类实现这些接口时需要指明使用哪个接口的方法。这就需要使用`super`关键字显式调用所需的接口。
```NET/" style="text-decoration: none; color: inherit;" title="NET">NET/" style="text-decoration: none; color: inherit;" title="java">javapublic interface InterfaceA { default void show() { System.out.println("来自接口A"); }}public interface InterfaceB { default void show() { System.out.println("来自接口B"); }}public class MyClass implements InterfaceA, InterfaceB { public void show() { InterfaceA.super.show(); // 使用接口A的方法 }}```
在这个例子中,`MyClass`实现了两个接口,并决定使用`InterfaceA`中的`show`方法。
值得注意的是,默认方法的引入,使得接口的设计更加灵活,有效支持接口的演进而不影响实现类。这种特性尤其在大型系统中更为重要,可以减少向后兼容的风险,从而提高代码的可重用性。
默认方法是NET/" style="text-decoration: none; color: inherit;" title="NET">NET/" style="text-decoration: none; color: inherit;" title="java">java在面向对象编程中引入一个强大特性,通过这种方式,可以在接口中灵活地提供实现,同时保持了多态性和可扩展性,极大程度上提高了开发的效率。