Java基础知识之封装+继承+多态详解

article/2025/9/18 13:41:30

前言

这篇博客是基于Java类和对象的基础之上的相关知识点。因为特别重要且语法规则较多,所以想单独总结方便之后复习。

本篇博客涉及知识点思维导图:

目录

     1.封装

     2.继承

     3.多态


1.封装

          生活中有很多东西我们并不想让其它人知道,比如我的身份证号码,我的存款等等。在Java语言中,我们就需要了解java面向对象的三大特性之一——封装

         封装就是隐藏对象的属性和实现细节,仅提供公共访问方式来让外界访问。比如。那么问题来了,我们该如何实现封装呢?这就涉及到了Java中访问修饰符的知识。在Java语言中,访问修饰符分为四类:private,默认(什么也不加),protected,public。那它们有什么作用呢?我们从private修饰符开始:

 可以看出Person类中用private修饰的成员变量,只能在Person类中使用,且只能由我们决定外界是否能访问它。如果我们想要外界访问它,只能提供公开访问的方法让外界可以去访问,这里我们给私有属性name提供setName和getName方法,外界就可以通过setName方法对私有属性name的值进行修改,且能使用getName方法去获得name的值,具体实现如下:

运行结果:


因为接下来的知识点涉及到包的概念,我先简单给大家介绍一下包的概念及使用。

其实包 类比于我们磁盘下的文件夹(树形结构),如图:

 这就能更好的管理我们的Java文件,且能一定程度上避免因为类同名造成的冲突。

 Java也有很多自带的包,当我们要使用Java中某个类时,也需要进行导包(导入某个包的要使用的类),如当我们需要获取用户输入的数据时,得用到Scanner类,这时候就要在Java文件中导入util包下的Scanner类:

 当然啦!我们也可以创建自己的包,步骤如下:

 

注:开头com.example位置一般为公司所对应的域名的倒置,且包名的每个部分都对应一个子目录。

包创建成功后,点击齿轮--->Tree Appearance--->Compact Middle Packages 可以显示每个子目录:

 

这样选中包下的对应目录,右击便可以创建.java文件了。


接下来我们继续讲默认(什么都不加)的访问限定符。如图:

 

成功运行并输出:

 

那如果是在不同包的类中可以访问用默认访问限定符修饰的成员变量或方法吗?

编译失败,由此我们可以知道,name用默认访问限定符修饰,所以不能在不同包的类中使用。所以我们也将默认访问限定符叫做包访问权限,也就是说使用默认访问限定符修饰的成员变量或方法是不能在不同包的类中访问的。


Java类中用public访问限定符修饰的成员变量或方法不管是在不同类还是不同包都可以访问,处处可修改并获取。我们来测试一下~:

同一个包的不同类:

 

不同包的不同类:

 由图看出,用public访问限定符修饰的成员变量在任何位置都可以访问。所以public访问限定符也叫公共访问权限。

最后附上四种访问限定符的权限范围表格:

 注:因为protected访问限定符的使用涉及到继承的知识点,所以咱先不讲。


2.继承

     想到继承,大家可能都跟我一样首先想到的是父亲留下的财产继承(都是大孝子哈哈哈哈哈)。但是在Java中继承就是将某些(B,C,D....)类中相同属性提取出来放入A类中,用extends关键字实现继承之后,那A类就成为这些类的父类,而这些类就会被称为A类的子类。为了方便大家理解,可以看看我画的逻辑图例:

蓝色框框的就是学生和老师共有的属性和行为,Person类为Student类和Teacher类。 具体代码实现:

 在main方法中测试结果:

 大家可以看出,我们可以使用子类继承父类(共性的抽取)的方式去实现代码的复用

那么这时候又有一个问题了:如果父类中的某成员变量是private私人的,子类还会继承和该成员变量或方吗?我们来调试一下:

  

 从图中可以得出:子类无法访问父类中用private修饰成员变量。打开调试,我们看看student和teacher对象中是否继承了父类中用private修饰的name成员变量:

这样我们可以得出:父类中用private修饰的成员变量是会被子类继承的,但是不能直接访问,只能通过公共访问的成员方法对其进行访问。如下:

这时候大家可能就会想:如果父类中的成员属性名或方法名和子类中成员属性名或方法名同名,那访问的是子类的成员还是父类的?一切问题从调试开始:

由图我们可以得出:当父类成员变量与子类成员变量出现同名冲突时,优先访问子类的成员变量。

那我们就想访问父类中的同名成员变量呢?这时候就得用到super这个关键字(注:其不是父类的引用,只是个关键字,用于更直观地理解代码),使用super. 成员变量名访问父类中同名的成员变量,super.成员方法名()访问父类中同名的成员方法。测试如下:

 接下来大家可以想想这段代码为什么会报错?

哎我就想在创建父类的时候就对name进行初始化,所以给它写上了一个构造方法,然后子类编译错误了。大家仔细看看报错提示: 

