1.概述
抽象类不能用来实例化对象,声明抽象类的唯一目的是为了将来对该类进行扩充。
一个类不能同时被 abstract 和 final 修饰。如果一个类包含抽象方法,那么该类一定要声明为抽象类,否则将出现编译错误。
抽象类可以包含抽象方法和非抽象方法。
抽象类一般会被继承,由其子类实现具体的抽象方法👴🏻
2.基本使用
/** * 抽象类 */ // 如果一个类包含抽象方法,那么该类一定要声明为抽象类 abstract class Abstract { // 抽象方法 public abstract void eat(); }
3.一些细节
抽象类常用于设计模式之中🥯
- 抽象类不能被实例化
abstract
只能修饰类和方法- 抽象类可以由任意成员(本质上还是类)
- 如果一个类继承了抽象类,则必须要实现继承的抽象类的所有抽象方法,除非它自己也是一个抽象类
// 如果一个类包含抽象方法,那么该类一定要声明为抽象类 abstract class Abstract { // 抽象方法 public abstract void eat(); } abstract class Dog extends Abstract { } class Dinosaur extends Abstract { @Override public void eat() { System.out.println("我爱吃肉!"); } }
抽象方法不能声明为private,final,static来修饰,因为这些关键字都是和重写相违背的
4.抽象类的最佳实践-模板设计模式
模板方法模式(Template Method Pattern),又叫模板模式(Template Pattern), 在一个抽象类公开定义了执行它的方法的模板。它的子类可以更需要重写方法实现,但可以成为典型类中定义的方式进行。
模板模式适用于通用步骤的操作,比如做菜,不管你是西红柿炒鸡蛋,还是土豆炖牛肉实现步骤都是一样的,备料,做菜,上菜。
再比如投放系统,不管你是投放巨量引擎,广点通还是百度,前期工作实现步骤也都是一样的,配置物料信息,构建投放对象,投放广告。
父类的梦想子类完成🎈
实例:计算任务的执行时间
/** * 抽象模板设计模式 */ abstract public class AbstractTemplate { public abstract void job(); // 加入抽象方法,父类的梦想子类完成 // 得到代码运行时间 public void calculateTime() { long start = System.currentTimeMillis(); job(); long end = System.currentTimeMillis(); System.out.println("任务执行时间:" + (end - start)); } } // 子类实现父类的梦想 class AA extends AbstractTemplate{ @Override public void job() { long num = 0; for (int i = 0; i < 800000; i++) { num += i; } } } class BB extends AbstractTemplate { @Override public void job() { long num = 0; for (int i = 0; i < 500000; i++) { num += i; } } }