特性

  • 接口中的所有方法和变量都被隐式的声明为public;
  • 接口中的变量被隐式的声明为(public static final);
  • 如果类实现了某个接口,但是没有实现该接口的全部方法,那么该类必须定义为abstract;
  • 一个类可以实现多个接口
  • 如果一个类实现了一个接口,但是没有实现接口的全部方法,那么该类必须定义为abstract
  • 可以将接口声明为某个类或另外一个接口的成员,这种接口被称为成员接口或嵌套接口
  • 接口可以继承另外一个接口
  • 在接口中无法拥有实例变量;接口指定行为,而不是状态;
  • 如果一个类继承了一个父类且实现了一个接口,而且从接口和父类两者继承了相同的方法,只关心父类的方法,直接忽视接口的默认方法;
  • JAVA8允许在接口中定义静态方法;但是这种做法违背将接口作为抽象规范的初衷;
  • 接口里定义的内部类、内部接口、内部枚举默认都采用public static修饰符;

嵌套接口

  • 可以将接口声明为某个类或另一个接口的成员,这种接口被称为成员接口或嵌套接口

接口的多级继承

如果接口A和B同时提供了eat()默认方法,而类C同时实现了A和B两个接口:

  • 如果类C重写了eat()方法,则使用类C的eat()方法;
  • 如果类C没有重写eat()方法,则会发生错误;
  • 如果B继承了A接口,并都提供了默认的eat()方法,则B的eat方法具有更高的优先级
  • 显示引用被继承接口的默认方法:
    InterfaceName.super.methodName()
    

接口多级继承规则

如果MyClass类实现了Alpha和Beta接口,且两个接口都提供了名为reset()的方法的默认实现:

接口的静态方法

JDK8支持在接口中定义一个或多个静态方法,接口定义的静态方法可以独立于任何对象调用,与类的静态方法调用一样(JDK8新特性)
调用:interfaceName.staticMethodName

public interface InterfaceDemo {
    public static void say() {
        System.err.println("hello,world");
    }
}

接口默认方法

  • 默认方法的重要用法是"接口演化"
  • 接口的默认方法实现(JDK8新特性)
    interface Person {
      void say();
      default String eat() {
          return "eat";
      }
    }
    
  • 默认方法的一个重要用途是接口演化(如果在Collection接口中添加一个stream方法,如果接口没有提供默认方法实现,现有实现类均会报错);给接口添加一个非默认方法会导致源代码不兼容;

常用接口

  • Comparable
  • Comparator
  • Runnable
  • Callable定义返回类型为T的接口

results matching ""

    No results matching ""