Java中的封装、继承、多态

目录

封装

概念

继承

多态 

向上转型

一、直接赋值

二、方法传参

三、返回值

向上转型注意事项

向下转型

格式

重写

重写和重载的区别

动态绑定

静态绑定和动态绑定


封装

概念

简单来说就是套壳屏蔽细节

举例:

想要访问它们时需要一些“接口”:

在面向对象体系中,提出了一个软件包的概念。为了更好的管理类,把多个类收集在一起成为一组,称为软件包。类似于目录。

举例:

在这个代码中,我们想要打印一个数组时,要通过Arrays类去调用toString方法,此时系统就会为我们自动导包(使用import关键字),我们可以看到,Arrays这个类是在until这个目录下面的,而until又是在java目录下的。

除了使用Java给我们提供的包,我们还可以自定义包:

我创建了一个first文件夹,在它的里面再创建一个one文件夹,在one文件夹中有一个Test类。


继承

在Java中,继承是一种面向对象编程(OOP)的核心概念,它允许一个类(称为子类或派生类)继承另一个类(称为父类或基类)的属性和方法。通过继承,子类可以复用父类的代码,从而提高代码的可重用性和可维护性

上述两个类中我们发现:

红色框中的属性和方法都相同。

此时我们可以创建一个Animal类:

这个类陈之为父类

此时它和Dog、Cat的关系如下:

此时父类中的属性和方法可以被子类继承。

子类想要使用父类中的方法或属性需要使用关键字extends

并且Animal中要有getter和setter方法

这样我们通过继承实现了:子类可以复用父类的代码,从而提高了代码的可重用性和可维护性

注意:

        1.子类会将父类中的成员变量或者成员方法继承到子类中

        2.子类继承父类后,必须要添加自己特有的成员,体现出与基类的不同,否则就没有必要继承了。     

        3.当子类和父类有同名的成员变量、成员方法时优先访问子类的。

        4.不支持多继承,一个类只能继承一个父类。

可以在子类中通过super关键字去访问父类的成员变量或方法:


多态 

概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。

多态实现条件:

1.必须在继承体系下

2.子类必须要对父类中的方法进行重写

3.通过父类的引用调用重写的方法

多态体现:在代码运行时,当传递不同类对象时,会调用对应类中的方法。

向上转型

向上转型有三种方法:

一、直接赋值

在Java中,引用变量可以指向任何继承自其声明类型的类的实例。

Animal animal = new Dog();

  • 创建了一个Dog类的实例。
  • 将这个Dog实例的内存地址赋值给Animal类型的引用变量animal

这意味着animal引用现在指向一个Dog对象,你可以通过animal引用来访问Dog对象继承自Animal类的所有属性和方法以及Dog类特有的属性和方法。

二、方法传参

三、返回值

向上转型注意事项

(1)

(2)子类向上转型后不能访问到父类中private修饰的成员变量


向下转型

格式

正确:

错误1:

错误原因:

1、animal2指向的是Dog的实例,向下转型的时候也只能用Dog类型进行转换

2、Dog和Bird都是Animal的子类,但它们彼此之间没有继承关系。因此,一个Dog的实例不能被转换为Bird类型。尝试这样做会导致ClassCastException。

instanceof可用于检查它左边的对象是否是它右边的类的实例。如果左边的对象是该类或其子类的实例,则表达式返回 true;否则返回 false。

错误2:

P是一个父类,而Child是它的子类,你不能将一个父类的实例直接转换为子类的实例

在Java中,向上转型(从子类到父类)是安全的,但向下转型(从父类到子类)需要一个正确的实例检查,以确保转换的对象实际上是要转换类型的一个实例。

要修复这个错误,你需要确保你正在转换的对象实际上是Child的一个实例。

在Java中,向下转型需要显式的类型转换,因为编译器不知道p引用的对象实际上是Child类的实例。但是,由于p实际上指向了一个Child的实例(因为我们刚刚用new Child()创建了它),所以这个转换是安全的,不会在运行时抛出ClassCastException。


重写

也称为覆盖。重写是子类对父类非静态、非private修饰、非final修饰,非构造方法等的实现过程进行重新编写,返回值和形参都不能改变。即外壳不变,核心重写!重写的好处在于子类可以根据需要,定义特定于自己的行为。也就是说子类能够根据需要实现父类的方法。

注意:

