抽象类、接口的区别和应用场景
抽象类、接口的区别和应用场景
抽象类的应用场景:
描述一类事物的时候,发现该事物确实存在着某种行为,但是目前该行为是不具体的,那么这时候我们应该抽取该方法的声明,不去实现该方法,这时候我们应该使用抽象类。
抽象类的特点:
- 如果一个方法没有方法体,那么该方法必须使用abstract修饰。抽象方法的声明格式为:
abstract void fun();
- 如果一个类有抽象的方法,那么该类也必须在类前使用abstract关键字修饰。
- 抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法),缺省情况下默认为public。
- 非抽象类继承抽象类的时候,必须要把抽象类中的所有抽象方法全部实现。
- 抽象类可以定义抽象方法以及非抽象方法。
- 抽象类是可以不存在抽象方法的。
- 抽象类不能创建对象(不能被实例化)。
- 抽象类中的抽象方法要被使用,必须由子类复写所有的抽象方法后,建立子类对象调用。
- 如果一个类继承于一个抽象类,则子类必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类
- 抽象类是存在构造方法的。
疑问: 1、 为什么抽象类不能创建对象呢?
因为抽象类一旦创建了对象就可以使用对象去调用方法了,一旦调用了抽象方法就没有任何的意义了。
2、 既然抽象类不能创建对象,那么存在构造方法的意义在那?
抽象类的构造方法是留给子类调用的,并初始化父类的成员变量的。
接口:
接口中可以含有变量和方法。但是要注意,接口中的变量会被隐式地指定为public static final变量(并且只能是public static final变量,用private修饰会报编译错误),而方法会被隐式地指定为public abstract方法且只能是public abstract方法(用其他关键字,比如private、protected、static、 final等修饰会报编译错误)
接口中所有的方法不能有具体的实现,也就是说,接口中的方法必须都是抽象方法
区别:
- 抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract 方法;
- 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的;
- 接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法;
- 一个类只能继承一个抽象类,而一个类却可以实现多个接口(单继承多实现)。