JAVA零基础小白自学日志——第二十天

文章目录

  • 1.为什么我们需要抽象类
  • 2.抽象类
  • 3.我们一起来抽象(有病,象也没招你)
    • [1].抽象方法
    • [2].为什么我们先说抽象方法呢?
    • [3].需要明确的
  • 4.关于Object的题外话

今日提要:抽象类
你以为这几天看的内容都是多态?你太小看Java了,咱们来看看真正多态的入门

1.为什么我们需要抽象类

  • 我们先来建立一个超类class Person{........},不用解释吧,这是个人类,先放在这里,我们往下说;
    你要出出门碰见一个人要打招呼,你会说什么呢,最简单的方式就是“先生,你好!”,“女士,你好!”,从这两句话里我们其实进行了一系列的操作,首先,我们以人类为依据,为这个人类创建了两个子类“男人”和“女人”,并且实例化了子类,如果我们将上面的话默认部分都说出来,就容易理解了“先生,你好!”=“这位先生,你好!”,“女士,你好!”=“这位女士,你好!”,这都变成代码其实就是这样的
public class TestOne {public static void main(String[] args) {Person a = new Male();Person b = new Female();		}}
class Person{//......
}
class Male extends Person{//......
}
class Female extends Person{//......
}
  • 你看了看不以为然的说道,我就要实例化人类Person a = new Person(),好吧,一切听你的,你今天出门遇到一个人,然后你远远挥舞着你的手对着那个人就打了个招呼,“嗨,你好啊!人类!”,那个人迷茫的看着你回应道:“嗨,你也好啊!人类!”,听着有点怪怪的,不过好像一点都不违和呢!嗯,好吧,我承认,我这个例子非常不贴切,不过你也能看出来问题在哪里了吧
  • 有些类,尤其是父类或者基类,一旦被实例化,就会出现一些奇怪的甚至是不可预测的事情发生,如何才能让一些不能被实例化的父类不被实例化呢,抽象类就来了

2.抽象类

  • 抽象类:第一句话,它不能被实例化;第二句话,它必须被其他类扩展(抽象类的静态成员除外);
  • 第一句话是规则,编译器不会允许一个抽象类被实例化;
  • 第二句话是应用,抽象类不能被实例化,如果也不能被其它类扩展,那么抽象类,就只剩下抽象了,也就没啥存在的意义了,不过这里有一个除外的,就是抽象类里面是可以有静态成员的,也能运行一部分代码,那我写个类不好么,非要写个没有用的抽象类,总之就是抽象类不被其他类扩展的话一无是处;
  • 首先贯彻一个思想,就是确定一个类是否抽象,要看你的业务需要和代码需求
  • 最重要的一句话:抽象类就是一系列扩展抽象类的其他类的模板!!!!!
  • 记得咱们曾经说过的协议么?其实,抽象类就记录了子类的一部分公共协议;

3.我们一起来抽象(有病,象也没招你)

[1].抽象方法

  • 将方法用abstract关键字标记,这个方法就成为了抽象方法,例如:public abstract void eat();不知道你注意到了么,这个方法的结尾不是大括号,而是分号,对了,这就是抽象方法,用abstract关键字修饰,并且用分号结尾,没有方法体的方法,就是抽象方法
  • 由此也可以看出,抽象方法必须被覆盖才有意义,如果没有子类方法覆盖的话,什么用都没有,覆盖抽象方法的规则和方法重写的规则一致;

[2].为什么我们先说抽象方法呢?

  • 一个类里面如果有一个抽象方法,那么这个类必须由abstract修饰,成为抽象类;
  • 一个抽象类里面可以有抽象方法也可以有非抽象方法;
  • 由此可见,不是一个抽象类决定了方法是不是抽象的,而是一个抽象方法的存在决定了一个类是不是抽象类;
  • 还有一句话必须记住,在一个继承树中,第一个出现的具体类(第一个出现的具体类,不是第一个出现的类,因为抽象类的子类有可能也是一个抽象类),必须实现所有抽象方法(记住了,是所有!!!!);

[3].需要明确的

  • 抽象方法不能用private\final\static关键字修饰,因为抽象方法就是用来被继承,被重写的,所有阻断继承的关键字都不可以用
  • 抽象类就是继承树中创建新类的模板,主要用于继承,是为了便于扩展和维护而存在的;