重写和重载的区别


动态绑定

父类引用指向其子类的实例时,调用eat方法时,会调用子类重写的方法

程序在编译的时候 确实调用的是父类的eat方法

当运行代码的时候,通过父类的引用,调用了子类重写的那个方法,此时,我们把这个情况叫做动态绑定。

Animal类中有一个eat方法,Animal的子类Dog和Bird中都有对eat方法的重写,父类的引用调用了子类重写的方法:

animal引用的对象不一样,调用的是同一个方法,但是表现出的现象不一样,这种思想就叫做多态。


在父类的构造方法中调用实例方法时,如果子类有对这个方法的重写,那么就调用重写的

结论:

用尽量简单的方式使对象进入可工作状态,尽量不要在构造器中调用方法(如果这个方法被子类重写,就会触发动态绑定,但是此时子类对象还没构造完成),可能会出现一些隐藏的但是又极难发现的问题。


静态绑定和动态绑定

静态绑定:也称为前期绑定(早绑定),即在编译时,根据用户所传递实参类型就确定了具体调用了哪个方法。典型代表:函数重载。

动态绑定:也称为后绑定(晚绑定),即在编译时,不能确定方法的行为,需要等到程序运行时,才能够确定具体调用哪个类的方法。


请点一个免费的赞~~

