Java中的封装、继承、多态

news2024/11/26 12:52:20

目录

封装

概念

继承

多态 

向上转型

一、直接赋值

二、方法传参

三、返回值

向上转型注意事项

向下转型

格式

重写

重写和重载的区别

动态绑定

静态绑定和动态绑定


封装

概念

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

举例:

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

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

举例:

在这个代码中,我们想要打印一个数组时,要通过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.coloradmin.cn/o/2193056.html

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

相关文章

Codeforces Rund 977 div2 个人题解(A~E1)

Codeforces Rund 977 div2 个人题解(A,B,C1,C2,E1) Dashboard - Codeforces Round 977 (Div. 2, based on COMPFEST 16 - Final Round) - Codeforces 火车头 #define _CRT_SECURE_NO_WARNINGS 1#include <algorithm> #include <array> #include <bitset> …

Java之二叉树的基本操作实现

1. 模拟实现二叉树前&#xff0c;我们要先表示树&#xff0c;首先定义一个内部类&#xff0c;当作二叉树节点 static class TreeNOde{char val;//存放二叉树的值TreeNOde left;//指向左子树的引用TreeNOde right;//指向右子树的引用//构造方法&#xff0c;用于实例化树的节点p…

信息学奥赛复赛复习13-CSP-J2021-02插入排序-排序稳定性、插入排序、sort排序、结构体、计数排序

PDF文档回复:20241006 1P7910 [CSP-J 2021] 插入排序 [题目描述] 插入排序是一种非常常见且简单的排序算法。小 Z 是一名大一的新生&#xff0c;今天 H 老师刚刚在上课的时候讲了插入排序算法。 假设比较两个元素的时间为 O(1)&#xff0c;则插入排序可以以 O(n^2) 的时间复…

第五节——转移表(让你不再害怕指针)

文章目录 制作简易计算器什么是转移表&#xff1f;switch函数实现函数指针数组实现 制作简易计算器 要求&#xff1a;制作一个简易计算器&#xff0c;可以进行* / - 等功能运算。 什么是转移表&#xff1f; 指的就是通过函数指针数组的方式通过数组去调用里面的函数&#x…

LeetCode讲解篇之239. 滑动窗口最大值

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 我们维护一个长度为k的窗口&#xff0c;然后窗口从数组最左边一直移动到最右边&#xff0c;记录过程中窗口中的最大值&#xff0c;就是答案 我们每次查询长度为k的窗口最大值是什么时间复杂度是O(k)的&#xff0…

软件验证与确认实验二-单元测试

目录 1. 实验目的及要求.................................................................................................... 3 2. 实验软硬件环境.................................................................................................... 3 …

idea插件市场安装没反应

https://plugins.jetbrains.com/idea重启后还是不行那就

163页PPT罗兰贝格品牌战略升级:华为案例启示与电器集团转型之路

罗兰贝格作为一家全球顶级的战略管理咨询公司&#xff0c;其品牌战略升级理念在多个行业中得到了广泛应用。以下将以华为案例为启示&#xff0c;探讨电器集团的转型之路&#xff0c;并融入罗兰贝格品牌战略升级的思想。 一、华为案例的启示 华为与罗兰贝格联合撰写的《数据存…

基于java+springboot的酒店预定网站、酒店客房管理系统

该系统是基于Java的酒店客房预订系统设计与实现。是给师弟开发的毕业设计。现将源代码开放出来&#xff0c;感兴趣的同学可以下载。 演示地址 前台地址&#xff1a; http://hotel.gitapp.cn 后台地址&#xff1a; http://hotel.gitapp.cn/admin 后台管理帐号&#xff1a; 用…

基于阻塞队列及环形队列的生产消费模型

目录 条件变量函数 等待条件满足 阻塞队列 升级版 信号量 POSIX信号量 环形队列 条件变量函数 等待条件满足 int pthread_cond_wait(pthread_cond_t *restrict cond,pthread_mutex_t *restrict mutex); 参数&#xff1a; cond&#xff1a;要在这个条件变量上等待 mutex…

文字转语音免费的有哪些?这6款文字转语音软件让你配音效果炸满!

文字转语音免费的有哪些&#xff1f;文字转语音不管在有声朗读、配乐配音、影视旁白等实际生活场景中的应用都是非常广泛的&#xff0c;而目前语音识别文字的技术日渐成熟&#xff0c;已经渗透到生活办公的日常&#xff0c;包括我们的输入法自带语音转文字&#xff0c;都可以非…

105页PPT麦肯锡:煤炭贸易企业业务战略规划方案

麦肯锡作为全球领先的管理咨询公司&#xff0c;在协助客户进行企业业务战略规划方面形成了独特且系统的方法论。以下是对麦肯锡企业业务战略规划方法论的详细阐述&#xff1a; 一、战略规划的核心要素 战略方向的明确&#xff1a;战略规划的首要任务是帮助组织明确其愿景、使…

使用ValueConverters扩展实现枚举控制页面的显示

1、ValueConverters 本库包含了IValueConverter接口的的最常用的实现&#xff0c;ValueConverters用于从视图到视图模型的值得转换&#xff0c;某些情况下&#xff0c;可用进行反向转换。里面有一些抽象类、模板类的定义&#xff0c;可以继承这些类实现一些自己想要实现的功能…

k8s中pod的管理

一、资源管理 1.概述 说到k8s中的pod&#xff0c;即荚的意思&#xff0c;就不得不先提到k8s中的资源管理&#xff0c;k8s中可以用以下命令查看我们的资源&#xff1a; kubectl api-resources 比如我们现在需要使用k8s开启一个东西&#xff0c;那么k8s通过apiserver去对比etc…

C++模版SFIANE应用踩的一个小坑

一天一个C大佬同事&#xff0c;突然截图过来一段代码&#xff1a;这写的啥呀&#xff0c;啰里吧嗦的&#xff0c;这个构造函数模板参数T1感觉是多余的呀 template<class T> class TestClass { public:TestClass(){}//函数1template<class T1 T, std::enable_if_t<…

【springboot】简易模块化开发项目整合Redis

接上一项目&#xff0c;继续拓展项目 1.整合Redis 添加Redis依赖至fast-demo-config模块的pom.xml文件中 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependenc…

Jax(Random、Numpy)常用函数

目录 Jax vmap Array reshape Random PRNGKey uniform normal split choice Numpy expand_dims linspace jax.numpy.linalg[pkg] dot matmul arange interp tile reshape Jax jit jax.jit(fun, in_shardingsUnspecifiedValue, out_shardingsUnspecifiedVa…

国际象棋和大模型的内部世界 (2)

国际象棋和大模型的内部世界 &#xff08;2&#xff09; 最近一直在做大模型的一些实践和应用工作。最近看了一些agent的一些在大模型上的探索&#xff0c;包括基于大模型驱动的类似MUD类的游戏。 最近2篇论文都是基于国际象棋的&#xff0c;作者的思路基本上差不多&#xff0c…

SQL第12课——联结表

三点&#xff1a;什么是联结&#xff1f;为什么使用联结&#xff1f;如何编写使用联结的select语句 12.1 联结 SQL最强大的功能之一就是能在数据查询的执行中联结&#xff08;join)表。联结是利用SQL的select能执行的最重要的操作。 在使用联结前&#xff0c;需要了解关系表…

Vue组件库Element-ui

Vue组件库Element-ui Element是一套为开发者、设计师和产品经理准备的基于Vue2.0的桌面端组件库。Element - 网站快速成型工具 安装element-ui npm install element-ui # element-ui版本&#xff08;可以指定版本号引入ElementUI组件库&#xff0c;在main.js中添加内容得到&…