javaSE-----继承和多态
目录
一.初识继承:
1.1什么是继承,为什么需要继承:
1.2继承的概念与语法:
二.成员的访问:
2.1super关键字
2.2this和super的区别:
三.再谈初始化:
小结:
四.初识多态:
4.1多态的概念:
4.2多态的实现条件:
一.初识继承:
1.1什么是继承,为什么需要继承:
用Java语言来描述就是:
class Cat{public String name;public int age;public Cat(String name, int age) {this.name = name;this.age = age;}public void eat(){System.out.println(this.name+"正在吃!");}}class Dog{public String name;public int age;public Dog(String name, int age) {this.name = name;this.age = age;}public void eat(){System.out.println(this.name+"正在吃!");}}public class Test1 {public static void main(String[] args){Dog dog = new Dog("小黄",5);dog.eat();Cat cat = new Cat("小花",6);cat.eat();}
}
通过观察,我们可以发现,其中有诸多的地方重复,但是两个对象都从属于动物,那能否将这些共性抽取呢?面向对象思想中提出了继承的概念,专门用来进行共性抽取,实现代码复用。😀😀😀
1.2继承的概念与语法:
继承(inheritance)机制:是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加新功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构, 体现了由简单到复杂的认知过程。继承主要解决的问题是:共性的抽取,实现代码复用。🧐🧐🧐🧐

