一, 接口
1. 接口简介
接口: 是 java 的一种抽象类型, 是抽象方法的集合. 接口比抽象类更加抽象的抽象类型.
接口语法:
[修饰符] [abstract] interface 接口名 [extends 父接口名列表]{
[public] [static] [final] 常量;
[public] [abstract] 方法;
[public] [static] 方法 {};//JDK1.8 后
[public] [static] 类 / 接口;
}
2. 接口成员的修饰符
接口中的所有成员的访问权限默认强制是 public
变量: 默认强制是
public static final
方法: 默认强制是 public abstract, 即抽象方法. 但 JDK1.8 后, 允许定义静态方法 public static, 接口存在非抽象方法;
内部类 / 接口: 默认强制是 public static
下面例子中的接口中定义了各种接口成员:
- public interface InterfaceTest {
- int a = 10;// 全局变量默认强制是 public static final
- public static void staticMethod() { // 静态方法, JDK1.8 下编译通过
- System.out.println("");
- }
- int abstractMethod(); // 抽象方法
- public static abstract class InnerClass{// 抽象内部类, 默认强制 public static
- //......
- }
- enum MyEnum{RED,BLUE,GRREN} // 枚举类, 默认强制 public static
- interface InnerInteerface{ // 嵌套接口, 默认强制 public static
- void aa();
- }
- }
- class MyClass implements InterfaceTest{// 实现上面的接口
- @Override
- public int abstractMethod() {// 实现抽象方法
- return 0;
- }
- }
注意一下, 实现接口并不需要实现接口里面的内部抽象类成员, 或者嵌套接口成员;
3. 接口的多继承
接口是可以继承多个接口 (在类中, 是不允许多继承的). 由于接口的实例成员方法都是抽象方法, 所以多继承不会对接口造成太大影响 (不同父接口可以定义相同的方法), 但还是有一点要注意的,** 多继承接口时, 从父接口继承下来的方法, 有相同的方法名, 但不满足方法重载的条件, 就会冲突.** 如果出现这种情况, 编译将失败, 不允许多继承.
- interface A{
- void sameMethodA();
- }
- interface B{
- void sameMethodA();
- void sameMethodB(int a);// 返回类型是 void
- }
- interface C{
- int sameMethodB(int a);// 返回类型是 int
- }
- interface D extends A,B{ // 编译通过, 即使 A,B 定义了相同方法
- }
- interface E extends B,C{// 编译失败
- }
字接口 D 多继承父接口 A,B 成功, 但子接口 E 却多继承父接口 B,C 失败, 就是因为两个接口定义的 sameMethodB() 除了返回类型外, 方法名, 参数列表都一样, 这不满足方法重载, 导致继承时方法冲突.
如果非得要多继承, Java 的解决方案是使用 内部类或嵌套接口;
4. 接口与抽象类的区别
接口与抽象类的区别:
抽象级别不一样: 接口更加抽象, JDK1.8 前只允许抽象方法, JDK1,8 后才允许存在静态方法; 抽象类的抽象基本低, 允许存在具体方法, 甚至抽象类中可以没有抽象方法. 但有抽象方法的类就必须是抽象类;
接口对成员的定义时的修饰符都有固定的限制, 参考前面; 抽象类定义成员与普通类是一样的;
接口中不允许定义初始化块 (静态或实例), 但抽象类允许定义这两种初始化块;
接口中不能定义构造方法, 但抽象类允许定义构造方法.
补充: 抽象类中的抽象方法的访问权限是不能是 private.
二, 嵌套接口
嵌套接口: 就是定义在类或接口中的接口.
嵌套接口的修饰符限制:
不论定义在接口, 还是类中, 嵌套接口默认强制是 static. 这意味着, 嵌套接口是没有局部的嵌套接口.
接口定义在类中, 可以使用四种访问权限, 定义在接口种, 则只有 public
出处: http://www.cnblogs.com/jinggod/p/8503146.html 文章有不当之处, 欢迎指正, 你也可以关注我的微信公众号: 好好学 java, 获取优质学习资源.
来源: https://juejin.im/post/5ae45e33f265da0b722ae23c