文章目录

  • 一、抽象类、抽象方法概述
  • 二、抽象类的特征
  • 三、模板方法设计模式
    • 3.1使用场景
    • 3.2 实现步骤
    • 3.3 写作文案例
  • 补充:final 和 abstract 是什么关系?

一、抽象类、抽象方法概述

在 Java 中 abstract 是抽象的意思,可以修饰类、成员方法。
abstract 修饰类,这个类就是抽象类;修饰方法,这个方法就是抽象方法。


注意:

① 抽象方法只有方法签名,不能声明方法体。
② 一个类中如果定义了抽象方法,这个类必须声明成抽象类,否则报错。

抽象类的作用:

① 抽象类可以理解成不完整的设计图,一般作为父类,被子类继承。
② 如果父类知道子类一定要做这件事,但是每个子类做的不一样,父类可以声明抽象方法,交给子类重写来实现。这个类就是抽象类了。


二、抽象类的特征

抽象类的特征如下:

① 类有的成员(成员变量、方法、构造器)抽象类都具备。
② 抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类。
③ 一个类继承了抽象类必须重写完抽象类的全部抽象方法,否则这个类也必须定义成抽象类。
④ 不能用 abstract 修饰变量、代码块、构造器。
⑤ 最重要的特征:抽象类得到了抽象方法,但失去了创建对象的能力(有得有失)。

抽象类不能创建对象,为什么(设计层面)?
  可以利用反证法:如果抽象类创建了对象,那么当调用对象中方法的时候,由于没有方法体,则会前后矛盾。如果抽象类中当前没有抽象方法,可以创建对象,但是以后如果有了抽象方法,则还是会前后矛盾。

public class Test {public static void main(String[] args) {// 反证:假如抽象类可以创建对象// Animal animal = new Animal();// animal.run(); 没有方法体,报错,因此不能创建对象// 即使没有方法,只有成员变量,也不能创建对象。// 因为假设当前没有方法的情况下创建了对象,以后有方法,这会造成前后矛盾}
}
abstract class Animal{public abstract void run(); // 抽象方法public void eat(){System.out.println("吃东西");}
}

三、模板方法设计模式

3.1使用场景

当系统中出现同一个功能多处在开发,而该功能中大部分代码是一样的,只有其中部分可能不同的时候。


3.2 实现步骤

① 定义 1 个抽象类。
② 定义 2 个方法,模板方法和抽象方法。相同代码放在模板方法中,不同代码定义成抽象方法。
③ 子类继承抽象类,重写抽象方法。


3.3 写作文案例

需求:

  • 现在有两类学生,一类是中学生,一类是小学生,他们都要写《我的爸爸》这篇作文。
  • 要求每种类型的学生,标题第一段和最后一段,内容必须一样。正文部分自己发挥。
  • 请选择最优的面向对象方案进行设计。

抽象类:

public abstract class Student {/*** 声明了模板方法模式* 建议加上 final 防止模板方法被重写*/public final void write(){System.out.println("开头");// 正文部分(每个类都要写的,每个子类写的情况不一样。// 因此,模板方法把正文部分定义成抽象方法,交给具体的子类来完成)System.out.println(writeMain());System.out.println("结尾");}public abstract String writeMain();
}

子类:

public class StudentChild extends Student{@Overridepublic String writeMain() {return "小学生写的正文";}
}
public class StudentMiddle extends Student{@Overridepublic String writeMain() {return "中学生写的正文";}
}

客户端模拟:

public class Test {public static void main(String[] args) {// 理解模板方法模式的思想和使用步骤StudentChild student1 = new StudentChild();student1.write(); // 开头\n小学生写的正文\n结尾StudentMiddle student2 = new StudentMiddle();student2.write(); // 开头\n中学生写的正文\n结尾}
}

补充:final 和 abstract 是什么关系?

互斥关系
abstract 定义的抽象类作为模板让子类继承,final 定义的类不能被继承。
abstract 定义的抽象方法定义通用功能让子类重写,final 定义的方法子类不能重写。


文章参考:Java入门基础视频教程,java零基础自学就选黑马程序员Java入门教程(含Java项目和Java真题)

Java 基础进阶篇(四):抽象类与模板方法设计模式相关推荐

  1. 第二十八节:Java基础-进阶继承,抽象类,接口

    前言 Java基础 - 进阶继承,抽象类,接口 进阶继承 class Stu {int age = 1; } class Stuo extends Stu {int agee = 2; } class ...

  2. Java 基础进阶篇(十四):File 类常用方法

