目录
- 1、概念
- 2、语法
- 3、特性
- 4、作用
1、概念
在面向对象中,所有对象都是通过类来描述的,但是并不是所有的类都可以用来描述对象。比如下述例子中的 Animal 类,Dog 类和 Cat 类是 Animal 类的子类,可以分别描述小狗和小猫,但 Animal 类无法具体描述哪种动物,如果一个类中没有具体的信息来描述具体的对象,那么这样的类就是抽象类。
Dog 类和 Cat 类重写了 bark() 方法,且小狗和小猫都有具体的叫法,但是动物的 bark() 方法无法具体实现,因此可以将 Animal 类中的 bark() 方法设计为抽象方法,包含抽象方法的类称为抽象类。
2、语法
在 Java 中,一个类如果被 abstract 修饰就称为抽象类,一个方法如果被 abstract 修饰就称为抽象方法。
// 抽象类
public abstract class Animal {
// 抽象方法:不用给出具体的实现
public abstract void eat();
}
3、特性
1、抽象类不直接实例化对象。
2、抽象类必须被继承,且继承后的子类要重写父类中的抽象方法,否则子类也必须声明为抽象类。
3、抽象方法不能是 private 的:因为抽象方法需要被子类重写,而 private 修饰的方法不能被重写。
4、抽象方法不能被 static 修饰:由于静态方法没有 this 引用,无法被重写,而抽象方法需要被子类重写。
5、 抽象方法不能被 final 修饰:被 final 修饰的方法不能被子类重写,而抽象方法需要被子类重写。
6、抽象类中不一定含有抽象方法,只要有 abstract 修饰就是抽象类;但有抽象方法的类一定是抽象类。
7、抽象类也是类,可以包含普通方法、属性、构造方法和代码块。
4、作用
如果需要使用抽象类,需要继承抽象类,然后子类重写抽象类的抽象方法,那么问题来了,普通的类也可以被继承,普通的方法也可以被重写,为什么需要使用到抽象类和抽象方法呢?
原因是使用了抽象类可以多一重编译器的校验。
假如实际工作应该由子类完成,但不小心使用成父类,如果父类是普通类编译器是不会报错的,但是如果父类是抽象类,那么编译器会在父类实例化的时候提示错误,可以让我们尽早发现问题。
就比如 final 关键字,如果我们想要创建值始终不变的变量,但是之后不小心赋值导致结果出错,这样的错误很难发现,但是如果给变量加上 final。
关键字,就代表该变量是常量,就是之后不小心被赋值,编译器也会及时报错。因此充分利用编译器的校验在实际开发中是有重要意义的。