#### 特性
* 接口中的所有方法和变量都被隐式的声明为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\(\)的方法的默认实现:![](../assets/interface.png)
#### 接口的静态方法
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的接口
- java演变
- JDK各个版本的新特性
- JDK1.5新特性
- JDK1.6新特性
- JDK1.7新特性
- JDK1.8新特性
- JAVA基础
- 面向对象特性
- 多态
- 方法重载
- 方法重写
- class
- 常量
- 访问修饰符
- 类加载路径
- java-equals
- 局部类
- java-hashCode
- Java类初始化顺序
- java-clone方法
- JAVA对象实例化的方法
- 基础部分
- JAVA基础特性
- JAVA关键字
- javabean
- static
- 日期相关
- final
- interface
- 函数式接口
- JAVA异常
- 异常屏蔽
- try-with-resource资源泄露
- JAVA引用
- WeakReference
- SoftReference
- PhantomReference
- 位运算符
- try-with-resource语法糖
- JDK冷知识
- JAVA包装类
- JAVA基本类型与包装类
- java.lang.Boolean
- java.lang.Integer
- java.lang.Byte
- java.lang.Short
- java.lang.Long
- java.lang.Float
- java.lang.Double
- java.lang.Character
- 日期相关
- TemporalAdjusters
- String
- 字符串常量池
- String拼接
- String编译期优化
- StringBuilder&StringBuffer
- intern
- 注解
- java标准注解
- 内置注解
- 元注解
- 自定义注解
- 注解处理器
- JVM注解
- Java8 Annotation新特性
- 反射-Reflective
- Reflection
- Class
- Constructor
- Method
- javabean-property
- MethodHandles
- 泛型
- 类型擦除
- bridge-method
- Accessor&Mutator方法
- enum
- JAVA数组
- finalize方法
- JAR文件
- JAVA高级编程
- CORBA
- JMX
- SPI
- Java SPI使用约定
- ServiceLoader
- 实际应用
- IO
- 工具类
- JDK常用工具类
- Objects
- System
- Optional
- Throwable
- Collections
- Array
- Arrays
- System
- Unsafe
- Number
- ClassLoader
- Runtime
- Object
- Comparator
- VarHandle
- 数据结构
- 栈-Stack
- 队列(Queue)
- Deque
- PriorityQueue
- BlockingQueue
- SynchronousQueue
- ArrayBlockingQueue
- LinkedBlockingQueue
- PriorityBlockingQueue
- ConcurrentLinkedQueue
- 列表
- 迭代器
- KV键值对数据类型
- HashMap
- TreeMap
- Hash冲突
- ConcurrentHashMap
- JDK1.7 ConcurrentHashMap结构
- jdk7&jdk8区别
- 集合
- Vector
- Stack
- HashSet
- TreeSet
- ArrayList
- LinkedList
- ArrayList && LinkedList相互转换
- 线程安全的集合类
- 集合类遍历性能
- 并发容器
- CopyOnWriteArrayList
- ConcurrentHashMap
- 同步容器
- BitMap
- BloomFilter
- SkipList
- 设计模式
- 设计模式六大原则
- 单例模式
- 代理模式
- 静态代理
- 动态代理
- JDK动态代理
- cglib动态代理
- spring aop
- 策略模式
- SpringAOP策略模式的运用
- 生产者消费者模式
- 迭代器模式
- 函数式编程
- 方法引用
- 性能问题
- Lambda
- Lambda类型检查
- Stream
- findFirst和findAny
- reduce
- 原始类型流特化
- 无限流
- 收集器
- 并行流
- AOP
- 静态织入
- aspect
- aspect的定义
- AspectJ与SpringAOP
- 动态织入
- 静态代理
- 动态代理
- JDK动态代理
- CGLib动态代理
- Spring AOP
- SpringAOP五种通知类型
- @Before
- @AfterReturning
- @AfterThrowing
- @After
- @Around
- Aspect优先级
- SpringAOP切点表达式
- within
- execution
- 嵌套调用
- 系统优化与重构
- 重叠构造器模式
- 工具类构造器优化
- 常见面试题
- new Object()到底占用几个字节
- 访问修饰符
- cloneable接口实现原理
- 异常分类以及处理机制
- wait和sleep的区别
- 数组在内存中如何分配
- 类加载为什么要使用双亲委派模式,有没有什么场景是打破了这个模式
- 类的实例化顺序
- 附录
- JAVA术语
- FAQ
- 墨菲定律
- 康威定律
- 软件设计原则
- 阿姆达尔定律
- 字节码工具
- OSGI