突破Java编程的关键:揭示封装、继承和多态的核心原理与实际应用

news2024/11/18 11:33:22

Java中的封装、继承和多态知识点是学习java必备的基础知识,看似简单,真正理解起来还是有一定难度的,今天小编再次通过实例代码给大家讲解java 封装继承多态知识,感兴趣的朋友一起学习下吧。

封装

所谓的封装就是把类的属性和方法使用private修饰,不允许类的调用者直接访问,我们定义如下一个类,可以看到所有的成员变量和成员方法都使用private修饰了,我们现在来使用一下这个类。

801e6274fd76811205e2af54555507d7.jpeg

打开百度APP看高清图片

当我们使用的时候编译器给出了下面这样的报错。

eade5a9e912c53cb8df5e31d09ec949b.jpeg

告诉我们说是private访问控制,那么这是什么意思呢?我们来看看另外一张图,那么这张图代表着什么呢?在看这张图之前,我们先来看看四者都提到的包,那么包又是什么呢,包可以简单理解为一个文件夹,把类放到放到包里面,也就相当于是专门的文件夹里面,这不是我们说的重点,知道就行,类都知道吧,不知道的先去看看博主这篇博客类和对象再回来继续往下。

ps:稍微记一下这张图中的内容。

3f7b13d269286e1ed68a824c22ab264c.jpeg 5037c3430cc6e6065fe51452b049f093.jpeg

有了上面的基础我们现在再来看private,他的使用范围只有 同一个包中的同一个类中使用(这个范围也就是他的权限),我们就记住只能在我们定义的那个类中使用就好了,别问为什么,因为这就是语法,记住就好了,记准确了是当前类中,不能外部引用,否则就会出现上面那样的报错。既然不能直接从外部引用,那么类的调用者总得有个办法使用吧,不然实现这个类干嘛,这个时候就是我们在设计类的时候要提供的公开的方法了,那么上述的代码应该写成如下形式。

cc4325c57db03a14d8f917d07d86c6ed.jpeg 25f1c91fabcbe8d22742b4cb2e6064d7.jpeg

ps:这里重写了toString方法才会是下面的输出形式。上面就是调用了,那么有的读者可能就会问了,那你的eat方法还是private的呀,我还是不能调用啊,这里我解释一下,这是因为我是为了演示private的作用而在eat方法前面加的private,运行时我将它注释掉了,至于实际上像eat这样需要被类的调用者直接使用的方法,肯定是不能使用private修饰的,至于用什么访问权限修饰这就是类的设计者根据日后业务的需要而决定了。封装的第一个作用就是为了不直接被外部使用,提高代码的安全性,第二个作用就是降低类的使用者的学习成本,不需要知道类的实现,只需要学会调用就好了,封装差不多就介绍完了,接下来聊聊继承。

继承

所谓继承本质就是实现代码的复用,防止重复的代码多次书写,当一个类继承一个类的时候,该类中就会拥有另外一个类中的所有代码,举个例子看下面代码

d85164ccf209228a966c1c92f3168ce9.jpeg

可以看到继承的语法形式是class 子类名 extends 父类名,继承类就是子类,也叫派生类,被继承的类称为父类,基类或者超类(名字一般不做区分,均可使用),语法形式很简单,我们来聊聊其中的细节,首先Java是单继承的, 一个子类只能有一个父类,但是一个子类可以当作另外一个类的父类,即可以B继承A,然后C继承B,代码如下,那么B会拥有A中的代码,C会拥有A、B的代码。

2f1e5ad819c708116f032f9a598c2cf8.jpeg

下面讲的普通类继承知识都是基于父类是公开的并单独位于一个.java文件的。我们定义一个这样的Animal类当作父类:

6e1fa3b7b588d297685cfa83d97c55df.jpeg

当访问使用private修饰的属性时就会报错,这个就是上面封装的知识了,只能在定义的类中使用。

35380234ab4b51ec0b7b964608776340.jpeg

当去掉private不加任何修饰符时为包访问权限(对应上面的default范围,至于default关键字的使用在接口当中会提到),当前包底下的类才能使用Animal中的属性。

eb1fe3e12547941232bf1e61bbfadce1.jpeg 99302627e2ea33eb5a2f2213582c85a3.jpeg

当使用protected修饰时,是可以在子类中调用的,那么下面为什么会报错呢,那是因为调用的方式不对,这里我们需要改变访

问方式并使用到super关键字。

0f0aaab45a411caf04a24ce7bfe7921e.jpeg 24d110061e608c55082ca16df0028b79.jpeg

改为如下调用,在子类中调用,并使用super关键字,而不是通过实例化对象调用,上面那张图除了提到包还提到了类,小伙伴们注意到了吗?不记得的小伙伴们就往上翻再看看那张图吧。