谢谢支持

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java项目实战II基于Java+Spring Boot+MySQL的大创管理系统(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者 一、前言 在当前创新创业氛围浓厚的背景下,大学生创新创业项目(简称“大创”&#xff0…

国内旅游:现状与未来趋势分析

在当今社会快速发展的背景下,国内旅游更是呈现出蓬勃的发展态势。中国,这片拥有悠久历史、灿烂文化和壮丽山河的广袤土地,为国内旅游的兴起与发展提供了得天独厚的条件。 本报告将借助 DataEase 强大的数据可视化分析能力,深入剖…

基于SpringBoot的学习资源共享平台

运行环境: jdk8tomcat9mysqlIntelliJ IDEAmavennodejs 设计选用前后端分离的单体架构方式 后端:SpringBootMybatis-PluslogbackElasticsearchRedisMySQLJwtsmtp阿里云OSS 前端:WebPackVueJsAnt Designaxios 主要模块:反馈管理、资源管理、…

【最新】微信小程序连接onenet——stm32+esp8266+onenet实现查看温湿度,控制单片机

微信小程序——stm32esp8266onenet实现查看温湿度,控制单片机 (最新已验证)stm32 新版 onenet dht11esp8266/01s mqtt物联网上报温湿度和控制单片机(保姆级教程) :↓↓👇 👇 👇 &#x1f447…

unreal engine5制作动作类游戏时,我们使用刀剑等武器攻击怪物或敌方单位时,发现攻击特效、伤害等没有触发

UE5系列文章目录 文章目录 UE5系列文章目录前言一、问题分析二、解决方法1. 添加项目设置碰撞检测通道2.玩家角色碰撞设置3.怪物角色碰撞预设 最终效果 前言 在使用unreal engine5制作动作类游戏时,我们使用刀剑等武器攻击怪物或敌方单位时,发现攻击特效…

(17)MATLAB使用伽马(gamma)分布生成Nakagami-m分布的方法1

文章目录 前言一、使用伽马分布生成Nakagami分布随机变量的方法一二、MATLAB仿真代码后续 前言 MATLAB在R2013a版本中引入Nakagami分布对象,可以用来生成Nakagami随机变量。但是在更早的MATLAB版本中,并没有可以直接生成 Nakagami分布的随机变量的内置的…

51单片机系列-按键检测原理

🌈个人主页:羽晨同学 💫个人格言:“成为自己未来的主人~” 独立按键是检测低电平的。 下面我们来看一张对应的电路原理图: 在这张图当中,P1,P2,P3内部都上拉了电阻,但是P0没有&am…

一款基于.NET开发的简易高效的文件转换器

前言 今天大姚给大家分享一款基于.NET开发的免费(GPL-3.0 license)、简易、高效的文件转换器,允许用户通过Windows资源管理器的上下文菜单来转换和压缩一个或多个文件:FileConverter。 使用技术栈 ffmpeg:作为文件转换…

知识图谱入门——10:使用 spaCy 进行命名实体识别(NER)的进阶应用:基于词袋的实体识别与知识抽取

在构建知识图谱的过程中,如何准确地识别和提取实体是关键。spaCy 提供了强大的命名实体识别(NER)功能,我们可以结合自定义规则和工具来实现更精准的实体抽取。本文将详细探讨如何在 spaCy 中实现自定义实体抽取,包括使…

【Nacos 架构 原理】服务发现模块之Nacos注册中心服务数据模型

文章目录 服务(Service)和服务实例(Instance)定义服务服务元数据定义实例实例元数据持久化属性 集群定义集群 生命周期服务的生命周期实例的生命周期集群的生命周期元数据的生命周期 服务(Service)和服务实…

[Meachines] [Easy] Sea WonderCMS-XSS-RCE+System Monitor 命令注入

信息收集 IP AddressOpening Ports10.10.11.28TCP:22,80 $ nmap -p- 10.10.11.28 --min-rate 1000 -sC -sV PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.11 (Ubuntu Linux; protocol 2.0) | ssh-hostkey: | 3072 e3:54:…

计算机视觉——图像修复综述篇

目录 1. Deterministic Image Inpainting 判别器图像修复 1.1. sigle-shot framework (1) Generators (2) training objects / Loss Functions 1.2. two-stage framework 2. Stochastic Image Inpainting 随机图像修复 2.1. VAE-based methods 2.2. GAN-based methods …

第 21 章 一条记录的多幅面孔——事务的隔离级别与 MVCC

21.1 事前准备 CREATE TABLE hero ( number INT, NAME VARCHAR ( 100 ), country VARCHAR ( 100 ), PRIMARY KEY ( number ) ) ENGINE INNODB CHARSET utf8;INSERT INTO hero VALUES ( 1, 刘备, 蜀 );21.2 事务隔离级别 在保证事务隔离性的前提下,使用不同的隔…

RTX4060+ubuntu22.04+cuda11.8.0+cuDNN8.6.0 如何根据显卡型号和系统配置cuda和cuDNN所需的安装环境

文章目录 🌕电脑原配置🌕安装cuda和cuDNN前的环境选择🌙cuDNN与CUDA tookit和nvidia driver的对应关系🌙cuda版本选择⭐查看自己的nvidia driver版本和最大支持的CUDA版本⭐最小支持版本 🌙查看11.8.0版本的cuda和ubun…

Redis:hash类型

Redis:hash类型 hash命令设置与读取HSETHGETHMGETHSETNX 哈希操作HEXISTSHDELHKEYSHVALSHGETALLHLENHINCRBYHINCRBYFLOAT 内部编码ziplisthashtable 目前主流的编程语言中,几乎都提供了哈希表相关的容器,Redis自然也会支持对应的内容&#xf…

数据结构之树(4)

摘要:本篇主要讲哈夫曼树、并查集、二叉排序树、平衡二叉树等,非常非常非常重要!!! 一、哈夫曼树 基于霍夫曼树,利用霍夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,…

OpenCV透视变换

#透视变换 import cv2 import numpy as np import matplotlib.pyplot as pltimg cv2.imread(coins.jpg,1)imgInfo img.shape height imgInfo[0] width imgInfo[1] #src 4->dst 4 (左上角 左下角 右上角 右下角) matSrc np.float32([[200,100],[200,400],[600,100],[wid…

Linux:进程间通信之信号量

system V的进程间通信除了共享内存,还有消息队列和信号量 IPC(进程间通信的简称) 消息队列 消息队列提供了一个从一个进程向另外一个进程发送一块数据的方法 每个数据块都被认为是有一个类型,接收者进程接收的数据块可以有不同…

Ray_Tracing_The_Next_Week下

5image Texture Mapping 图像纹理映射 我们之前虽然在交点信息新增了uv属性,但其实并没有使用,而是通过p交点笛卡尔坐标确定瓷砖纹理或者大理石噪声纹理的值 现在通过uv坐标读取图片,通过std_image库stbi_load(path)…

Kubernetes云原生存储解决方案之 Rook Ceph实践探究

Kubernetes云原生存储解决方案之 Rook Ceph实践探究 除了手动部署独立的 Ceph 集群并配置与Kubernetes进行对接外,Rook Ceph 支持直接在 Kubernetes 集群上部署 Ceph 集群。 通过Rook Ceph云原生存储编排平台,使得 Kubernetes 集群中启用高可用的 Ceph…