抽象类
抽象方法
- 没有方法体的方法,就是抽象方法。
- abstract修饰符修饰
- 抽象方法只是用来定义规范的。告诉子类应该做什么,具体怎么做,不同的子类有不同的实现
- 不能私有、静态、final
抽象类:
-
用abstract修饰的类就是抽象类
-
有抽象方法的类,必须是抽象类
-
抽象类不能创建对象,构造方法只是在子类中调用来初始化参数的。
-
怎么的类可以定义抽象类
- 如果你这个类不想让别人创建对象。就抽象
- 如果你这个类中的方法没有实现的意义,定义为抽象
-
子类继承了一个抽象类,必须重写(实现)抽象方法。
-
如果子类不想对父类中的抽象方法进行实现的话,可以继续抽象下去。
-
抽象类:
- 就是特殊的类而已,在普通类的继承上继续往上。
- 不可以创建对象
- 可以拥有普通的属性和方法
模板方法
-
属于设计模式之一
-
对抽象类和抽象方法的运用
-
定制一套流程。具体的流程中的实现交给子类去实现,父类只是定义流程
-
模板方法的类中有三种方法
- 模板方法,在这个方法中,只是定义了流程,也就是调用我的抽象方法
- 抽象方法,都是模板中定义的流程中的某一环节
- 钩子方法:普通的带有实现的方法
-
在一个模板方法类中,模板方法可以有多个。
-
不同的子类实现对象,共用同一套流程,具体的步骤细节不通过
/** * @Author:廾匸 * @Date: 2020/10/31 15:34 * @Description: * @version: 1.0 */ public abstract class Work { /** * @date 2020/10/31 15:34 * @param * @return void * @description 模板方法,定义流程 */ public void work() { clockIn(); // 打卡 openCompter(); // 打开电脑 workContent();// 工作内容 eat(); // 吃饭 workContent();// 工作内容 getOffWork(); // 下班打卡 goHome(); // 回家 } public void work2() { openCompter(); // 打开电脑 workContent();// 工作内容 eat(); // 吃饭 } protected abstract void goHome(); protected abstract void getOffWork(); protected abstract void eat(); protected abstract void workContent(); public abstract void openCompter(); public abstract void clockIn(); } /** * @Author: 廾匸 * @Date: 2020/10/31 15:43 * @Description: * @version: 1.0 */ public class Teacher extends Work { @Override protected void goHome() { System.out.println("坐地铁"); } @Override protected void getOffWork() { System.out.println("关闭电脑,准备回家"); } @Override protected void eat() { System.out.println("吃一顿好的"); } @Override protected void workContent() { System.out.println("上课"); } @Override public void openCompter) { System.out.println("打卡IDEA"); } @Override public void clockIn() { System.out.println("老师上课前准备"); } } /** * @Author:廾匸 * @Date: 2020/10/31 15:45 * @Description: * @version: 1.0 */ public class Student extends Work { @Override protected void goHome() { System.out.println("司机开车"); } @Override protected void getOffWork() { System.out.println("开开心心下班"); } @Override protected void eat() { System.out.println("满汉全席"); } @Override protected void workContent() { System.out.println("听课"); } @Override public void openCompter() { System.out.println("打开各种软件"); } @Override public void clockIn() { System.out.println("准备上课"); } } /** * @Author: 廾匸 * @Date: 2020/10/31 15:44 * @Description: * @version: 1.0 */ public class Demo03 { public static void main(String[] args) { Work teacher = new Teacher(); Work student = new Student(); teacher.work(); System.out.println("========================"); student.work(); } }
-
模板方法,一般父类定义好了不需要子类重写覆盖,所以一般使用final修饰。