c982907f90b4e10e52d686cc44427ce6.jpeg

至于public没啥好说的,哪都能用。上面呢介绍了继承普通类的知识,现在我们来看看不太正常的类,抽象类,抽象类是指被abstract修饰,包含抽象方法的类,如下就是一个抽象类,首先是类名前面添加了abstract关键字,其次是其中包含了一个抽象方法,什么是抽象方法,就是没有被具体实现的方法,如下图的work方法,没有方法体,并被abstract修饰,不加的话会报错,被abstract修饰的类中可以没有抽象方法,这是语法允许的(jdk1.8测出来的),但是建议同步使用,要么既有abstract修饰类又有abstract方法,要么都没有,不然使用了abstract修饰类又不加abstract方法这不是闹吗,除非你不想这个类直接被实例化,注意一点,abstract修饰的类不能直接被实例化,需要被继承之后通过子类调用父类的构造方法,对从父类继承过来的字段进行初始化,注意这些继承过来的字段和方法都到了子类中了,但是子类能不能使用和如何使用就和给的权限(使用了什么访问修饰符限定)相关了,并没有实例化产生一个父类对象,有些地方说会实例化一个父类对象这是不对的,说一个极端的说法,父类为抽象类你能实例化吗?

a911ed93a4dfc294d11a5af3f1d16085.jpeg 2ba9fa30167497b6ad97c85becad6cec.jpeg

当一个普通类继承一个抽象类的时候需要重写抽象类的所有抽象方法,如果不想重写的话就需要声明为抽象类,看下面代码

733227e3edd0bb6d2bd23e13b5ce4500.jpeg 6171e7dc69f25a8d18c1d109904922df.jpeg

继承主要是为了代码的复用,减少代码的重复书写和为多态打一个基础,接下来我们聊聊多态

多态

多态是一种思想,是同一份代码,不同的传参(子类)调用会产生不同的效果,绝对不是写死的代码多态是建立在继承机制上的一种机制,想要了解多态就必须知道向上转型,那么什么是向上转型呢,所谓的向上转型就是使用父类对象的引用,引用子类对象看下面代码

865436dcca80a6f4c3da81abb43cf36f.jpeg 3a5715114a27640be10c337ffd434a00.jpeg

eacher是People的一个子类,使用People引用引用一个Teacher对象,向上转型是自动发生的,不需要进行强制类型转换,发生向上转型一般有三种情况1.像上面代码一样,让父类引用直接引用子类对象时。2.子类作为函数调用时的实参,使用父类形参接收时。3.子类作为父类返回值函数的返回值时。总的说就是父类引用引用了子类对象

12efdd4336f05d6ba517e857c83b6e0b.jpeg

红色的框表示第二种,橘黄色的框表示第三种

ps:不难理解吧QAQ

与向上转型对应的还有向下转型,就是将父类对象赋值给子类引用,一般很少用的,就简单地提一下吧,因为他发生条件比较严格,首先是不能直接强制类型转换,看下面代码(已经将People类变成了类)

ac4c01b7fd0b7e01dd2b6ef3936c7a39.jpeg

其次是需要父类引用引用子类的对象(发生过向上转型),最后需要强制转换为对应的子类对象,像下面这样

edf4b83021669a661b2484e23e5ee040.jpeg

ps:这东西用起来挺奇怪的,不太建议使用

到这里相信你应该知道什么叫做向上转型了,但是这还不足以接触多态,我们需要先来聊聊另外一个知识点,动态绑定,所谓动态绑定也叫运行时绑定,我们先来看看代码

e29f2832a163d3f41ec19c8cedd5ea9f.jpeg 59605c9deb19f8f53d7b8f27daf3ebea.jpeg

先可以看到三个输出,第一个输出睡觉,第三个输出教书没问题吧,问题就出在第二个上面,我明明调用的是people的work方法,为什么输出的不是睡觉,而是教书呢?这就是发生了动态绑定,所谓动态绑定就是使用父类引用引用子类对象然后(向上转型)去调用父类和子类相同的方法(返回值(构成父子类关系也可以,也就是协变类型),方法名,形参列表完全相同)换句话说也就是说在子类中重写了父类的方法,这样的重写需要注意一些点,那就是子类重写的方法的访问权限必须不小于父类的方法的权限也就是说父类为public子类就必须为public因为public是最大的权限,权限对应上图的 的个数√越多权限越大,静态方法不能重写,被final修饰的方法(密封方法)不能重写。ps:与动态绑定对应的还有静态绑定,这里就不多说了…好了,知道了向上转型和动态绑定就可以了解多态了,看代码

