序言
在面向对象的概念中,所有的对象都是通过类进行描绘的,但是,并不是所有的类都是用来描述对象的。如果在一个类中没有包含足够的信息描绘一个具体的对象,这样的类就是抽象类。下面详细讲合抽象类和抽象方法。
为什么需要抽象类
假设有一个父类,名称叫做Pet。那么类是抽象出来的一个概念,并不存在被称为“Pet”的动物,因此创建它是没有任何意义的。那么,如何限制 Pet类不被实例化呢?这里就需要使用 Java 的抽象类。
抽象类
什么是抽象类呢?顾名思义,抽象类就是抽象的类,抽象往往是相对于具体而言的。一般来说,具体类有直接对应的对象,而抽象类没有,它往往表达的是抽象的概念。
例如:
一只猫是具体对象,而猫科动物则是抽象概念;
玉米是具体对象,而作物则是抽象概念。
在 Java 中,当一个类被 abstact 关键字修饰时,该类被称为抽象类。定义一个抽象类的语法格式如下:
<访问修饰符> abstract class <类名> { }
抽象方法
在 Java 中,当一个类的方法被 abstract关键字修饰时,该方法被称为抽象方法。抽象方法所在类必须是抽象类。
一个方法被定义为抽象方法,意味着该方法不会有具体的实现,而在抽象类的子类中通过方法重写实现。定义抽象方法的语法格式如下:
[ 访问修饰符 ] abstract < 返回类型 > < 方法名 > ([ 参数列表 ])
abstract 关键字表示该方法被定义为抽象方法。
普通方法:
public void print(){ }
有实现但实现为空的普通方法。
抽象方法:
public abstract void print();
切记不要忘记语句最后的分号。这里,abstract关键字可以用来修饰类和方法,但不能用来修饰属性和构造方法。
抽象方法与普通方法最大的区别是:
普通方法有方法体,而抽象方法没有方法体。
注意:
- 在抽象类中,可以没有、有一个或多个抽象方法,甚至可以定义全部方法都是抽象方法。
- 抽象方法只有方法声明,没有方法实现。有抽象方法的类必须声明为抽象类。子类必须重写所有的抽象方法才能实例化;否则子类也必须声明成抽象类。
- 抽象类可以有构造方法,其构造方法可以被本类的其他构造方法调用。若此构造方法不是由private修饰的,也可以被本类的子类中的构造方法调用。
final 修饰符
final 是Java 的关键字,表示“最后的、最终的、不可变的”。使用 fnal 修饰符修饰的变量,只能进行一次赋值操作,并且在整个程序的生命周期中它的值都不可改变,被称为“常量”。fnal 修饰符除了可以定义常量,还可以用来修饰类和类的方法。
final 的使用规则:
- final 修饰类不能被继承(断子绝孙类)
- final 修饰方法不能被重写
- final 修饰的变量不能修改值(常量)声明时必须赋值
- final 修饰对象不能重新实例化
使用 final 修饰引用型变量时,变量的值是固定不变的,而变量所指向的对象的属性值是可变的。
总结
- 抽象类使用 abstract 修饰,不能实例化。
- 抽象类中可以有零到多个抽象方法。抽象方法使用abstract关键字修饰,没有方法体。
- 如果非抽象类继承抽象类,则必须实现父类的所有抽象方法,否则子类还是一个抽象类。
- 用 final 关键字修饰的类,不能再被继承。用 final 修饰的方法,不能被子类重写。用 final 关键字修饰的变量将变成常量,只能在初始化时进行赋值,不能在其他地方修改。