Java的三大特性之一——继承

前言

http://t.csdnimg.cn/uibg3

在上一篇中我们已经讲解过封装,这里就主要讲解继承与多态


继承

1.为什么需要继承

Java中使用类对现实世界中实体来进行描述,类经过实例化之后的产物对象,则可以用来表示现实中的实体,但是现实世界错综复杂,事物之间可能会存在一些关联,那在设计程序是就需要考虑

面向对象思想中提出了继承的概念,专门用来进行共性抽取,实现代码复用

2.什么是继承

继承:是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性
的基础上进行扩展,增加新功能,这样产生新的类,称派生类。

继承呈现了面向对象程序设计的层次结构, 体现了由简单到复杂的认知过程。

继承主要解决的问题是:共性的抽取,实现代码复用
比如猫和狗都是动物,那么我们就可以进行共性的抽取实现继承

在这,Dog和Cat都继承了Animal类,其中:Animal类称为父类/基类或超类,Dog和Cat可以称为Animal的子类/派生类,继承之后,子类可以复用父类中成员,子类在实现时只需关心自己新增加的成员即可,在这之后还可以实现多态

3.如何使用继承

1.基本应用

我们先对父类进行设计

class Animals {public String name;public int age;public String color;public Animals(String name, int age, String color) {this.name = name;this.age = age;this.color = color;}public void eat() {System.out.println(this.name + "正在吃饭!");}
}

之后对子类使用extends关键字进行继承

class Dog extends Animals {public Dog() {super("xiaohei", 10, "黄色");}public void bark() {System.out.println(this.name + "正在汪汪汪!");}
}class Cat extends Animals {public Cat(){super("xiaohuang",20,"黑白");}public void mew() {System.out.println(this.name + "正在喵喵喵!");}
}

在这里我们的子类应当与父类有所不同,不然就没必要使用继承

2.子类对父类成员变量的访问

class Base {public int a = 1;public int b = 2;
}class Derived extends Base {public int a = 100;public int c = 3;public void test() {System.out.println(super.a);//调用父类的System.out.println(this.a);//调用子类的System.out.println(super.b);//调用父类System.out.println(this.b);//子类没有则调用父类的System.out.println(this.c);//子类的}
}public class Test2 {public static void main(String[] args) {Derived derived = new Derived();derived.test();}
}
如果访问的成员变量子类中有,优先访问自己的成员变量。
如果访问的成员变量子类中无,则访问父类继承下来的,如果父类也没有定义,则编译报错。
如果访问的成员变量与父类中成员变量 同名,则 优先访问自己的。

3.子类对父类成员方法的访问

class Base2 {public void testA() {System.out.println("testA()");}
}class Derived2 extends Base2 {public void testA() {System.out.println("Derived2::testA()");}public void testB() {System.out.println("testB()");}public  void testC() {this.testA();//子类super.testA();//父类this.testB();//子类}
}
public class Test2 {public static void main(String[] args) {Derived2 derived2 = new Derived2();derived2.testC();}
}

通过子类对象访问父类与子类中不同名方法时,优先在子类中找,找到则访问,否则在父类中找,找到则访问,否则编译报错。

通过派生类对象访问父类与子类同名方法时,如果父类和子类同名方法的参数列表不同(重载),根据调用方法适w传递的参数选择合适的方法访问,如果没有则报错

 4.super与this关键字

对于上述2.3子类对父类的访问,归根结底是super与this之间的区别

需要注意的是

1.只能在类的非静态方法中使用,用来访问非静态方法和字段

2.在构造方法中调用时,必须是构造方法的第一条语句,并且不能同时使用 

this是对当前对象的访问,而super是子类对象中从父类继承下来部分成员的引用

5.子类构造方法

class Base {public Base() {System.out.println("Base()");}
}
class Derived extends Base {public Derived() {// super();   // 注意子类构造方法中默认会调用基类的无参构造方法:super(),// 用户没有写时,编译器会自动添加,而且super()必须是子类构造方法中第一条语句,System.out.println("Derived()");}
}
public class Test2 {public static void main(String[] args) {Derived d = new Derived();}
}

4.结尾

Java中不支持多继承

一般我们不希望出现超过三层的继承关系. 如果继承层 次太多, 就需要考虑对代码进行重构了

若该类被final关键字修饰则不能被继承

值得一提的是区别于组合

继承表示对象之间是is-a的关系,比如:狗是动物,猫是动物

组合表示对象之间是has-a的关系,比如:汽车

这里贴一个详解继承与组合的文章 https://www.hollischuang.com/archives/1319


如果上述内容对您有帮助,希望给个三连谢谢 

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

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

相关文章

zabbix6.4监控mysql数据库

目录 一、前提二、配置mysql数据库模板三、配置监控的mysql主机 一、前提 已经搭建好zabbix-server 在需要监控的mysql服务器上安装zabbix-agent2 上述安装步骤参考我的上篇文章:通过docker容器安装zabbix6.4.12图文详解(监控服务器docker容器&#xf…

用Compute Shader处理图像数据后在安卓机上不能正常显示渲染纹理

1)用Compute Shader处理图像数据后在安卓机上不能正常显示渲染纹理 2)折叠屏适配问题 3)Prefab对DLL中脚本的引用丢失 4)如何优化Unity VolumeManager中的ReplaceData 这是第378篇UWA技术知识分享的推送,精选了UWA社区…