2c0ba56d3587f206122adbd512a7bc0d.jpeg

是不是觉得很神奇,明明是指向了同一份代码却打印了不同的结果,这就是多态,我不管你怎么实现的方法,只要你有这个方法我就能帮你调用,并且这里如果是子类对象会发生向上转型,进而发生动态绑定,形成多态,上面是通过继承来实现的多态,接下来我们再来讲一个东西实现多态,接口

接口

那么接口是什么呢,接口也可以想象成一个类,但是它既然单独出现,肯定说明它和类有有所不同,首先接口由interface关键字定义,并且其中的所有方法都默认为public abstract的,所有字段都默认为public static final的,下面几种定义方式并无区别。

6860284ab08b2af434c76533a03bc53a.jpeg

然后类似与继承,接口可以通过implements被实现,实现也很简单,和继承抽象类一样重写所有的抽象方法即可,同样接口不

能被直接实例化。

45ad49d063eb31370cccfb524a8874e5.jpeg

有了上面的了解,我们来用接口实现多态,看下面代码,也和类实现多态没什么很大区别,也类似与发生了向上转型和动态绑定,实现接口和继承类的一个很大区别就是一个类只能继承一个类,但是一个类可以实现多个接口。

470097f3a78f6f424f18e14494ab895f.jpeg 3c12d0acf340926bb99bcc51f287a558.jpeg

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

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

相关文章

工具及方法 - TagSpaces

如今电子资料实在太多,每个人都可以访问和存储到大量的数据,可如何整理却是个伤脑筋的麻烦事。 我以前用过Canto的Cumulus,是一个local的digital asset management (DAM)软件,但现在已经变成云端的了,本地客户端的新版…

MySQL 主从复制原理

文章目录 1.主从复制方式1.1 异步复制1.2 半同步复制1.3 全同步复制 2.主从复制原理3.主从复制时推还是拉?参考文献 主从复制是 MySQL 高可用(备份)和高性能(读写分离)的基础,有了这个基础,MySQ…

微信小程序自定义组件及投票管理与个人中心界面搭建

14天阅读挑战赛 人生本来就没定义,任何的价值都是自己赋予。 目录 一、自定义tabs组件 1.1 创建自定义组件 1.2 tabs.wxml 编写组件界面 1.3 tabs.wxss 设计样式 1.4 tabs.js 定义组件的属性及事件 二、自定义组件使用 2.1 引用组件 2.2 编写会议界面内容 …

【迎战2023双十一】小白也能玩转!手把手教你实时获取多平台店铺数据,轻松实现数据大屏展示

要实时获取多平台店铺数据进行数据大屏展示,需要进行以下步骤: 确定数据采集方式:通过爬虫程序(如Python的BeautifulSoup、Scrapy等爬虫框架)或API接口来实现数据的获取,确定该方法所需的数据格式和调用方…

如何搭建远程控制家中设备的Home Assistant智能家居系统【内网穿透】

文章目录 前言1. 安装Home Assistant2. 配置Home Assistant3. 安装cpolar内网穿透3.1 windows系统3.2 Linux系统3.3 macOS系统 4. 映射Home Assistant端口5. 公网访问Home Assistant6. 固定公网地址6.1 保留一个固定二级子域名6.2 配置固定二级子域名 7、结语 前言 Home Assis…

冰蝎默认加密的流量解密

破解冰蝎的默认加密 流量包分析 上传的冰蝎流量包 POST /web-zh/DVWA/vulnerabilities/upload/ HTTP/1.1 Host: 192.168.197.111 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/118.0 Accept: text/html,application/xhtmlxml,a…

逐字稿 | 8 视频理解论文串讲(上)【论文精读】

目录 1 自从 Alexnet 之后,对视频理解的研究就从这种手工特征慢慢转移到卷积神经网络了。 ​编辑 1.1Deep video——深度学习时代,使用卷积神经网络去处理视频理解问题的最早期的工作之一 1.2如何把卷积神经网络,从图片识别应用到视频识别…

深度学习YOLOv4环境配置

软件安装 1、什么是CUDA CUDA(ComputeUnified Device Architecture),是显卡厂商NVIDIA推出的运算平台。 CUDA是一种由NVIDIA推出的通用并行计算架构,该架构使GPU能够解决复杂的计算问题。 CUDA下载地址为CUDA Toolkit Archive | NVIDIA Developer 版…

Python数据挖掘项目实战——自动售货机销售数据可视化分析及销售额预测

👨‍🎓博主简介 🏅云计算领域优质创作者   🏅华为云开发者社区专家博主   🏅阿里云开发者社区专家博主 💊交流社区:运维交流社区 欢迎大家的加入! 🐋 希望大家多多支…

