|名词定义|
在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。
由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。也是因为这个原因,通常在设计阶段决定要不要设计抽象类。
父类包含了子类集合的常见的方法,但是由于父类本身是抽象的,所以不能使用这些方法。
在Java中抽象类表示的是一种继承关系,一个类只能继承一个抽象类,而一个类却可以实现多个接口。
抽象类的主要作用在于对子类中覆写方法进行约定,在抽象类里面可以去定义一些抽象方法以实现这样的约定。抽象方法指的是使用了abstract关键字定义的并且没有提供方法体的方法,而抽象方法所在的类必须为抽象类,抽象类必须使用abstract关键字来定义(在普通类的基础上追加抽象方法就是抽象类)。
当一个抽象类完成之后(切记:“抽象类不是完整的类”),如果要想去使用抽象类,则必须按照如下原则去进行:
- 抽象类必须提供有子类,子类使用extends继承一个抽象类;
- 抽象类的子类(不是抽象类)一定要覆写抽象类中的全部抽象方法,即子类实现抽象方法;
- 抽象类的对象实例化可以利用对象多态性通过子类向上转型的方式完成。
抽象类是一个重要的面向对象设计的结构,对于抽象类使用的时候需要注意以下几点问题:
- 抽象类自己无法直接实例化,必须被继承,抽象方法本身是为了定义个规则,通过子类来实现具体的业务功能;
- 抽象类中允许没有抽象方法,但是即便没有抽象方法,也无法直接使用关键字new直接实例化抽象了类对象,必须依靠子类对象完成。
- 在定义抽象类的时候绝对不能够使用final关键字进行定义,因为抽象类必须有子类,而final定义的类是不能够有子类的。
- 抽象类是作为一个普通类的加强版出现的(抽象类的组成就是在普通类的基础上扩展而来的,只是追加了抽象方法),既然是在普通类的基础上扩展的,那么普通类之中就可以定义属性和方法,那么这些属性一定是要求进行内存空间开辟的,所以抽象类一定可以提供有构造方法,并且子类也一定会按照子类对象的实例化原则进行构造调用。
|参考资料|
[1] 阿里云大学Java视频课程
[2] Java开发者
[3] Java教程