在我上篇博客中,提到过这个知识点,也就是每个类编译器都会生成一份默认无参的构造方法(但是不会显示出来),但是当我提供了任意的构造方法后,那编译器提供的默认无参的构造方法就不会生成。那为什么我不自定义构造方法时,子类不会报错呢?由此可以得出,子类会默认帮助父类进行初始化。当我给父类自定义构造方法时,父类默认无参构造方法不存在,那子类就无法默认帮父类进行无参构造,所以才会编译失败。这里我们还是使用super(...)调用父类的构造方法帮助父类构造。(帮助父类的成员变量进行初始化)

 嘿嘿不报错了~但是大家还要注意一点哦:子类帮助父类进行构造只能在子类构造方法的第一行哦!这时候大家可能就会问了那想用this调用子类其它构造方法,也要放第一行,那这两者谁先谁后啊?答案是它俩不能一起用!(要打架就把它们分开) ,大家看如下测试:

看不是我在胡说八道吧!嘿嘿连编译错误提示都说super()必须得放第一行。

看它俩都要第一行,所以当子类帮助父类构造时是不能使用this调用子类另一个构造方法的。

但是这样是可以的:

相信大家都能对继承有初步的认识并且了解了一些语法规则。

当你不想某个类被继承时,可以加final(修饰变量时变量无法更改,修饰方法时,方法不能重写)修饰:

注:Java中只允许单继承,不能多继承哦!就像我们例子中的学生类和老师类一样,它们都只有一个父类(类比于每个人的亲生父亲只有一个),但是它们可以多层继承,如图:

编译错误提示:不能继承多个类

支持多层继承


3.多态

     在我们现实生活中,多个人做同一件事不可能完全相同,比如对于吃饭这件事,有的人吃冒菜,有的人吃螺蛳粉,有的人吃烧烤等等。在Java中,多态是同一个行为具有不同的表现方式或形态。那在什么条件下,才能实现多态呢?答案是:在继承的基础上,重写父类中的成员方法并定义父类引用指向子类对象(向上转型)

示例(还是以人为例,更好理解)如下:

大家可能疑问既然有向上转型(不用进行强制转换,可以调用父类中所有成员,但是不能调用子类中特有成员),那有向下转型吗?答案是:有,向下转型(子类对象指向父类引用)与向上转型相反,但是它是不安全的,如果父类引用对象是父类本身,进行向下转型时,即使 使用强制类型转换后,也只能保证编译不出错,运行时还是会报无法进行强制类型转换的错误。(一般用instanceof运算符避免这种错误)。如下:

 只有当父类引用指向子类对象,再进行向下转型时,才是安全的

注:不管的进行向上转型还是向下转型,都是要在继承的基础上才可以。

说到这里,大家一定会对重写产生疑问吧?其实重写很好理解,本质就是在不改变父类原有成员方法(一定要是非静态,非private,final修饰,非构造方法...)的基础上,重新在子类中实现该方法。跟重载不同的是重写的参数,返回值类型(除非两个返回值类型构成父子关系)和访问限定符(子类的访问权限必须得比父类的访问权限大或相等)都不能修改!

注:尽量避免在子类构造方法中调用重写方法,不然可能会造成子类对象还未构造完成,在使用其成员变量时,成员变量为默认值而不是其初始化后的值。


以上就是我对Java面向对象三大特性的理解,欢迎大家和我一起探讨学习,共同进步~


http://chatgpt.dhexx.cn/article/hL6a81jd.shtml

相关文章

封装、继承和多态

目录 前言一、什么是封装?二、什么是继承?三、什么是多态? 前言 其实封装、继承和多态不仅仅是java的特性,而是所有面向对象程序的三大特性。 一、什么是封装? 封装就是对类内部的实现细节进行隐藏,然后…

封装、继承、多态 详解

面向对象的三个基本特征:封装、继承、多态 1.封装 (1)封装是实现面向对象的第一步,封装就是将数据或函数等集合在一个单元中(类)。被封装的对象通常被称为抽象数据类型。 (2)类具…

面向对象编程三大特性------封装、继承、多态

一、封装 封装从字面上来理解就是包装的意思,专业点就是信息隐藏,是指利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体,数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节&am…

人脸识别API接口 活体检测 人证比对 人身核验

技术原理 l通过自拍获得自拍照,或者通过活体SDK获得活体照片; l通过姓名、身份证号获得公安带网纹照片,通过去网纹技术得到清晰照片; l自拍照或者活体照片与公安照片进行比对; l确认用户与比对证件为同一人。 适用…

浅谈私有云端的人脸识别与人证比对

人脸识别,是基于人的脸部特征信息进行身份识别的一种生物识别技术。用摄像机或摄像头采集含有人脸的图像或视频流,并自动在图像中检测和跟踪人脸,进而对检测到的人脸进行脸部识别的一系列相关技术,通常也叫做人像识别、面部识别。 而私有云人脸识别人证对比系统是一款基于…

论文精读|大规模双样学习用于人证比对