凉鞋的 Unity 笔记 202. 变量概述与简介

202. 变量概述与简介 想要用好变量不是一件简单的事情,因为变量需要命名。 我们可以从两个角度看待一个变量,第一个角度是变量的功能,第二个是变量的可读性。 变量的功能其实非常简单,变量可以存储一个值,这个值是特…

Leetcode—137.只出现一次的数字II【中等】

2023每日刷题&#xff08;二&#xff09; Leetcode—137.只出现一次的数字II 没有满足空间复杂度的Map题解 class Solution { public:int singleNumber(vector<int>& nums) {unordered_map<int, int>count;for(int iter: nums) {count[iter];}int ans 0;for(…

混凝土板材及砌块生产线数字孪生可视化管理系统,实现智慧工厂车间智能化数字化管理

混凝土板材及砌块生产线数字孪生可视化管理系统&#xff0c;实现智慧工厂车间智能化数字化管理。随着国家智能制造的高质量快速发展&#xff0c;生产线数字孪生可视化管理系统已成为企业管理中不可或缺的一部分。巨蟹数科利用数字孪生平台开发建模和VR虚拟仿真技术&#xff0c;…

C4D 2024插件Arnold mac(C4D S2024阿诺德渲染器) 中文版介绍

Arnold for Cinema 4D mac是一款先进的蒙特卡洛光线追踪渲染器&#xff0c;专为动画长度和视觉效果的需求而打造。C4DtoA 4.6.6.1 使用Arnold 7.2.4.1&#xff0c;是一个错误修复版本。带来了对 Cinema 4D 2024 中 OCIO 颜色管理的支持、对 OSL 元数据支持的改进和一些错误修复…

CSS记录

1.标准的CSS的盒子模型&#xff1f;与低版本IE的盒子模型有什么不同的&#xff1f; 标准盒子模型box-sizing: border-box; 宽度内容的宽度&#xff08;content&#xff09; border padding margin 低版本IE盒子模型&#xff1a;宽度内容宽度&#xff08;contentborderpaddin…

pip install AE 报错 Preparing metadata (setup.py) ... error

环境配置&#xff1a; ubuntu 18. python 3.7 1. 问题描述&#xff1a; 运行图像编码算法时 GAACNN时&#xff0c;提示AE模块不存在。尝试安装时&#xff0c;报错如下&#xff1a; Pip install 时报错&#xff1a; 2. 解决办法 &#xff08;1&#xff09;文件修改 进入GA…

开源游戏引擎和模拟器的项目合集 | 开源专题 No.38

yuzu-emu/yuzu Stars: 26.2k License: GPL-3.0 yuzu是一款全球最受欢迎的开源Nintendo Switch模拟器&#xff0c;由Citra创建者编写。它采用C语言编写&#xff0c;并具有可移植性&#xff0c;在Windows和Linux上进行积极维护。该模拟器能够全速运行大多数商业游戏&#xff0c…

接口测试面试题整理​​​​​​​

HTTP, HTTPS协议 什么是DNSHTTP协议怎么抓取HTTPS协议说出请求接口中常见的返回状态码http协议请求方式HTTP和HTTPS协议区别HTTP和HTTPS实现机有什么不同POST和GET的区别HTTP请求报文与响应报文格式什么是Http协议无状态协议?怎么解决HTTP协议无状态协议常见的POST提交数据方…

【PXIE301-211】基于PXIE总线的16路并行LVDS数据采集、4路低速、2路隔离RS422数据处理平台

板卡概述 PXIE301-211A是一款基于PXIE总线架构的16路高速LVDS、4路低速LVDS采集、2路隔离RS422数据处理平台&#xff0c;该平台板卡采用Xilinx的高性能Kintex 7系列FPGA XC7K325T作为实时处理器&#xff0c;实现各个接口之间的互联。板载1组64位的DDR3 SDRAM用作数据缓存。板卡…

Datawhale-新能源时间序列赛事学习笔记(1)

1.赛题描述 在电动汽车充电站运营管理中&#xff0c;准确预测充电站的电量需求对于提高充电站运营服务水平和优化区域电网供给能力非常关键。本次赛题旨在建立站点充电量预测模型&#xff0c;根据充电站的相关信息和历史电量数据&#xff0c;准确预测未来某段时间内充电站的充电…

COCO数据集解析

介绍 官网&#xff1a;https://cocodataset.org/ 下载地址&#xff1a;https://cocodataset.org/#download COCO的全称是Common Objects in COntext&#xff0c;起源于微软于2014年出资标注党的Microsoft COCO数据&#xff0c;与ImageNet竞赛一样&#xff0c;是计算机视觉领域…