通过abstract来定义抽象类,通过interface关键字来定义接口。
// 这是一个抽象类
abstract class Animal{
}
// 这是一个接口
interface Animal{
}
区别:
- 抽象类中可以没有抽象方法,也可以抽象方法和非抽象方法共存
优点:如果在抽象类中加入一个新方法,那么该抽象类的子类会全部得到这个新方法,
如果在接口中加入新方法,所有实现该接口的子类会编译报错,因为需要让每个子类再次实现该方法。
- 抽象类和类一样是单继承的;接口可以实现多个父接口
对比:一个抽象类的实现只能由这个抽象类的子类给出,所以抽象类作为类型定义工具的效能大打折扣。
子类能够同时实现多个接口,所以接口作为类型定义工具效能比较高。
结合:“缺省适配模式”。应用场景:子类不用实现接口的所有方法。方法:定义接口-》抽象类继承该接口-》子类实现抽象类的所需方法。
- 抽象类中可以存在普通的成员变量;接口中的变量必须是static final类型的,必须被初始化,接口中只有常量,没有变量
- 接口中的方法在JDK8之前只能是抽象的,JDK8版本开始提供了接口中方法的default实现
```
public interface MyInterface {
// 定义一个已经实现的方法,使用default表明
default void say(String message){
System.out.println("Hello "+message);
}
// 普通的抽象方法
void test();
}
class MyClass implements MyInterface{
@Override
public void test() {
System.out.println("test...");
}
}
class Main{
public static void main(String[] args) {
MyClass client = new MyClass();
client.test();
client.say("World...");
}
}
```
注:实现类实现两个具有相同方法的接口时,会报错,解决办法:1.实现类重写该方法。2.
在实现类中指定要使用哪个接口中的默认方法。