    File 类的对象代表操作系统的文件(文件.文件夹),File 类在 java.io.File 包下. File 类提供了诸如:创建文件对象代表文件,获取文件信息(大小.修改时间).删除文件.创建文件 ...

  3. Java基础进阶多线程-四种创建方式

    文章目录 1.分析以下程序,有几个线程,除垃圾回收线程之外.有几个线程? 示例代码01: 2.线程创建的第一种方式:(继承Thread类) 示例代码02: 运行结果: 3.线程创建的第二种方式:(Ru ...

  4. JAVA中整型常量的长度,Java基础入门篇(三)——Java常量、变量,

    Java基础入门篇(三)--Java常量.变量, 一.Java常量 (一)什么是常量 常量指的是在程序中固定不变的值,是不能改变的数据.在Java中,常量包括整型常量.浮点型常量.布尔常量.字符常量等 ...

  5. 超详细的Java面试题总结(二)之Java基础知识篇

    系列文章: 超详细的Java面试题总结(一)之Java基本知识 超详细的Java面试题总结(二)之Java基础知识篇 超详细的Java面试题总结(三)之Java集合篇常见问题 超详细的Java面试题总 ...

  6. JAVA基础知识(四)面向对象基础

    文章目录 JAVA基础知识(四)面向对象基础 1. 类 2. 访问权限修饰符 3. `static`修饰符 3.1 静态代码块 4. `new`一个对象 5. 方法 5.1 `this` 5.2 方法 ...

  7. Android日志[进阶篇]四-获取错误报告

    Android日志[进阶篇]一-使用 Logcat 写入和查看日志 Android日志[进阶篇]二-分析堆栈轨迹(调试和外部堆栈) Android日志[进阶篇]三-Logcat命令行工具 Androi ...

  8. FPGA基础入门篇(四) 边沿检测电路

    FPGA基础入门篇(四)--边沿检测电路 一.边沿检测 边沿检测,就是检测输入信号,或者FPGA内部逻辑信号的跳变,即上升沿或者下降沿的检测.在检测到所需要的边沿后产生一个高电平的脉冲.这在FPGA电 ...

  9. Java泛型进阶篇: 无界通配符、上界通配符以及下界通配符

    专栏文章导航 Java泛型入门篇: 泛型类.泛型接口以及泛型方法 Java泛型进阶篇: 无界通配符.上界通配符以及下界通配符 Java泛型原理篇: 类型擦除以及桥接方法 文章目录 前言 1. 无界通配 ...

最新文章

  1. poj 1469 COURSES
  2. 张恩民 php,php100视频教程第11讲(制作PHP+MYSQL留言板 上)中,张恩民老师提到的php100-11.txt文档...
  3. 六数码问题(广搜_队列)
  4. 洛谷 - P4009 汽车加油行驶问题(分层图最短路/最小费用最大流)
  5. 当你「ping 一下」的时候,你知道它背后的逻辑吗
  6. Linux 字符设备驱动开发基础(二)—— 编写简单 PWM 设备驱动
  7. Problem A: 判断操作是否合法(栈和队列)
  8. STM32F103通用定时器使用
  9. 学习笔记之linux网络属性配置及其命令用法
  10. Spring4 快速入门
  11. 阶段1 语言基础+高级_1-3-Java语言高级_08-JDK8新特性_第1节 常用函数接口_16_常用的函数式接口_Function接口中的方法Apply...
  12. Springboot项目中Pom.xml报错
  13. 《21世纪英汉汉英双向词典》《朗文当代英语辞典第五版》《牛津高阶英汉双解词典第7版》...
  14. C语言中如何使用system函数
  15. 【线性代数】矩阵的算数运算
  16. VB利用SHFileOperation实现拷贝、删除、重命名文件
  17. 支付宝app支付产品不通过app集成sdk发起支付(附源码)
  18. Gerber 格式详解
  19. 周易 乾(卦一) ——吉人自有天象
  20. 数的相关概念——数码、位数、基数、位权

热门文章

  1. MongoDB的启动和关闭
  2. iOS 获取手机型号
  3. 2.8 电话聊天狂人(散列,c)
  4. 服务器2012系统评估版,解决windows server2012 评估版本过期,系统会自动关机
  5. hdu-多校联赛6301 Distinct Values
  6. SpringMVC(三)Restful风格及实例、参数的转换
  7. javaweb项目完整案例下载,真的太香了!
  8. 流程文档+流量秘密思维导图模板
  9. 入耳式耳机好处和坏处有哪些?有没有戴着耳朵不痛的耳机?
  10. 【51nod 1028 大数乘法 V2】