欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

接口

程序员文章站 2022-06-13 19:17:42
...

接口

接口就是一种公共的规范标准,只要符合规范标准,大家就能通用。

一、接口定义的基本格式

  1. 接口是多个类的公共规范
  2. 接口是一种引用数据类型,最重要的内容就是其中的抽象方法。
  3. public interfaces name{ }

备注:换成了interface后,编译生成的字节码文件也是.class

接口中可以包含的内容有:常量、抽象方法(java 7) 默认方法、静态方法(java 8) 私有方法(java 9)

public  interface Demo{
    
}

二、接口中的抽象方法定义

  • 在任何版本的jdk中都能定义抽象方法。
  • 抽象方法格式: public abstract 返回值 methodName();

注意事项:

  1. 接口当中的抽象方法,修饰符必须是两个固定的关键字,public abstract.
  2. 这两个关键字可以选择性省略。
  3. 方法的三要素,可以随意选择。
public  interface InterfaceDemo{
    public abstract void methodAbs1();
    public abstract void methodAbsb();
    void methodAbsa();
}

三、接口使用步骤

  • 接口不能直接使用,必须有一个实现类实现该接口。

  • 接口的实现类必须重写,接口的所有抽象方法。

  • 创建实现类的对象,进行使用。

    注意事项:

    如果实现类没有重写所有的接口抽象方法,那么实现类必须是抽象类

public  class InterfaceDemoImpl implements InterfaceDemo{
    public void methodAbs1(){};
    public void methodAbsb(){};
    public void methodAbsa(){};
   
}

四、接口的默认方法定义

java 8 开始,接口里允许定义默认方法

**格式:**public default 返回值类型 methodName(){}

**备注:**解决接口升级问题

//接口
public  interface InterfaceDemo{
    public abstract void methodAbs1();
    public abstract void methodAbsb();
    void methodAbsa();
}

//实现类A
public  class InterfaceDemoImplA implements InterfaceDemo{
    public void methodAbs1(){};
    public void methodAbsb(){};
    public void methodAbsa(){};
    
   
}
//实现类B
public  class InterfaceDemoImplB implements InterfaceDemo{
    public void methodAbs1(){};
    public void methodAbsb(){};
    public void methodAbsa(){};
   
    }
   
}

**本来已经写好接口和实现类。因为某种原因,接口中新增了新的抽象方法。则实现类会出错。**为了保证接口更改而不影响实现类,则使新增的抽象带有默认的方法体,即默认方法。

五、默认方法的使用

public  interface InterfaceDemo{
    public abstract void methodAbs1();
    public abstract void methodAbsb();
    void methodAbsa();
    //新添加的默认方法
    public default void methodDefault(){
        System.out.println("默认方法");
    }
}

默认方法会被实现类继承下去。

public  class InterfaceDemoImpl implements InterfaceDemo{
    public void methodAbs1(){};
    public void methodAbsb(){};
    public void methodAbsa(){};
     
}

public class Demo {
     public static void main(String[] args){
        interfaceDemoImpl interfaceDemo = new interfaceDemoImpl();
        interfaceDemo.methodAbs1();
         interfaceDemo.methodDefault();//--》默认方法
    }
}
  1. 接口的默认方法,可以被实现类继承

  2. 接口的默认方法,可以被实现类覆盖重写

六、接口的静态方法定义和使用

1.定义

java 8开始,接口中允许定义静态方法

格式:public static 返回值类型methodName(参数列表){方法体}

2.使用

静态和对象没有关系,和类(接口)有关系

public interface MyinterfaceStatic{
    public static void methodStatic(){
         System.out.println("静态方法");
    }
}

public class MyinterfaceStaticImpl implement MyinterfaceStatic{
    
    
}
public class Demo3Interface{
    MyinterfaceStaticImpl impl=new MyinterfaceStaticImpl();
    //通过接口名称调用静态方法
    MyinterfaceStatic.methodStatic();
}

七、接口中的私有方法定义和使用

(一)定义

问题描述:默认方法中有重复代码,抽离出来之后,又不想让实现类访问抽离出来的方法。

解决方法:java9开始允许定义私有方法

普通私有方法,解决多个默认方法之间有重复代码问题

格式:private 返回值类型 methodName(参数列表){}

**静态私有方法,**解决多个静态方法之间重复代码的问题。

格式:private static 返回值类型 methodName(参数列表){}

public interface MyInterfacePrivateA{
    public default void methodDefault1(){
        System.out.println("default方法1");
        // System.out.println("重复代码");
      methodDefault3();
        
    }
     public default void methodDefault2(){
        System.out.println("default方法2");
          //System.out.println("重复代码");
         methodDefault3();
    }
     private  void methodDefault3(){
                System.out.println("重复代码");
    }
    //修改带有重复代码的方法,让其调用私有方法即可
}

(二)使用

public class  MyInterfacePrivateAImpl implements  MyInterfacePrivateA{
     MyInterfacePrivateAImpl impl=new  MyInterfacePrivateAImpl();
}
静态方法
public interface MyInterfacePrivateA{
    public static void methodStatic1(){
        System.out.println("default方法1");
        // System.out.println("重复代码");
        methodStatic3();
    }
     public static void methodStatic2(){
        System.out.println("default方法2");
         // System.out.println("重复代码");
         methodStatic3();
    }
     private  static void methodStatic3(){
                System.out.println("重复代码");
    }
    //修改带有重复代码的方法,让其调用私有方法即可
}

八、接口的常量定义和使用

接口当中也可以定义成员变量,但是必须使用 public static final 三个关键字修饰,[这三个关键字可以省略]从效果上看,这其实就是接口的常量。

**格式:**public static final Datatype Name = value;

注意事项:

  1. public static final 这三个关键字可以省略。
  2. 接口中的常量必须进行赋值。
  3. 接口中常量必须大写,下划线分割
public interface MyInterfaceConst{
    public static final int NUM=0;
}
public class Demo{
    public statci void main(String [] args){
       int i= MyInterfaceConst.NUM;
    }
}

九、接口内容小结

java 9 +版本:

1.成员变量其实是常量。

2.接口中最重要的是抽象方法,格式 public abstract 返回值类型 名称(参数列表);

3.java 8 开始有默认方法。可以被覆盖重写,public default 返回值类型 名称(参数列表){方法体}

4…java 8 开始有静态方法。public static 返回值类型 名称(参数列表){方法体},通过接口调用。

5.java 9开始允许定义私有方法,private static/空 返回值类型 名称(参数列表){方法体}

注意:

  1. 接口 没有静态代并且接口不能写构造方法
  2. 一个类的父类是唯一的,但是可以同时实现多个接口。class Demo implements Interface A,InterfaceB{}
  3. 如果实现类实现的多个接口中有重复的抽象方法,则只需要实现一次。
  4. 如果实现类没有覆盖重写所有接口中的抽象方法,则实现类必须是抽象类。
  5. 如果实现类实现的多个接口中有重复的默认方法,则实现类必须对默认方法进行重写。
  6. 一个类如果直接父类当中的方法,和接口当中的方法产生了冲突,则使用父类当中的方法(继承优先于接口)。

十、类和接口之间的关系

  • 类与类之间是单继承的,直接父类只有一个。
  • 类与接口之间是多实现的,一个类可以实现多个接口。
  • 接口与接口之间是多继承的:public interface InterfaceC extends InterfaceA, InterfaceB{ }。

注意事项:

  1. 多个父接口的抽象方法如果重复,没有影响
  2. 多个父接口当中的默认方法如果重复,那么子接口必须进行默认方法的重写,而且带着default关键字。