public class TestOne {public static void main(String[] args) {Staff s1,s2;s1 = new FemaleEmployees();s2 = new MaleEmployees();s1.staffInfo("小张", 20, "文员");s2.staffInfo("小李", 30, "销售");}
}abstract class Staff{static String COMPANY;String name;	int age;	String job;Staff(){COMPANY = "XX科技公司";}public abstract void staffInfo(String name,int age,String job);	}class FemaleEmployees extends Staff{static String GENDER;FemaleEmployees(){super();		GENDER = "女";}@Overridepublic void staffInfo(String name,int age,String job) {super.name = name;super.age = age;super.job = job;System.out.println("姓名: " + name + ", 性别: " + GENDER + ", 年龄: " + age + ", 职位: " + job + ", 公司: " + COMPANY);}	
}class MaleEmployees extends Staff{static String GENDER;MaleEmployees(){super();		GENDER = "男";}@Overridepublic void staffInfo(String name,int age,String job) {super.name = name;super.age = age;super.job = job;System.out.println("姓名: " + name + ", 性别: " + GENDER + ", 年龄: " + age + ", 职位: " + job + ", 公司: " + COMPANY);}	
}

输出结果:

姓名: 小张, 性别: 女, 年龄: 20, 职位: 文员, 公司: XX科技公司
姓名: 小李, 性别: 男, 年龄: 30, 职位: 销售, 公司: XX科技公司

上面这段代码基本可以说明问题,只是非常难看而已,但是代码本来也是越写越顺的么,我有信心

4.关于Object的题外话

虽然Object是所有类的祖宗,不过Object不是抽象类,Object是可以被实例化的,不过不要因为Object可以被实例化,而轻易使用Object进行多态引用,那是非常不明智的。

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

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

相关文章

复现Android中GridView的bug并解决

几年前的一个bug,GridView的item高度不一致。如下图: 复现bug的代码: import android.os.Bundle; import android.widget.BaseAdapter; import android.widget.GridView; import androidx.appcompat.app.AppCompatActivity; import java.uti…

麻省理工学院 - MIT - 线性代数学习笔记

学习视频地址 文章目录 1.01方程组的几何解释2.02矩阵消元3.03乘法和逆矩阵乘法逆 4.04矩阵A的LU分解5.05转置,置换,向量空间置换转置向量空间 6.06列空间和零空间7.07求解Ax0:主变量,特解 1.01方程组的几何解释 对于二元方程组&…

Scratch自制:《袁坤》游戏攻略

大家好!我也是很久没有动静了,这次我又来了,并且还带来了一个用Scratch制作的游戏,大家还记得我很久以前用C制作的《袁坤》吗?(详见C自制游戏《袁坤》1.2版本发布!-CSDN博客)这次它又…

种类并查集

最近玩的太嗨了,都忘了自己还有三篇博客还在拖更,也是今天一更到底好吧,边更新边写题,让看官老爷有更多的样题去联系 引入—— 在学这个之前,我相信各位应该已经接触过了并查集了吧,嗯?什么&a…

Kubernetes 1.24 版弃用 Dockershim 后如何迁移到 containerd 和 CRI-O

在本系列的上一篇文章中,我们讨论了什么是 CRI 和 OCI,Docker、containerd、CRI-O 之间的区别以及它们的架构等。最近,我们得知 Docker 即将从 kubernetes 中弃用!(查看 kubernetes 官方的这篇文章)那么让我…

VSCODE 下 openocd Jlink 的配置笔记