语法实现:
修饰符 class 子类 extends 父类 {
// ...
}
具体来说:
class Animal{public String name;public int age;public Animal(String name, int age) {this.name = name;this.age = age;}public void eat(){System.out.println(this.name+"正在吃!");}
}
//子类会继承父类的内容,所以子类无需自己定义其他内容
class Dog extends Animal {public Dog(String name, int age) {super(name, age);//当子类继承父类之后,要先帮助父类进行成员的初始化} //此时需要通过super关键字来实现public void bark(){//子类中特有的方法System.out.println(this.name+"正在汪汪汪~");}
}class Cat extends Animal{public Cat(String name, int age) {super(name, age);//当子类继承父类之后,要先帮助父类进行成员的初始化} //此时需要通过super关键字来实现public void miaomiao(){//子类中特有的方法System.out.println(this.name+"正在喵喵叫~");}}//测试方法
public class Test1 {public static void main(String[] args){Dog dog = new Dog("小黄",5);dog.eat();//dog类中并没有定义任何成员变量,name和age属性肯定是从父类Animal中继承下来的dog.bark();System.out.println("=======================================");Cat cat = new Cat("小花",6);cat.eat();//cat类中并没有定义任何成员变量,name和age属性肯定是从父类Animal中继承下来的cat.miaomiao();}
}
输出结果:

注意:
- 🐻子类会将父类中的成员变量或者成员方法继承到子类中了
🐻子类继承父类之后,必须要新添加自己特有的成员,体现出与基类的不同,否则就没有必要继承了- 🐻当子类继承父类之后,要先帮助父类进行成员的初始化,此时需要通过super关键字来实现。(后面介绍super关键字)
二.成员的访问:
2.1super关键字
🐻super.data:访问父类的成员变量
🐻super.func():访问父类的方法
🐻super():访问父类的构造方法
class Base{protected int a;protected int b;protected int c;protected int d;public Base(int a, int b, int c, int d) {this.a = a;this.b = b;this.c = c;this.d = d;}public void methodA(){System.out.println("父类的方法!");}
}
class Drived extends Base{int c;int d;public Drived(int a, int b, int c, int d) {super(a, b, c, d);//访问父类的构造方法}@Overridepublic String toString() {return "Drived{" +"a=" + a +", b=" + b +", c=" + c +", d=" + d +'}';}public void method(){super.a = 10;super.b = 20;//supr.data直接访问父类成员变量d = 30;//访问从父类继承下来的dthis.c = 40;this.a = 20;//覆盖了刚才调用的父类成员变量}public void methodB(){super.methodA();//调用父类的方法System.out.println("子类的方法!");}}
public class Test1 {public static void main(String[] args){Drived d = new Drived(0,0,0,0);d.methodB();d.method();System.out.println(d);}
}
运行结果:

🐻 其中成员的访问顺序是:先看子类有没有,子类有,优先访问子类的成员,子类没有,去父类中找,父类中也没有,就报错。
2.2this和super的区别:
相同点:1.😺 都是 Java 中的关键字2.😺 只能在类的非静态方法中使用,用来访问非静态成员方法和字段3. 😺 在构造方法中调用时,必须是构造方法中的第一条语句,并且不能同时存在
不同点:
1. 🐻this 是当前对象的引用,当前对象即调用实例方法的对象, super 相当于是子类对象中从父类继承下来部分成员的引用2. 🐻 在非静态成员方法中, this 用来访问本类的方法和属性, super 用来访问父类继承下来的方法和属性3. 🐻 在构造方法中: this(...) 用于调用本类构造方法, super(...) 用于调用父类构造方法,两种调用不能同时在构造方法中出现4. 🐻 构造方法中一定会存在 super(...) 的调用,用户没有写编译器也会增加,但是 this(...) 用户不写则没有
三.再谈初始化:
class Animal {public String name;public int age;public String color;static {System.out.println("父类的静态代码块,Animal::static{}");}{System.out.println("父类的实例代码块,Animal::{}");}public Animal(String name, int age, String color) {this.name = name;this.age = age;this.color = color;System.out.println("父类的构造方法,Animal(String,int,String)");}public void eat() {System.out.println(this.name +" 正在吃饭!");}
}
class Dog extends Animal{static {System.out.println("子类的静态代码块,Dog::static{}");}{System.out.println("子类的实例代码块,Dog::{}");}public Dog() {super("haha",10,"黄色");//虽然 调用了父类的构造方法 ,System.out.println("子类的构造方法,Dog()"); // 但是 并没有产生父类对象,此时 只是帮你进行初始化父类的成员}public void bark() {System.out.println(this.name +" 正在汪汪汪!");}
}public class Test1 {public static void main(String[] args) {Dog dog1 = new Dog();System.out.println("==============");Dog dog2 = new Dog();}
}

由此,我们可以得出(执行顺序的)结论:
1.父类的静态代码块,子类的静态代码块
2.父类的实例代码块,父类的构造方法
3.子类的实例代码块,子类的构造方法
----------》静态代码块在整个程序中只执行一次
小结:
继承的好处:
1.提高了代码的复用性(多个类相同的成员可以放在同一个类中)
2.提高了代码的维护性(如果方法的代码需要修改,只修改一处即可)
继承的坏处:
1.继承让类与类建立了关系,类的耦合性增强
2.当父类发生变化时,子类实现也不得不跟着变化,削弱了子类的独立性
四.初识多态:
4.1多态的概念:
通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。🧐🧐🧐🧐
举例来说就是我们日常生活中的打印机,分为黑白打印和彩印,完成打印这个行为,黑白打印机和彩印机所展现的打印状态完全不同。或则上面的猫狗完成吃东西这个行为,不同的动物也会导致吃东西的状态不同。
4.2多态的实现条件:
1. 必须在继承体系下2. 子类必须要对父类中方法进行重写3. 通过父类的引用调用重写的方法
1.方法名相同2.方法的参数列表相同(个数,顺序,类型)3.方法的返回值类型相同
class Shape {public void draw() {System.out.println("画图形!");}
}class Rect extends Shape {@Overridepublic void draw() {System.out.println("画一个矩形!");//重写父类方法}
}
class Cycle extends Shape{@Overridepublic void draw() {System.out.println("画一个圆圈!");}
}class Triangle extends Shape {@Overridepublic void draw() {System.out.println("画一个三角形!");}
}class Flower extends Shape {@Overridepublic void draw() {System.out.println("画一朵花!");}
}public class Test1 {public static void drawMaps1() {Rect rect = new Rect();//通过父类的引用调用重写的方法-》向上转型Shape shapeCycle = new Cycle();//通过父类的引用调用重写的方法-》向上转型Triangle triangle = new Triangle();//通过父类的引用调用重写的方法-》向上转型Flower flower = new Flower();//通过父类的引用调用重写的方法-》向上转型Shape[] shapes = {shapeCycle,rect,rect,shapeCycle,triangle,flower};for(Shape shape : shapes) {shape.draw();//调用同一个方法,不同的对象会有不同的结果}}//测试方法public static void main(String[] args) {drawMaps1();}
}
运行结果(这里调用了同一个方法,但是不同的对象会产生不同的结果):

小结:
1,多态是方法的多态,不是属性的多态(多态和属性无关)
2,多态的存在要有3个必要的条件:继承 | 接口的实现,方法重写,父类引用指向子类对象。
3,父类引用指向子类对象后,用该父类引用调用子类重写的方法( 父类类型 引用名 = new 子类类型(); ),此时多态就出现了。
结语: 写博客不仅仅是为了分享学习经历,同时这也有利于我巩固自己的知识点,总结该知识点,由于作者水平有限,对文章有任何问题的还请指出,接受大家的批评,让我改进。同时也希望读者们不吝啬你们的点赞+收藏+关注,你们的鼓励是我创作的最大动力!

相关文章:
javaSE-----继承和多态
目录 一.初识继承: 1.1什么是继承,为什么需要继承: 1.2继承的概念与语法: 二.成员的访问: 2.1super关键字 2.2this和super的区别: 三.再谈初始化: 小结: 四.初识多态: 4.1多…...
数据库之Oracle数据导入导出
目录 一、单表导出和导入1、单表导出数据2、单表导入数据二、全表导出和导入1、远程导出全表数据2、导入本地数据三、密码带特殊字符的写法1、Windows OS写法2、Linux/Unix OS写法 四、总结 一、单表导出和导入 1、单表导出数据 --导出远程服务上的表数据 exp 用户名/密码IP…...
nRF52832——GPIOTE与外部中断
这里写目录标题 GPIOTE 原理分析GPIOTE 输入事件应用GPIOTE 事件寄存器应用GPIOTE 事件组件的应用(库函数)GPIOTE PORT 事件应用 GPIOTE 任务应用GPIOTE 任务触发 LED 寄存器操作组件方式进行任务配置 GPIOTE 原理分析 GPIO 任务和时间(GPIO…...
根据用户名称实现单点登录
一、参数格式 二、后端实现 Controller层 public class IAccessTokenLoginController extends BaseController {Autowiredprivate ISysUserService sysUserService;Autowiredprivate ISingleTokenServiceImpl tokenService;/*** 登录方法** return 结果*/PostMapping("/l…...
【设计】855. 考场就座
855. 考场就座 这段代码实现了一个考场安排座位的算法。在这个算法中,考场被模拟成一个从0到n-1的数轴,其中每个位置代表一个座位。目的是在每次学生入座时,找到一个使得所有学生之间距离最大化的座位,并在学生离开时更新座位信息…...
Android中的传感器类型和接口名称
本文将介绍传感器坐标轴、基础传感器和复合传感器(动作传感器、姿势传感器、未校准传感器和互动传感器)。 1. 传感器坐标轴 许多传感器的传感器事件值在相对于设备静止的特定坐标系中表示。 1.1 移动设备坐标轴 Sensor API 仅与屏幕的自然方向相关&a…...
解析进程 /proc/pid/maps 和 /proc/pid/smaps
目录 /proc//maps 背景 具体描述 代码实现 实践 /proc/pid/smaps smaps各子项详解 代码实现 代码调用的路径如下: 小结 /proc/<pid>/maps 背景 相对于/proc/meminfo和dumpsys meminfo可以看到系统整体的内存信息,我们还需要能够具体到…...
【MQ】消息队列概述
📝个人主页:五敷有你 🔥系列专栏:MQ ⛺️稳中求进,晒太阳 定义 消息队列:一般我们简称为MQ(Message Queue) Message Queue :消息队列中间件,很多初学者认为,MQ通过消息的发送…...
交友盲盒系统PHP开源的盲盒源码
源码介绍: 交友盲盒系统是一款基于PHP开发的开源免费盲盒系统,旨在为用户提供一个充满乐趣和惊喜的社交体验。该系统具有丰富的功能和灵活的扩展性,可以轻松地满足各种线上交友、抽奖活动等场景的需求。 安装说明: PHP版本&…...
【Flutter 面试题】什么是异步编程 Flutter中如何处理异步操作?
【Flutter 面试题】什么是异步编程 Flutter中如何处理异步操作? 文章目录 写在前面解答补充说明从网络API异步获取数据并解析 写在前面 关于我 ,小雨青年 👉 CSDN博客专家,GitChat专栏作者,阿里云社区专家博主&#x…...
处理error: remote origin already exists.及其Gitee文件上传保姆级教程
解决error: remote origin already exists.: 删除远程 Git 仓库 git remote rm origin 再添加远程 Git 仓库 git remote add origin (HTTPS) 比如这样: 然后再push过去就ok了 好多人可能还是不熟悉怎么将文件上传 Gitee:我…...
网络编程套接字(2)——Socket套接字
目录 一、概念 二、分类 1、流套接字(使用传输层TCP协议) TCP的特点 2、数据报套接字(使用传输层UDP协议) UDP的特点 3、原始套接字 一、概念 Socket套接字,是由系统提供用于网络通信的技术,是基于T…...
向量错题本
《1800》 1 看变换求和能不能成为0,为0,就是线性相关 2 矩阵等价 3 4<...
FPGA-VGA成像原理与时序
什么是VGA: VGA, Video Graphics Array。即视频图形阵列,具有分辨率高、显示速率快、颜色丰富等优点。VGA接口不但是CRT显示设备的标准接口,同样也是LCD液晶显示设备的标准接口,具有广泛的应用范围。在FGPA中,常广泛用于图像处理等领域。 VGA 显示器成像原理 在 VGA 标准刚兴…...
【VTKExamples::Points】第三期 ExtractClusters
很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 公众号:VTK忠粉 前言 本文分享VTK样例ExtractClusters,并解析接口vtkEuclideanClusterExtraction,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我…...
迅速上手:CentOS 系统下 SSH 服务配置指南
前言 掌握 SSH 服务,就像拥有了一把解锁网络世界的钥匙。本文深入浅出地介绍了如何使用 SSH(Secure Shell)服务,从连接远程服务器到安全文件传输,让你轻松驾驭远程管理与数据传输,提高工作效率,…...
day38 动态规划part1
509. 斐波那契数 简单 斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是: F(0) 0,F(1) 1 F(n) F(n - 1) F(n - 2),…...
01背包问题 刷题笔记
思路 dp 用f[i][j]来表示当体积为j时 考虑前i件物品可以获得的 最大值 记住f[i][j]本身是个价“价值” 考虑两种状态 是否将第i件物品放入背包里面 将背包的体积从小到大递增来进行考虑 首先 考虑条件 如果当前增加的体积放不下下一件物品 则该体积 可以获得的最大值可以直接…...
docker安装包(Linux和windows)
Linux——docker-20.10.9.tgz 网盘地址:链接:https://pan.baidu.com/s/1T3qfVZ-uT-vMAo8w6heTMw 提取码:qu85 windows——docker19.03.1 链接:https://pan.baidu.com/s/1mK6hqhkGCBs6tdBHJxrdPw 提取码:4dkj...
RabbitMQ 安装使用
文章目录 RabbitMQ 安装使用安装下载 Erlang下载 RabbitMQ 的服务安装好后看是否有 RabbitMQ 的服务开启管理 UIRabbitMQ 端口使用一览图 使用输出最简单的 Hello World!生产者定义消费者消费消息小拓展 RabbitMQ 安装使用 安装 下载 Erlang RabbitMQ 是用这个语…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...
CSS设置元素的宽度根据其内容自动调整
width: fit-content 是 CSS 中的一个属性值,用于设置元素的宽度根据其内容自动调整,确保宽度刚好容纳内容而不会超出。 效果对比 默认情况(width: auto): 块级元素(如 <div>)会占满父容器…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...
面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...

不同点: