简单总结java抽象类与接口的区别
简单总结java抽象类与接口的区别
1、什么是抽象类?
含有abstract修饰符的class即为抽象类。
抽象类的特点:
- abstract不能创建实例对象。
- 含有abstract方法的类必须定义为abstract class,abstract class类中的方法不必都是抽象的。
- abstract class类中定义的抽象方法必须在具体子类中实现,所以不能有抽象构造方法或抽象静态方法。如果子类没有实现抽象父类中的所有抽象方法,那么子类也必须定义为abstract类型。
2、什么是接口?
接口(interface)是抽象方法的集合,也可以理解为是抽象类的一种特例,接口中的所有方法都必须是抽象的。
接口的特点:
- 允许在接口中定义static方法和default方法 (JDK8及以后)
- 接口接口中的方法定义默认为public abstract类型,接口中的成员变量类型默认为public static final。
- 如果一个类实现了某个接口,那么它就继承了这个接口的抽象方法,必须保证使用并实现这些方法。
3.、抽象类和接口的比较
参数 | 抽象类 | 接口 |
---|---|---|
默认的方法实现 | 可以有默认的方法实现 | 完全抽象,根本不存在方法的实现(Java8新增了默认方法和静态方法,自行了解) |
实现方式 | 子类用extends关键字来继承抽象类,如果子类不是抽象类的话,它需要实现父级抽象类中所有抽象方法,父类中非抽象方法可重写也可不重写 | 子类用implements去实现接口,需要实现接口中所有方法 |
构造器 | 抽象类可以有构造器(但是!!构造器不能用abstract修饰) | 接口不能有构造器 |
与正常Java类的区别 | 正常Java类可被实例化,抽象类不能被实例化 | 接口和正常java类是不同的类型 |
访问修饰符 | 抽象方法可以用public、protected、default修饰 | 接口默认是public、不能用别的修饰符去修饰 |
main方法 | 抽象类中可以有main方法,可以运行它 | 接口中不能有main方法,因此不能运行它 |
多继承 | 抽象类可继承一个类和实现多个接口 | 接口只能继承一个或者多个接口 |
速度 | 抽象类比接口速度快 | 接口稍微慢点,因为它需要去寻找类中实现的它的方法 |
添加新方法 | 如果在抽象类中添加新非abstract的方法,可以直接添加,因为非abstract方法无需在子类中实现,如果是abstact方法,就算需要改变子类的代码,也要实现这个方法 | 只要在接口中添加方法,实现它的类就要改变,去实现这个新添加的方法 |
4、小结
抽象类和接口的应用场景
- 如果原本拥有一些方法,并想让他们中的一些有默认的具体实现,就使用抽象类
- 如果想实现多重继承,可以使用接口,因为java不支持子类继承多个类,但允许一个类可以实现多个接口,因此可以使用接口来解决。
- 如果基本功能在不断变化,那么就使用抽象类,如果使用接口,那么每次变更都需要相应的去改变实现该接口的所有类。