使用接口中的注意事项及重要特点
继承父类并实现多个接口
使用接口的时候,需要注意:
-
接口是没有静态代码块或者构造方法的。
public class Demo01Interface { } public interface MyInterface { // 错误写法!接口不能有静态代码块 // static { // // } // 错误写法!接口不能有构造方法 // public MyInterfaceA() { // // } }
-
一个类的直接父类是唯一的,但是一个类可以同时实现多个接口。
格式: public class MyInterfaceImpl implements MyInterfaceA, MyInterfaceB { // 覆盖重写所有抽象方法 }
//例: public interface MyInterfaceA { public abstract void methodA(); public default void methodDefault() { System.out.println("默认方法AAA"); } } public interface MyInterfaceB { public abstract void methodB(); public default void methodDefault() { System.out.println("默认方法BBB"); } } public class MyInterfaceImpl /*extends Object*/ implements MyInterfaceA, MyInterfaceB { @Override public void methodA() { System.out.println("覆盖重写了A方法"); } @Override public void methodB() { System.out.println("覆盖重写了B方法"); } }
-
如果实现类所实现的多个接口当中,存在重复的抽象方法,那么只需要覆盖重写一次即可。
//例: public interface MyInterfaceA { public abstract void methodAbs(); } public interface MyInterfaceB { public abstract void methodAbs(); } public class MyInterfaceImpl /*extends Object*/ implements MyInterfaceA, MyInterfaceB { @Override public void methodAbs() { System.out.println("覆盖重写了AB接口都有的抽象方法"); } }
-
如果实现类没有覆盖重写所有接口当中的所有抽象方法,那么实现类就必须是一个抽象类。
//例: public interface MyInterfaceA { public abstract void methodA(); public abstract void methodAbs(); } public interface MyInterfaceB { public abstract void methodB(); public abstract void methodAbs(); } //假如不覆盖重写methodB(),那么该类就必须是abstract抽象类 public abstract class MyInterfaceAbstract implements MyInterfaceA, MyInterfaceB { @Override public void methodA() { } @Override public void methodAbs() { } }
-
如果实现类所实现的多个接口当中,存在重复的默认方法,那么实现类一定要对冲突的默认方法进行覆盖重写。
//例: public interface MyInterfaceA { public default void methodDefault() { System.out.println("默认方法AAA"); } } public interface MyInterfaceB { public default void methodDefault() { System.out.println("默认方法BBB"); } } public abstract class MyInterfaceAbstract implements MyInterfaceA, MyInterfaceB { @Override public void methodDefault() { } } public class MyInterfaceImpl /*extends Object*/ implements MyInterfaceA, MyInterfaceB { @Override public void methodDefault() { System.out.println("对多个接口当中冲突的默认方法进行了覆盖重写"); } }
-
一个类如果直接父类当中的方法,和接口当中的默认方法产生了冲突,优先用父类当中的方法。
public class Fu { public void method() { System.out.println("父类方法"); } } public class Zi extends Fu implements MyInterface { } public interface MyInterface { public default void method() { System.out.println("接口的默认方法"); } } public class Demo01Interface { public static void main(String[] args) { Zi zi = new Zi(); zi.method(); } }
接口之间的多继承
-
类与类之间是单继承的。直接父类只有一个。
-
类与接口之间是多实现的。一个类可以实现多个接口。
-
接口与接口之间是多继承的。
public interface MyInterfaceA { public abstract void methodA(); public abstract void methodCommon(); } public interface MyInterfaceB { public abstract void methodB(); public abstract void methodCommon(); } /* 这个子接口当中有几个方法?答:4个。 methodA 来源于接口A methodB 来源于接口B methodCommon 同时来源于接口A和B method 来源于我自己 */ public interface MyInterface extends MyInterfaceA, MyInterfaceB { public abstract void method(); } //证明如下: public class MyInterfaceImpl implements MyInterface { @Override public void method() { } @Override public void methodA() { } @Override public void methodB() { } @Override public void methodCommon() { } }
【注意事项】:
-
多个父接口当中的抽象方法如果重复,没关系。
-
多个父接口当中的默认方法如果重复,那么子接口必须进行默认方法的覆盖重写,【而且带着default关键字】。
public interface MyInterfaceA { public abstract void methodA(); public abstract void methodCommon(); public default void methodDefault() { System.out.println("AAA"); } } public interface MyInterfaceB { public abstract void methodB(); public abstract void methodCommon(); public default void methodDefault() { System.out.println("BBB"); } } public interface MyInterface extends MyInterfaceA, MyInterfaceB { public abstract void method(); @Override public default void methodDefault() { } }