当一个类是一个抽象的概念,单纯是为了继承而不是为了创建对象时,
如果一个类单纯的为了继承,而不是为了创建对象时,就考虑直接不让它创建对象了。这就是抽象类。
如果一个方法单纯的为了让子类继承,被子类重写,而不是为了被调用,就考虑不让它被调用,不需要方法体。这就是抽象方法。
抽象类和抽象方法的语法
抽象类的语法
[访问权限修饰符] abstract 类名{
// 类体
}
解释:
抽象类是抽象的,无法new创建对象,定义抽象类就是为了让子类继承的,抽象类和它的子类仍然是继承关系,存在父子类,也存在多态现象。
定义抽象类后,抽象类中可以定义抽象方法。
抽象方法的语法
[访问权限修饰符] abstract 返回值类型 方法名(形参列表);
解释:
抽象方法必须在抽象类中,没有方法体,没有具体实现,在方法声明后要写分号。
抽象类不能创建对象,那么抽象方法也不可能直接调用,所以抽象方法定义的目的就是为了让子类继承和重写的。
抽象类的定义
在继承体系中,从祖先类开始,随着一个个子类的定义,子类变得越来越具体,而祖先类则更具有一般性和抽象性。为了体现祖先类在设计上的抽象性,我们只将该类作为派生其他类的父类,而不能创建对象,这样的类称之为抽象类。
抽象类的特点
根据抽象类的语法结构,从以下角度来看抽象类的特点。
-
类名命名
首先抽象类的类名依然遵循“大驼峰”的命名规范。在实际开发中,一般抽象类命名会以“Base”或“Abstract”开头,表示这是一个抽象类,在使用时便于阅读和理解。
-
修饰符
和普通类一样,有两种访问级别。注意不能使用final修饰抽象类,因为final修饰类表示不能被继承的类,而抽象类的目的就是为了被继承的。
-
成员特点
-
普通成员:成员变量和成员方法,普通类能定义的抽象类也一样。
-
静态成员:静态成员变量和静态成员方法,普通类能定义的抽象类也一样。
-
抽象方法
从语法上来说,抽象类中可以没有抽象方法,但是抽象类中没有抽象方法这个抽象类就没有意义了,因此实际中定义抽象类就有抽象方法。
一旦抽象父类中定义了抽象方法,那么所有的普通子类都必须实现所有的抽象方法,普通类只要继承抽象类就必须实现类中所有的抽象方法,这本质上是方法的重写。
但抽象类的子类也可以是抽象类,抽象子类中可以不实现抽象方法,也可以选择实现部分抽象方法。
-
-
构造器
虽然抽象类不能创建对象,但是抽象类也是有构造器的。抽象类的构造器虽然自己不能用,但是可以给子类用,创建子类对象时,给自身成员变量赋值。
-
代码块
抽象类同样也有构造代码块和静态代码块,而且它们的使用和普通类一样。
总的来说,抽象类的成员和类中结构和普通类一样,只不过多了抽象方法,普通类中存在的结构在抽象类中都存在。因此,直接把一个普通类声明为抽象类在语法上是允许的。
注意事项
- abstract关键字只能用来修饰类或普通成员方法,不能修饰变量、构造器、代码块等结构。
- abstract修饰类时,不能同时有final修饰,因为一个需要继承一个不能继承,二者自相矛盾。
- abstract修饰成员方法表示抽象方法时,不能修饰私有方法,因为私有方法不能被重写;不能修饰静态方法,因为静态方法也不能被重写;不能修饰final修饰的方法,因为final修饰的方法虽然可以被继承,但是也不能被重写。
- 一个抽象类中虽然语法上可以没有抽象方法,但在实际中,抽象类就应该有抽象方法,这样这个抽象类才有意义。