title: VSCODE 下 openocd Jlink 的配置笔记 tags: STM32HalCubemax 文章目录 内容VSCODE 下 openocd Jlink 的配置笔记安装完成后修改jlink的配置文件然后修改你的下载器为jlink烧录你的项目绝对会出现下面的问题那么打开下载的第一个软件 (点到这个jlink右键&…

Kafka架构详解之分区Partition

目录 一、简介二、架构三、分区Partition1.分区概念2.Offsets(偏移量)和消息的顺序3.分区如何为Kafka提供扩展能力4.producer写入策略5.consumer消费机制 一、简介 Apache Kafka 是分布式发布 - 订阅消息系统,在 kafka 官网上对 kafka 的定义…

你有多自律就有多自由

当你失去对时间的控制权,生活也就失去了平衡。 真正对自己有要求的人,都是高度自律的人。 追求自己想要的生活,任何时候开始都不会晚,关键在于你能够坚持下去,以高度自律的精神,日复一日、年复一年的坚持下…

【11】微服务链路追踪SkyWalking

1、skywalking是什么 1.1 链路追踪介绍 对于一个大型的几十个、几百个微服务构成的微服务架构系统,通常会遇到下面一些问题,比如: 如何串联整个调用链路,快速定位问题?如何缕清各个微服务之间的依赖关系?…

【AI学习】LLaMA 系列模型的进化(二)

在前面LLaMA 系列模型的进化(一)中学习了LLama模型的总体进化发展,再来看看其中涉及的一些重要技术。 PreLayerNorm Layer Norm有Pre-LN和Post-LN两种。Layer Normalization(LN)在Transformer架构中的放置位置对模型…

基于PaddleOCR + NLP实现证件识别

基于PaddleOCR NLP实现证件识别 PaddleOCR识别paddleOCR安装安装 anconda虚拟环境(可参考yolov5的安装教程) paddleOCR识别PaddleNLP模型信息抽取paddle打包exe 进行ocr识别 什么是PaddleOCR? PaddleOCR 旨在打造一套丰富、领先、且实用的 OCR 工具库,助…

【HarmonyOS开发】Navigation使用

简介 Navigation是路由容器组件,包括单栏(Stack)、分栏(Split)和自适应(Auto)三种显示模式。适用于模块内和跨模块的路由切换。 在页面跳转时,应该使用页面路由router,在页面内的页面跳转时,建议使用Navigation达到更好的转场动效…

Spring Boot集成Spring Batch快速入门Demo

1.什么是Spring Batch? Spring Batch 是一个轻量级的开源框架,它提供了一种简单的方式来处理大量的数据。它基于Spring框架,提供了一套批处理框架,可以处理各种类型的批处理任务,如ETL、数据导入/导出、报表生成等。S…

Armv8/Armv9架构的学习大纲-学习方法-自学路线-付费学习路线

本文给大家列出了Arm架构的学习大纲、学习方法、自学路线、付费学习路线。有兴趣的可以关注,希望对您有帮助。 如果大家有需要的,欢迎关注我的CSDN课程:https://edu.csdn.net/lecturer/6964 ARM 64位架构介绍 ARM 64位架构介绍 ARM架构概况…

Codeforces Round 959 (Div. 1 + Div. 2 ABCDEFG 题) 文字讲解+视频讲解

Problem A. Diverse Game Statement 给定 n m n\times m nm 的矩形 a a a, a a a 中的每一个数均在 1 ∼ n m 1\sim nm 1∼nm 之间且互不相同。求出 n m n\times m nm 的矩形 b b b, b b b 中的每一个数均在 1 ∼ n m 1\sim nm 1∼nm 之间且互…

uniapp,vue3上传图片组件封装

首先创建一个 components 文件在里面进行组件的创建 下面是 vip组件的封装 也就是图片上传组件 只是我的命名是随便起的 <template><!--图片 --><view class"up-page"><!--图片--><view class"show-box" v-for"(item,ind…

蓝桥杯Python算法竞赛常用的函数库

博客主页&#xff1a;音符犹如代码系列专栏&#xff1a;Python关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ ​ 目录 math collectcions heapq functool itertools 常用的库函数 m…

开源的语音合成工具_ChatTTS_用法及资源

1 引言 5 月开源的 ChatTTS&#xff0c;最近文章十篇里有五篇以上都在讨论它。很多新的 TTS 模型也用它来做比较。感觉没用过 ChatTTS 都不敢评测其他的。 目前&#xff0c;ChatTTS 支持英文和中文。在 arxiv 上没找到相关论文&#xff0c;所以本文主要评测使用感受。 &…

web服务器1

&#xff08; 1 &#xff09;仅提供用户浏览的单向静态网页 单纯是由服务器单向提供数据给客户端&#xff0c; Server 不需要与 client 端有互动&#xff0c;所以你可以到该网站上去浏 览&#xff0c;但是无法进行数据的上传。 &#xff08; 2 &#xff09;提供用户互动接口的…

深入理解Linux网络(三):TCP对象创建

深入理解Linux网络&#xff08;三&#xff09;&#xff1a;TCP对象创建 TCP对象创建inet_createsock_init_data TCP对象创建 常见的三句TCP编程&#xff1a; int main() {int sk socket(AF_INET, SOCK_STREAM, 0);connect(sk, ...)recv(sk, ...) }简单的两三⾏代码&#xff…