Java 基础进阶篇(五)—— 抽象类与模板方法设计模式

news2024/12/23 5:40:23

文章目录

  • 一、抽象类、抽象方法概述
  • 二、抽象类的特征
  • 三、模板方法设计模式
    • 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{
    @Override
    public String writeMain() {
        return "小学生写的正文";
    }
}
public class StudentMiddle extends Student{
    @Override
    public 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真题)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/484142.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java 基础进阶篇(七)—— 面向对象三大特征之三:多态

文章目录 一、多态的概述二、多态中成员访问特点 ★三、多态的优势与劣势四、多态下的类型转换4.2 自动类型转换(从子到父)4.2 强制类型转换(从父到子)4.3 instanceof 关键字 一、多态的概述 多态:是指执行同一个行为…

Java 基础进阶篇(四)—— 权限修饰符、final 关键字与枚举

文章目录 一、权限修饰符二、final 关键字2.1 final 作用2.2 final 修饰变量举例2.3 常量 三、枚举3.1 枚举的格式3.2 枚举的特征3.3 枚举的应用 一、权限修饰符 权限修饰符 用于约束成员变量、构造器、方法等的访问范围。 权限修饰符: 有四种作用范围由小到大 (p…

Java 基础进阶篇(三)—— 面向对象的三大特征之二:继承

文章目录 一、继承概述二、内存运行原理 ★三、继承的特点四、继承后:成员变量和方法的访问特点五、继承后:方法重写六、继承后:子类构造器的特点七、继承后:子类构造器访问父类有参构造器八、this、super 总结 一、继承概述 Jav…

机器学习之利用SMO算法求解支持向量机—基于python

大家好,我是带我去滑雪! 本期将讨论支持向量机的实现问题,我们知道支持向量机的学习问题可以化为求解凸二次规划问题。这样的凸二次规划问题具有全局最优解,并且有许多最优化算法可以用于这一问题的求解。但是当训练样本容量很大…

【C++】 探索程序 详细解读程序在运行过程中都发生了什么

目录 头文件-源代码 头文件重复包含 问题 解决方案 程序生成过程 预处理Preprocessi 编译Compilation 汇编Assembly 链接Linking 编译期-运行期 编译期确定 运行期确定 编译期错误 运行期错误 类和对象 宏 宏的其他用法 inline内联 头文件-源代码 头文件&…

Vue简介和常用指令

概述: MVVM思想:视图层数据和数据模型里面的数据发生变化都会影响到另一边的数据,通过ViewModel自动实现。 Vue入门案例 步骤: 上面提到了数据模型和试图层的数据是关联的,此处数据模型里面el的值就是选择了哪一个视…

jQuery引入----练习

jQuery引入----练习 html <!DOCTYPE html> <html><head><title>jQuery引入</title><!-- css样式引入 --><link rel"stylesheet" href"../css/a.css"><!-- jquery函数库引入 --><script type"tex…

Linux基础IO【深入理解文件系统】

✨个人主页&#xff1a; 北 海 &#x1f389;所属专栏&#xff1a; Linux学习之旅 &#x1f383;操作环境&#xff1a; CentOS 7.6 阿里云远程服务器 文章目录 &#x1f307;前言&#x1f3d9;️正文1、磁盘文件2、磁盘概念2.1、基本结构2.2、数据存储 3、磁盘信息3.1、分区意义…

【C++初阶】类与对象:6大默认成员函数------拷贝构造和赋值运算符重载

一.拷贝构造函数 A.概念 拷贝构造函数&#xff1a;只有单个形参&#xff0c;该形参是对本类类型对象的引用(一般常用const修饰)&#xff0c;在用已存在的类类型对象创建新对象时由编译器自动调用。 B.特性 1. 拷贝构造函数是构造函数的一个重载形式&#xff1b; 2. 拷贝构造函…

shell的基础学习二

文章目录 一、Shell 数组二、Shell 基本运算符三、Shell echo命令四、Shell printf 命令五、Shell test 命令总结 一、Shell 数组 数组中可以存放多个值。Bash Shell 只支持一维数组&#xff08;不支持多维数组&#xff09;&#xff0c;初始化时不需要定义数组大小&#xff08…

【五一创作】【Simulink】基于FCS-MPC的三相并网逆变器控制(Stateflow)

上次写了一篇【Simulink】基于FCS-MPC的三相并网逆变器控制&#xff08;Matlab Function&#xff09;&#xff0c;控制部分用 Matlab Function 写的&#xff0c;因实验室一般用 Stateflow&#xff0c;所以这篇把 Matlab Function 改成 Stateflow. 原理 电路原理图&#xff1a;…

如何批量查询快递的签收状态?

如果一次性网购大量快递&#xff0c;我们就得经常进入快递或网购平台查询物流&#xff0c;随时查看快递单号的物流状态。如果快递公司少&#xff0c;查询起来比较容易&#xff0c;但是如果快递公司很多&#xff0c;每次都要人工查询就是一件很麻烦的事情了。今天&#xff0c;小…

数据库相关知识

一.1 数据库 与Sybase不同&#xff0c;一个用户就对应于一个数据库。 create user CBMAIN identified by "sunline" default tablespace CBMAIN_DATA  -- 表空间 temporary tablespace CBMAIN_TEMP; -- 临时表空间 一.2 表空间 表空间由一个或多个物理文件组成&…

js使用splice方法删除数组元素可能导致的问题

splice() 方法通过删除或替换现有元素或者原地添加新的元素来修改数组&#xff0c;并以数组形式返回被修改的内容。此方法会改变原数组。 JavaScript 遍历数组并通过 splice 方法删除该数组符合某些条件的元素将会导致哪些问题&#xff1f; 导致的问题 当使用 splice 方法从 …

QT 中的多线程之继承 Thread

文章目录 1. 概述2. UML 类的关系图3. 代码&#xff1a;4. 运行结果及说明5. 结语 1. 概述 任何继承于QThread的线程都是通过继承 QThread 的run函数来实现多线程的&#xff0c;因此&#xff0c;必须重写QThread的run函数&#xff0c;把复杂逻辑写在QThread的run函数中。然后在…

effective c++ item40-44

item40:谨慎的使用多重继承 多重继承带来的符号的歧义性 #include <iostream> #include <vector> using namespace std; class A { public:void f() { cout << "A" << endl; } }; class B { private:void f(); }; class C : public A, publ…

5.5.1哈夫曼树

知识总览&#xff1a; 概念&#xff1a; 结点的权&#xff1a;有某种现实含义的数值&#xff08;如&#xff1a;表示结点的重要性&#xff09; 结点的带权路径长度&#xff1a;从树的根到该结点的路径长度&#xff08;经过的边数&#xff09;与该结点上权值的乘积。 就比如说要…

ETL工具 - Kettle 案例,拉取网络列表数据

一、Kettle 实战案例 上篇文章对 Kettle 的查询、连接、统计、脚本算子进行了介绍&#xff0c;对 Kettle 的大部分算子都应该有了相应的了解&#xff0c;下面我们基于 Kettle 实战案例&#xff0c;拉取 CSDN 博客列表的全部数据&#xff0c;存放至 Excel 文件中。 实验之前先…

NECCS|全国大学生英语竞赛C类|词汇和语法|词汇题|21:03~21:53

词汇题 语法题 情景对话题 目录 一、词汇题 1. 基本词义辨析题 2. 同义词或近义词辨析题 3. 固定搭配 二、常见词组 一、词汇题 1. 基本词义辨析题 appropriate funds 拨款 slum- clearance programme 贫民窟清理计划 reject 拒绝接受&…

DAY 49 tomcat服务配置优化

什么是Tomcat Tomcat是Java 语言开发的&#xff0c;Tomcat 服务器是一个免费的开放源代码的Web应用服务器&#xff0c;是Apache 软件基金会的 Jakarta 项目中的一个核心项目&#xff0c;由Apache、Sun和其他一些公司及人共同开发而成。 Tomcat属于轻量级应用服务器&#xff0…