一、定义
1.抽象类
含有abstract修饰符的类·即为抽象类,abstract 类不能创建实例对象。含有abstract方法的类必须定义为抽象类,抽象类中的方法不必是抽象的。抽象类中定义抽象方法必须在具体(Concrete)子类中实现,所以,不能有抽象构造方法或抽象静态方法。如果的子类没有实现抽象父类中的所有抽象方法,那么子类也必须定义为abstract类型。
2.接口
接口(interface)可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的。接口中的方法定义默认为public abstract类型,接口中的成员变量类型默认为public static final。接口的实现使用的是implements关键字。
二、区别
参数 | 抽象类(abstract) | 接口(interface) |
---|---|---|
默认的方法实现 | 可以进行默认的方法实现 | 接口完全是抽象的,不存在方法的实现 |
实现 | 子类使用extends关键字来继承抽象类,如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法的实现。 | 子类使用关键字implements来实现接口。它需要提供接口中所有声明的方法的实现 |
构造器 | 抽象类可以有构造器 | 接口不能有构造器 |
访问修饰符 | 抽象方法可以有public、protected和default这些修饰符 | 接口方法默认修饰符是public,你不可以使用其它修饰符;接口中的方法定义默认为public abstract类型,接口中的成员变量类型默认为public static final |
多继承 | 抽象方法可以继承一个类和实现多个接口 | 接口只可以继承一个或多个其它接口 |
创建对象 | 不能实例化对象 | 不能实例化对象 |
与正常Java类的区别 | 除了不能实例化抽象类之外,它和普通Java类没有任何区别 | Java中,接口和类是并列的两个结构 |
main方法 | 抽象方法可以有main方法并且我们可以运行它 | 接口没有main方法,因此我们不能运行它。(java8以后接口可以有default和static方法,所以可以运行main方法) |
速度 | 它比接口速度要快 | 接口比抽象类,因为它需要时间去寻找在类中实现的方法。 |
添加新方法 | 如果你往抽象类中添加新的方法,你可以给它提供默认的实现。因此你不需要改变你现在的代码 | 如果你往接口中添加方法,那么你必须在该接口的实现类中重写该方法 |