点击上方“AI公园”,关注公众号 之前分享过Docface,Docface,这篇是在Docface之前的一篇文章,也是专门处理人证比对问题,也是用到了imprint的技术,Docface就是参考了这篇文章中的imprint。 Large-scale Bisample Learni…

基于人脸识别开发人证比对访客系统

2019独角兽企业重金招聘Python工程师标准>>> 原作者 panmingzhi 最近有个小区用到了虹软的人脸识别,效果还不错。又有一个项目要用人证访客对比,分享一下项目,希望可以帮到有需要的。 码字前先上项目地址:https://gite…

人脸识别技术开发人证比对访客系统

原作者 panmingzhi 最近有个小区用到了虹软的人脸识别,效果还不错。又有一个项目要用人证访客对比,分享一下项目,希望可以帮到有需要的。 码字前先上项目地址:https://gitee.com/panmingzhi/IdCardFaceIdentifier 首先是读证的问题…

人脸识别、人证比对核验数据特点

一、人证合一验证系统产品简介: 人证合一验证系统是一套利用专业证件扫描设备和身份证阅读机具,实现采集持证人相片与所持证件人相关信息发送至公安部身份证副本库进行生物特征比对,验证人与证是否一致的软硬件结合系统。 从技术上基本解决了这两个主要问题:利用经公安部…

双目活体检测摄像头|离线式人证比对|人脸识别SDK

产品概述 中安未来双目防伪人证核验设备(TH-DE300)是一款基于中安未来自主独立研 发的双目多光谱生物识别技术,打造的一体化终端产品,主要适用于需要进行人证合一验证 的业务场景,对被验证人员身份进行验证。如防止冒用他人办理业务、刷脸控制…

人脸识别人证比对技术SDK

人脸识别人证比对技术SDK 人脸识别人证比对技术SDK 一、人脸识别人证比对技术1:1及1:N概念 人脸识别人证比对技术1:1如我们现在在宾馆、网吧、机场安检等的人与身份证上的照片进行比对的应用,用来证明自己是自己。想想,目前我们在…

人证比对的解决方案

人证比对的解决方案 目前,人证比对应用的场景很多:机场、高铁站过安检;P2P的软件注册;酒店、网吧、手机营业厅、银行开户;以及政府单位的一些柜台。1:1人脸比对有着用户量大、行业广、比对速度快、精准、使用方便、成本…

PockerFace 离线版人证比对 SDK 编程指南

深圳市喜汇信息科技有限公司(PockerFace)是一家通过深度学习框架打造新一代人脸识别技术的科技创新公司,具有完全自主知识产权的核心技术,在人脸检测、人脸识别、人脸属性检测、活体检测、人脸搜索等多个领域均有原创性创新。检出率、错检率、误检率、检…

人脸识别算法源码SDK开发包人证比对二次开发检测核验开发包

人脸识别算法源码SDK开发包人证比对二次开发检测核验开发包 ID:89120059902830359120170116926

人脸识别|人证比对《DocFace+: ID Document to Selfie Matching》论文解读

请点击上方“AI公园”,关注公众号 【导读】这是之前那篇DocFace的后续,作者在原来的基础上进行了升级,效果更佳,而且开源了代码。 代码:https://github.com/seasonSH/DocFace 摘要:日常生活中需要大量的出示…

利用人脸识别SDK实现人证比对全过程

人证比对在如今的社会中随处可见,如高铁、飞机、酒店入住、甚至景区入口都可以看到各种各样的人证应用,人脸识别SDK的也如雨后春笋一般层出不穷,如百度、商汤、Face++、虹软等。在尝试使用各家的SDK之后,最让我青睐的要数虹软科技的SDK了,最直接的一个原因就是虹软承诺永久…

人证核验、人证比对系统应用行业如何判别

一、人证合一验证系统产品简介: 人证合一验证系统是一套利用专业证件扫描设备和身份证阅读机具,实现采集持证人相片与所持证件人相关信息发送至公安部身份证副本库进行生物特征比对,验证人与证是否一致的软硬件结合系统。 从技术上基本解决…

1.Oracle 安装教程及使用

1.win10 安装Oracle19c 详细步骤 链接资源: https://blog.csdn.net/qq_39915083/article/details/107055864? 2.wind10 安装oracle 11g教程完整版 链接资源: https://blog.csdn.net/qq_36205206/article/details/117170099? 备注:以上安…

oracle的安装教程

这里介绍oracle在64位操作系统上的的安装教程: 1、首先到官网https://www.oracle.com/index.html上去下载oracle64位的安装程序,将两个程序解压到同一目录中。如下图所示: 2、下载完成后,将2个压缩文件一起选中,鼠…

如何安装Oracle--新手安装Oracle教程

首先我们来了解一下Oracle: Oracle是一个数据库管理系统,类似于MySql和Sql Server,它是Oracle公司的核心产品。因为该公司在信息管理系统、企业数据处理、Internet及电子商务等领域使用非常广泛,其在数据安全性与完整性控制方面的优越性能比较…