05_面对对象高级_抽象类

抽象类

1. 认识抽象类

在 Java 中有一个关键字叫:abstract ,它的中文含义是"抽象",可以用它来修饰类、成员方法。

abstract 修饰类,这个类就是抽象类。

abstract 修饰方法,这个方法就是抽象方法。

2. 注意事项
  • 抽象类中不一定有抽象方法,但是,有抽象方法的类一定是抽象类
  • 类该有的成员(成员变量、成员方法、构造器)抽象类都可以有
  • 最大的特点:抽象类不能创建对象!它仅作为一种特殊的父类,让子类继承并实现重写!
abstract class A {private String name;public static String schoolName = "New School";public A() {}public A(String name) {this.name = name;}// A类独有的方法public String getName() {return name;}// A类非独有的方法:被B类继承public void printOut() {System.out.println("通过'普通的模式'的继承实现多态 [from A]");}// "抽象方法"实现了哪些东西?// 1. 父类不用写大括号{},以及对应的代码,因为写了也没意义,交给子类进行重构就好啦!// 2. 强制要求子类,必须对当前的这个抽象方法进行重构,否则子类也会被同化成抽象类!// 3. 综上所述,抽象类与抽象方法最终只是为了让子类强制执行重构,以实现更好的"多态"// 所以,不使用抽象类来打造"多态"也是可以的,但是显得不那么专业。public abstract void run();// 如果使用普通的模式让子类进行重构,从而实现"多态",上面的代码则应该改成——如下所示:
//  public void run(){
//
//  }
}class B extends A {// 调用A类的构造器public B(String name) {super(name);}// B类独有的方法public void helloWorld() {System.out.println("Hello World");}// 继承A类的方法,普通的模式进行继承,实现多态@Overridepublic void printOut() {System.out.println("通过'普通的模式'的继承实现多态 [from B]");}// 当B类继承了A类,// 要么选择: 将A类中的抽象方法run()进行重构,// 要么选择: B类也变成抽象类,// 要么选择: 程序报错!public void run() {System.out.println("B类: 正在跑步...");}
}public class HelloWorld {public static void main(String[] args) {
//      A obj = new A();  // 报错,A类是抽象类,无法创建对象A obj = new B("Jack");  // 正常System.out.println(obj.schoolName);  // (A类的属性[或者说成员变量])System.out.println(obj.getName());  // (A类的独有方法)obj.printOut();  // (B类的方法:它是重写了A类的)
//      obj.helloWorld();  // 报错  (B类的独有方法)// 执行结果:// New School// Jack// 通过'普通的模式'的继承实现多态 [from B]}
}
3. 抽象类的意义

抽象类的应用场景和好处是,父类知道每个子类都要做某个行为,但是在每个子类中要做的情况不一样,父类就定义成抽象方法,交给子类去强制重写。我们抽象出这样的抽象类,就是为了更好的支持多态。

4. 抽象类的应用

4.1 模板方法设计模式

  • 抽象类的常见应用场景:模板方法设计模式
  • 模板方法设计模式:解决了方法中存在重复代码的问题

4.2 写法

  • 定义一个抽象类
  • 在里面定义两个方法
    • 一个是模板方法:把需要重复使用的代码放进去
    • 一个是抽象方法:具体的功能实现交给子类完成
abstract class People {// 没有被继承的成员方法// 像这种不需要被继承的方法,强烈建议加上 final 关键字,以防止不小心被重写了!public final void speak() {System.out.println("这个人正在台上演讲...");System.out.println(speakMain());System.out.println("这个人演讲结束啦");}// 抽象方法public abstract String speakMain();
}class Teacher extends People {//  以Teacher风格,重写抽象方法public String speakMain() {return "这个人是老师,演讲的内容很有深度!";}
}class Student extends People {//  以Student风格,重写抽象方法public String speakMain() {return "这个人是学生,在台上演讲有点紧张。";}
}public class Test {public static void main(String[] args) {People p1 = new Teacher();People p2 = new Student();p1.speak();System.out.println("-------------------------");p2.speak();}
}// 运行结果://这个人正在台上演讲...
//这个人是老师,演讲的内容很有深度!
//这个人演讲结束啦
//-------------------------
//这个人正在台上演讲...
//这个人是学生,在台上演讲有点紧张。
//这个人演讲结束啦

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

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

相关文章

python接口自动化-参数关联

前言 我们用自动化发帖之后,要想接着对这篇帖子操作,那就需要用参数关联了,发帖之后会有一个帖子的id,获取到这个id,继续操作传这个帖子id就可以了 (博客园的登录机制已经变了,不能用账号和密…

【算法设计实验三】动态规划解决01背包问题

请勿原模原样复制! 01背包dp具体解释详见链接 ↓ 【算法5.1】背包问题 - 01背包 (至多最大价值、至少最小价值)_背包问题求最小价值_Roye_ack的博客-CSDN博客 关于如何求出最优物品选择方案? 先在递归求dp公式时,若…

Proteus下仿真AT89C51单片机串行口的问题

在Proteus下仿真AT89C51单片机的串行口的时候,Proteu不同版本下差别较大。     同样的程序,在7.8的老版本(7.8版本的原理图仿真软件名称是ISIS 7 Professional)下仿真串行口,收发均正常。但是,在8.13版…

打印lua输出日志

日志级别: ngx.STDERR 标准输出ngx.EMERG 紧急报错ngx.ALERT 报警ngx.CRIT 严重,系统故障, 触发运维告警系统ngx.ERR 错误,业务不可恢复性错误ngx.WARN 提醒, 业务中可忽略错误ngx.NOTICE 提醒, 业务中比较…

增速大幅下滑?基础L2博弈成本

在高阶智驾(从ALC到NOA)的光环之下,传统入门级基础L2级辅助驾驶赛道也在发生一些微妙的变化。 高工智能汽车研究院监测数据显示,2023年1-9月,基础L2在中国市场(不含进出口)乘用车前装标配交付45…

数据库存储引擎

一、MySQL体系结构 二、存储引擎-简介 存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式。存储引擎是基于表的,而不是基于库的,所以存储引擎也可以被成为表的类型 MySQL 5.5版本之后,默认存储引擎就是InnoDB,之前…

十六进制字符串转成十进制数

需求 转码要求 案例 A2 转成 十进制数是 10 *16 2 162 代码 需要注意的是可能十六进制 里面有大小写,比如F 写成f, a 写成A,或者大小写混合,要提高鲁棒性就要两个都可行,算法很是简单,其实就是求取当前值x1&…

HarmonyOS云开发基础认证【最新题库 满分答案】

系列文章 HarmonyOS应用开发者基础认证【闯关习题 满分答案】 HarmonyOS应用开发者基础认证【满分答案】 HarmonyOS云开发基础认证【最新题库 满分答案】 目录 系列文章一、判断题二、单选题三、多选题 一、判断题 1.应用架构的演进依次经历了微服务架构、单体架构、Serverle…

Python数据结构——List

一、列表 1.1创建列表 (1)构造函数创建 dataListlist() (2)直接赋值 dataList[1,2,3,4,5] 1.2添加元素到列表 dataListlist() dataList.append(3) # > [3] 1.3删除元素 (1)删除第一个匹配的元素…

ArcGIS如何处理并加载Excel中坐标数据?

做GIS行业的各位肯定免不了跟数据打交道,其中数据的处理说复杂也复杂,因为我们要花时间去做数据的转换及调整工作,那说简单也简单,因为我们有很多的工具可以使用,那么今天我就给大家带来处理Excel中的GIS数据中的其中一…

导师散养,硕博士生如何进行学术自救?

https://mp.weixin.qq.com/s/PQkL6XKoQfysq_W9kmmiDA 在公众号上看到这篇文章,觉得挺有道理! 经常在小红书看到很多学生吐槽导师散养的帖子,觉得蛮有趣的。 我整个的学术历程,可能也算是一种「散养」历程。如果说硕士是被动选择的…

图像处理02 matlab中NSCT的使用

06 matlab中NSCT的使用 最近在学习NSCT相关内容,奈何网上资源太少,简单看了些论文找了一些帖子才懂了一点点,在此分享给大家,希望有所帮助。 一.NSCT流程 首先我们先梳理一下NSCT变换的流程,只有清楚流程才更好的理清…

代码随想录算法训练营第23期day57|739. 每日温度、496.下一个更大元素

一、739. 每日温度 力扣题目链接​​​​​​ 1. 什么时候用单调栈? 通常是一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,此时就要想到可以用单调栈。 单调栈的本质是空间换时间,更直白来说,就是用一个栈来…

Python不会调试不够丝滑?那事你不会logging---剖析!

前言: 一直都是手动debug进行调试,F8都按烂了;最近用logging进行提前布置,发现这样更能让代码走得丝滑,同时也能尽早发现问题! 基本概念: Logger - 日志记录接口 Handler - 确定日志记录发送到不同的地方(文件、控制台等) Level - 定义了日…

git 构建报错

钉钉插件]当前任务未配置机器人,已跳过 org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed: WorkflowScript: 4: Tool type “maven” does not have an install of “maven-3.8.8” configured - did you mean “Maven-3.8.8”? …

高斯DWS数据库分页查询优化思路

除了高斯其它关系型数据可也一样可以使用 官方链接:EXPLAIN_数据仓库服务 GaussDB(DWS)_8.2.0_DML语法_华为云 参考链接:MySQL大数据量分页查询方法及其优化_mysql大数据量分页查询优化-CSDN博客 数据量过大,分页查询优化 背景:…

数据治理平台之数据采集细节

计算HDFS系统中分区文件的大小 利用递归对树形结构遍历 准备阶段 递归起点访问工具收集数据的容器 遍历阶段 中间节点:根据需要处理计算,收集数据,继续递归叶子节点:收集数据 写代码注意事项 不要反复连接数据库,…

类方法,静态方法和实例方法的区别及应用场景

在 Python 中,有三种不同类型的方法:实例方法、类方法和静态方法。它们各自有不同的特点和应用场景: 实例方法(Instance Method): 实例方法是最常见的方法类型,在方法定义中第一个参数通常被命…

Linux 串口应用编程

1 串口 API Linux串口通信: 在 Linux 系统中,操作设备的统一接口就是: open/ioctl/read/write 。 对于 UART ,又在 ioctl 之上封装了很多函数,主要是用来设置行规程。所以对于 UART ,编程的套路就是…

flutter vscode gradle 配置

我这边主要改了如图两个文件,然后把Gradle的问题解决了 参考文章: flutter运行Runt imeException: Timeout of 120000问题-CSDN博客 flutter配置gradle(个人笔记,非教程)_flutter gradle_追寻着星星的方向的博客-CSD…