接口不能创建对象,但是可以被实现(`implements` ,类似于被继承)。一个实现接口的类(可以看做是接口的子类),需要实现接口中所有的抽象方法,创建该类对象,就可以调用方法了,否则它必须是一个抽象类。

 

接口:是功能的集合(接口中定义的都是方法)

定义接口使用的也是.java文件;编译生成的也是.class文件

定义接口使用关键字interface

修饰符 interface 接口名 {

   抽象方法;

   默认方法; (JDK8以后新增)

   静态方法; (JDK8以后新增)

}

 

接口的使用:

   1.接口不能创建对象使用

  2.可以定义一个实现类,实现(继承)接口,重写接口中的抽象方法,创建实现类对象使用

 

抽象方法:没有方法体,被abstract修饰的方法

  默认的修饰符public abstract可以省略

   public abstract 返回值类型 方法名(参数);

 

    注意:
      接口中的抽象方法修饰符是可以省略不写,不写默认也是public abstract

      建议写出,增强阅读性

public interface MyInter {
    //定义抽象方法
    public abstract void show01();

    public abstract int show02();

    void show03(String s);
}

 

  定义接口的实现类

    使用格式:使用类实现接口,重写接口中的抽象方法

      public class 实现类名 implements 接口{

        重写接口中的抽象方法;

      }


    注意:

      实现类似于继承,类实现接口,就可以继承接口中的所有非私有的成员

public class MyInterImpl implements MyInter{
    @Override
    public void show01() {
        System.out.println("实现类重写接口中的show01抽象方法!");
    }

    @Override
    public int show02() {
        System.out.println("实现类重写接口中的show02抽象方法!");
        return 0;
    }

    @Override
    public void show03(String s) {
        System.out.println("实现类重写接口中的show03抽象方法!"+s);
    }
}

 

 

public class Demo01MyInter {
    public static void main(String[] args) {
        //接口不能创建对象使用 'MyInter' is abstract; cannot be instantiated
        //MyInter mi = new MyInter();

        //创建接口的实现类对象
        MyInterImpl my = new MyInterImpl();
        my.show01();
        my.show02();
        my.show03("赵四");
    }
}

 

 

默认方法

    定义格式:

      修饰符 default 返回值类型 方法名(参数){

        方法体;

      }

 

      注意:

        默认方法的修饰符default不能省略

public interface MyInter {
    public default void show01(){
        System.out.println("MyInter接口中的默认show01方法");
    }

    public default  void show02(){
        System.out.println("MyInter接口中的默认show02方法");
    }
}

 

 

    1. 含有默认方法的接口的使用:定义实现类,实现接口,选择性的重写默认方法,创建实现类对象使用
    2. 重写了默认方法:使用实现类重写后的方法
    3. 没有重写默认方法:使用继承自接口中的默认方法

    注意:

      实现类重写接口中的默认方法,去掉default修饰符

 

public class MyInterImpl implements MyInter{
    @Override
    public void show01() {
        System.out.println("实现类重写了MyInter接口中的show01默认方法");
    }
}

 

 

public class Demo01MyInter {
    public static void main(String[] args) {
       //创建接口的实现类对象
        MyInterImpl my = new MyInterImpl();
        my.show01();//实现类重写的
        my.show02();//继承自接口的
    }
}

 

 

静态方法

    定义格式:

      修饰符 static 返回值类型 方法名(参数){

        方法体

      }

      注意:

        • 定义静态方法不能省略static关键字
        • 定义含有静态方法的接口使用:
        • 静态成员属于类(接口),所以可以通过接口名.方法名(参数)直接使用

 

public interface MyInter {
    public static void show01(){
        System.out.println("MyInter接口的静态show01方法");
    }

    public static String show02(int a){
        System.out.println("MyInter接口的静态show01方法"+a);
        return "哈哈";
    }
}

 

 

public class MyInterImpl implements MyInter{
    //@Override//Method does not override method from its superclass
    public static void show01(){
        System.out.println("MyInterImpl类的静态show01方法");
    }
}

 

 

    静态方法只能使用接口名调用,不可以通过实现类的类名或者实现类的对象调用

    静态方法是不能重写的,属于类|接口本身,也不能被实现类继承使用。在实现类中定义了静态方法,属于实现类本身

public class Demo01MyInter {
    public static void main(String[] args) {
        //通过接口名.方法名(参数)调用接口中的静态方法
        MyInter.show01();
        String s = MyInter.show02(10);
        System.out.println(s);

        MyInterImpl.show01();
    }
}

 

 

接口的多实现

  语法

    class 类名 [extends 父类名] implements 接口名1,接口名2,接口名3... {

      // 重写接口中抽象方法【必须】

      // 重写接口中默认方法【不重名时可选】

    }

 

  抽象方法

    接口中,有多个抽象方法时,实现类必须重写所有抽象方法。如果多个接口中抽象方法有重名的,只需要重写一次。

 

  默认方法

    接口中,有多个默认方法时,实现类都可继承使用。如果默认方法有重名的,必须重写一次。

 

  静态方法

    接口中,存在同名的静态方法并不会冲突,原因是只能通过各自接口名访问静态方法。

 

  优先级的问题

    当一个类,既继承一个父类,又实现若干个接口时,父类中的成员方法与接口中的默认方法重名,子类就近选择执行父类的成员方法。

 

接口的多继承

  • 接口的继承使用 `extends` 关键字,子接口继承父接口的方法。如果多个父接口中的默认方法有重名的,那么子接口需要重写一次
  • 子接口重写默认方法时,default关键字可以保留。
  • 子类重写默认方法时,default关键字不可以保留。

 

其他成员的特点

  - 接口中,无法定义成员变量,但是可以定义常量,其值不可以改变,默认使用public static final修饰。

  - 接口中,没有构造方法,不能创建对象。

  - 接口中,没有静态代码块。

 

抽象类和接口

    • 一个类只能继承一个直接父类(可能是抽象类),却可以实现多个接口, 接口弥补了Java的单继承
    • ​抽象类为继承体系中的共性内容, 接口为继承体系中的扩展功能

 

posted on 2020-04-13 00:45  ⊱风之悟⊰  阅读(210)  评论(0编辑  收藏  举报

Live2D