超快的 AI 实时语音转文字,比 OpenAI 的 Whisper 快4倍 -- 开源项目 Faster Whisper

faster-whisper 这个项目是基于 OpenAI whisper 的模型,在上面的一个重写。 使用的是 CTranslate2 的这样的一个库,CTranslate2 是用于 Transformer 模型的一个快速推理引擎。 在相同精度的情况下,faster-whisper 的速度比 OpenAI whisper …

【网站项目】294火车票订票系统

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

EI Scopus双检索| 2024年智能交通与未来出行国际会议(CSTFM 2024)

会议简介 Brief Introduction 2024年智能交通与未来出行国际会议(CSTFM 2024) 会议时间:2024年10月18日-20日 召开地点:中国杭州 大会官网:CSTFM 2024-2024 International Conference on Smart Transportation and Future Mobility(CSTFM 202…

解决修改数据后,前端页面不显示问题

如图,修改数据后,在前端页面不显示的问题,可能是因为缓存问题 解决方案 以为Edge浏览器为例 打开设置左边栏点击隐私,搜索和服务选择清除 Internet Explorer 的浏览数据点击删除,重新启动前端界面即可。

3.18作业

一、网络属性(getsockopt、setsockopt) 1> 由于在网络通信过程中,套接字是服务于各个层的,但是,每一层中对套接字选项都有一定的权限控制,例如,应用层中对端口号快速重用的限制 2> 如何…

vue2 自定义 v-model (model选项的使用)

效果预览 model 选项的语法 每个组件上只能有一个 v-model。v-model 默认会占用名为 value 的 prop 和名为 input 的事件,即 model 选项的默认值为 model: {prop: "value",event: "input",},通过修改 model 选项,即可自定义v-model …

js实现旋转矩形,圆形交集并集差集运算并使用canvas展示

region 使用0代表空 1代表有 复制到codepen执行 // 创建三个 Canvas 元素 const intersectionCanvas document.createElement(canvas); const unionCanvas document.createElement(canvas); const differenceCanvas document.createElement(canvas);intersectionCanvas.wid…

本人用编译

板子方 修改ip(保证板子和主机在同一个网段) mount -t nfs -o rw,nolock,nfsvers3 192.168.1.200:/home/violet/nfs get/ 互通的文件在~目录下get文件内 电脑方 使用arm-linux-gnueabihf-gcc 编译

AI新工具(20240322) 免费试用Gemini Pro 1.5;先进的AI软件工程师Devika;人形机器人Apptronik给你打果汁

✨ 1: Gemini Pro 1.5 免费试用Gemini Pro 1.5 Gemini 1.5 Pro是Gemini系列模型的最新版本,是一种计算高效的多模态混合专家(MoE)模型。它能够从数百万个上下文Token中提取和推理细粒度信息,包括多个长文档和数小时的视频、音频…

C++读取文本文件中的汉字出现乱码的原因及解决措施

大家好! 作者今天在写代码时遇到了读取文本文件中的汉字时出现乱码的情况,所以本文介绍Windows操作系统中,C读取文本文件中的汉字出现乱码情况原因及解决措施。 下面代码可以读取Stu.txt中的内容并输出: ifstream ifs; ifs.open(…

拌合楼管理软件开发(十一) 海康威视车牌识别摄像头安装调试,记录犯经验主义错误不断自己打脸过程

前言: 从小白开始 海康威视的摄像头接触过,包括前面也都开发了调用sdk开发拍照和视频预览,以及通过事件警报获取数据的。接触到的像头都是12v或者24v电源,或者是POE供电的,先入为主了觉得都是这样,结果打脸了。 一、设备选型: 最开…

MySQL 经典练习 50 题 (记录)

前言: 记录一下sql学习,仅供参考基本都对了,不排除有些我做的太快做错了。里面sql不存在任何sql优化操作,只以完成最后输出结果为目的,包含我做题过程和思路最后一行才是结果。 1.过程: 1.1.插入数据 /* SQLyog Ul…

【机器学习入门 】人工神经网络(一)

系列文章目录 第1章 专家系统 第2章 决策树 第3章 神经元和感知机 识别手写数字——感知机 第4章 线性回归 第5章 逻辑斯蒂回归和分类 第5章 支持向量机 文章目录 系列文章目录前言一、多层感知机二、反向传播算法三、深度神经网络 前言 人工神经网络( Artifical Neural Netw…

蓝桥杯-02-2023蓝桥杯c/c++省赛B组题目

参考 2023 年第十四届蓝桥杯 C/C B组省赛题解 2023蓝桥杯c/c省赛B组题目(最全版): A:日期统计 这题方法应该很多,没有和别人讨论想法。我的解法思路是:先 load 函数生成所有这一年的合法日期,然后枚举所有可以从数据…

uni-app打包证书android

Android平台打包发布apk应用,需要使用数字证书(.keystore文件)进行签名,用于表明开发者身份。 Android证书的生成是自助和免费的,不需要审批或付费。 可以使用JRE环境中的keytool命令生成。 以下是windows平台生成证…

MySQL、Oracle的时间类型字段自动更新:insert插入、update更新时,自动更新时间戳。设置自增主键id,oracle创建自增id序列和触发器

1. MySQL 支持设置自增id的字段类型:int、bigint、double等数值类型,一般用int、bigint支持设置自动更新时间的字段类型:datetime、timestamp下面sql中的now()函数可以用current_timestamp()替代 1.1. 不指定秒精度 drop table if exists …

Ollama 在本地快速部署大型语言模型,可进行定制并创建属于您自己的模型

# Ollama 在本地快速部署并运行大型语言模型。 macOS 点击下载 Windows 预览版 点击下载 Linux curl -fsSL https://ollama.com/install.sh | sh手动安装指南 Docker 官方的 Ollama Docker 镜像 ollama/ollama 已经在 Docker Hub 上发布。 库 ollama-pythonollama-js…

超详细测试项目——Web电商项目测试点整理.....

虽然说近些年来,软件测试找工作的时候,简历中如果写着电商项目被认为是烂大街的项目,甚至受到根本不了解行情的HR或者部分公司的技术人员的刁难,但是:电商这么流行普遍的项目和应用,这不是很正常么&#xf…