抽象类:

定义了一系列的属性和方法的类。抽象方法是不能直接实现功能。需要通过继承去实现具体方法。为了将静态的业务流程跟动态的实现分开。

工厂生产产品时,都需要准备材料,执行组装,产品销售等流程。但是对于不同的工厂。在执行这些流程是不同的。比如不同的工厂需要准备的材料不同。

创建抽象类的关键字是abstract

  1. public abstract class Factory {
  2. public abstract void prepared_matrial();
  3. public abstract void do_make();
  4. public abstract void sale();
  5.  
  6. }

使用abstract的方法是抽象方法,没有看上去比较怪,没有用花括号括起来。这样去声明方法表示。这个方法不能马上实现。需要通过子类去实现。

创建两个子类来继承它,首先创建一个汽车工厂,取名CarFactory

  1. public class CarFactory extends Factory{
  2. @Override
  3. public void prepared_matrial(){
  4. System.out.println("准备轮胎,方向盘");
  5. }
  6.  
  7. @Override
  8. public void do_make() {
  9. System.out.println("组装汽车");
  10. }
  11.  
  12. @Override
  13. public void sale() {
  14. System.out.println("去4S店");
  15. }
  16. }

再创建一个食品工厂,取名FoodFactory

  1. public class FoodFactory extends Factory {
  2. @Override
  3. public void prepared_matrial() {
  4. System.out.println("准备萝卜丝");
  5. }
  6.  
  7. @Override
  8. public void do_make() {
  9. System.out.println("把萝卜丝做成一袋袋的");
  10. }
  11.  
  12. @Override
  13. public void sale() {
  14. System.out.println("去小卖部");
  15. }
  16.  
  17. }

如果继承后。没有实现相应方法。是会报错的。

在Factory调用,看下效果。

  1. public abstract class Factory {
  2. public abstract void prepared_matrial();
  3. public abstract void do_make();
  4. public abstract void sale();
  5.  
  6. public static void main(String[] args){
  7. CarFactory carFactory = new CarFactory();
  8. carFactory.prepared_matrial();
  9. carFactory.do_make();
  10. carFactory.sale();
  11. System.out.println("=========分割线=========");
  12. FoodFactory foodFactory = new FoodFactory();
  13. foodFactory.prepared_matrial();
  14. foodFactory.do_make();
  15. foodFactory.sale();
  16. }
  17. }

通过上面的代码会发现每次生成一个产品,每次都要调用这三个方法。能否把这三个方法在某处统一调用?

抽象类的一个特性是:抽象类不是必须要有抽象方法,也可以有实现了的方法;但是一旦有一个方法是抽象方法,此类必须设置为抽象类。

既然抽象类中可以有实现方法,那么就在Factory中定义一个总的生产方法,这个方法调用其他步骤来实现最终生产目的

  1. public abstract class Factory {
  2. public abstract void prepared_matrial();
  3. public abstract void do_make();
  4. public abstract void sale();
  5.  
  6. public void createProduct(){
  7. prepared_matrial();
  8. do_make();
  9. sale();
  10. }
  11.  
  12. public static void main(String[] args) {
  13. CarFactory carFactory = new CarFactory();
  14. carFactory.createProduct();
  15. System.out.println("==============");
  16. FoodFactory foodFactory = new FoodFactory();
  17. foodFactory.createProduct();
  18. }
  19. }

也就是说,不用一个个的调用生产步骤的方法,只调用总生产方法就行了。这就是java模板方法模式。

