抽象类 | 接口 | |
---|---|---|
实例化 | 不能 | 不能 |
定义 | 包含抽象方法的类 | 方法和静态常量的集合 |
组成 | 构造函数、抽象方法、普通方法、常量、变量 | 方法、静态常量 |
使用 | 子类继承抽象类(extends); 如果子类不是抽象类,它需要提供抽象类中所有声明的方法的实现。 | 子类实现接口(implements); 实现类需要提供接口中所有声明的方法的实现。 |
关系 | 抽象类可以继承一个类和实现多个接口 | 接口不能继承抽象类,但可以继承多个接口 |
局限 | 只允许单继承 | 接口没有限制 |
变量 | 可以有普通变量 | 只能是公共的静态的常量(默认public static final) |
构造器 | 可以有构造器 | 不能有构造器 |
访问修饰符 | 抽象方法可以有public、protected和default这些修饰符 不能用private、final、static修饰符 | 接口方法默认修饰符是public |
添加新方法 | 如果往抽象类中添加新的方法,可以给它提供默认的实现,而不需要改变现有的代码。 | 如果往接口中添加方法,那么必须改变实现该接口的类。 |
通俗的讲,认为是要变化的东西,就放在实现中,不能放在接口中去,接口只是对一类事物的属性和行为更高层次的抽象。对修改关闭,对扩展(不同的实现implements)开放,接口是对开闭原则的一种体现。
所以接口的中的变量必须是公共的静态的常量(public static final)。
Java8中接口可以有默认函数:
interface Formula {
default double sqrt(int a) {
return Math.sqrt(a);
}
}