接口使用的注意事项及重要特点

使用接口中的注意事项及重要特点

继承父类并实现多个接口

使用接口的时候,需要注意:

  1. 接口是没有静态代码块或者构造方法的。

    public class Demo01Interface {
    }
    
    public interface MyInterface {
        // 错误写法!接口不能有静态代码块
    //    static {
    //
    //    }
    
        // 错误写法!接口不能有构造方法
    //    public MyInterfaceA() {
    //
    //    }
    }
    
  2. 一个类的直接父类是唯一的,但是一个类可以同时实现多个接口。

    格式:
    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方法");
        }
    
    }
    
    
  3. 如果实现类所实现的多个接口当中,存在重复的抽象方法,那么只需要覆盖重写一次即可。

    //例:
    
    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接口都有的抽象方法");
        }
    
    }
    
  4. 如果实现类没有覆盖重写所有接口当中的所有抽象方法,那么实现类就必须是一个抽象类。

    //例:
    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() {
    
        }
    }
    
  5. 如果实现类所实现的多个接口当中,存在重复的默认方法,那么实现类一定要对冲突的默认方法进行覆盖重写。

    //例:
    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("对多个接口当中冲突的默认方法进行了覆盖重写");
        }
    }
    
  6. 一个类如果直接父类当中的方法,和接口当中的默认方法产生了冲突,优先用父类当中的方法。

    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();
        }
    
    }
    

接口之间的多继承

  1. 类与类之间是单继承的。直接父类只有一个。

  2. 类与接口之间是多实现的。一个类可以实现多个接口。

  3. 接口与接口之间是多继承的。

    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() {
    
        }
    }
    

【注意事项】:

  1. 多个父接口当中的抽象方法如果重复,没关系。

  2. 多个父接口当中的默认方法如果重复,那么子接口必须进行默认方法的覆盖重写,【而且带着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() {
        
        }
    
    }
    
上一篇:node 爬虫


下一篇:Java中,抽象类(abstract)