java学习笔记16-抽象类的更多相关文章

  1. Java学习笔记16(面向对象九:补充内容)

    总是看到四种权限,这里做一个介绍: 最大权限是public,后面依次是protected,default,private private修饰的只在本类可以使用 public是最大权限,可以跨包使用,不 ...

  2. Java学习笔记之抽象类与接口

    抽象类(abstract) 抽象类概述:一个类被abstract修饰表示这个类是抽象类, 自己定义方法但是不实现方法,后代去实现 抽象方法:   一个方法被abstract修饰表示这个方法是抽象方法 ...

  3. Java 学习笔记(16)——Java数据库操作

    数据库操作是程序设计中十分重要的一个部分,Java内置JDBC来操作数据库 JDBC使用 JDBC--Java Database connecting Java数据库连接:本质上JDBC定义了操作数据 ...

  4. 0026 Java学习笔记-面向对象-抽象类、接口

    抽象方法与抽象类 抽象方法用abstract修饰,没有方法体部分,连花括号都不能有: 抽象方法和抽象类都用abstract修饰 包含抽象方法的类一定是抽象类:但不包含抽象方法的类也可以是抽象类 不能创 ...

  5. java学习笔记16(正则表达式)

    正则表达式: 定义:在pattern类中有简单规则定义,具有特殊含义的字符串: 作用:用于一些字符串,比如验证注册邮箱,密码,用户名等: 正则表达式的语法: 1)字符:'\'反斜杠   \t 代表制表 ...

  6. JAVA学习笔记16——控制线程

    Java的线程支持提供了一些便捷的工具方法,通过这些便捷的工具方法可以很好地控制线程执行.   join线程 Thread提供了让一个线程等待另一个线程完成的方法——join().当在某个线程执行流中 ...

  7. JAVA学习笔记16——线程生命周期

    当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态,在线程的生命周期中,它要经过新建(New).就绪(Runnable).运行(Running).阻塞(Blocking)和 ...

  8. JAVA学习笔记16——线程的创建和启动

    Java使用Thread类代表线程,所有的线程对象都必须是Thread类或其子类的实例.每个线程的作用是完成一定的任务,实际上就是执行一段程序流(一段顺序执行的代码).Java使用线程执行体来代表这段 ...

  9. Java学习笔记之---比较接口与抽象类

    Java学习笔记之---比较接口与抽象类 抽象类是描述事物的本质,接口是描述事物的功能 接口与抽象类的异同 1.一个类只能继承一个父类,但是可以有多个接口 2.抽象类中的抽象方法没有方法体,但是可以有 ...

  10. 0028 Java学习笔记-面向对象-Lambda表达式

    匿名内部类与Lambda表达式示例 下面代码来源于:0027 Java学习笔记-面向对象-(非静态.静态.局部.匿名)内部类 package testpack; public class Test1{ ...

随机推荐

  1. 【Aizu - 0189】Convenient Location (最短路 Floyd算法)

    Convenient Location 直接翻译了 Descriptions 明年毕业的A为就业而搬家.就职的公司在若干城市都有办公室,不同天出勤的办公室也不同.所以A在考虑住在哪去各个办公室的时长最 ...

  2. webpack简单配置

    1.代理配置 需要修改一下配置文件 config里的index.js,根据接口特点自主选取 2.解决图标显示路径错误问题 项目在打包完成后如果出现图片显示不了的问题,需要进行如下配置

  3. AD域环境搭建

    1.安装Windows server服务器 我安装的是Windows server 2012 Standard x64 下载地址:https://pan.baidu.com/s/1dZ_B5JIEit ...

  4. 点击 显示红色 小案例 vue

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  5. 《ucore lab1 exercise2》实验报告

    资源 ucore在线实验指导书 我的ucore实验代码 题目:使用qemu执行并调试lab1中的软件 为了熟悉使用qemu和gdb进行的调试工作,我们进行如下的小练习: 从CPU加电后执行的第一条指令 ...

  6. Nachos java版学习(一)

    最近,操作系统课程设计使用伯克利大学的Nachos做为实验平台,老师也照搬伯克利的Project要求,开始我们的操作系统课程设计. 结合自己的学习过程和课设要求,我觉得对Nachos的学习首先应该从K ...

  7. Is Graph Bipartite?

    Given an undirected graph, return true if and only if it is bipartite. Recall that a graph is bipart ...

  8. Jenkins+maven+gitlab自动化部署之基础环境部署(一)

    从一个二线城市,来到上海,刚入职,老大就给任务,为了减少开发打包部署时间,需要搭建一套自动化部署环境.接到任务后,赶紧上网查找资料,以及了解jenkins作用等等,用了一周时间,了解了个大概,由于都是 ...

  9. Itellij IDEA下Maven的配置

    maven基本配置 配置阿里云镜像 打开settings.xml,添加 <mirrors> <mirror> <id>alimaven</id> < ...

  10. 整理下线段树吧 poj hotel

    除了上次的新学的有 区间更新 延迟更新  区间合并 先说下区间更新以及延迟更新吧 既然是对区间的维护 在求解一些问题的时候 有的时候没有必要对所有的自区间都进行遍历 这个时候 延迟标记就派上用场了 ( ...