后端Java开发:第十三天
第十三天:继承 - 面向对象的核心概念
欢迎来到第十三天的学习!今天,我们将深入探讨 Java 中的 继承(Inheritance),这是面向对象编程的四大基本特性之一。继承是指一个类(子类)通过继承另一个类(父类)的属性和方法,从而具备父类的功能,同时可以在子类中扩展新的功能。继承是代码复用的核心机制之一,它有助于提高代码的可维护性和可扩展性。
1. 什么是继承?
继承是面向对象编程中的一种机制,它允许我们创建一个新类(子类),这个新类可以继承一个已有类(父类)的一些特性(字段)和行为(方法)。通过继承,子类可以复用父类的代码,同时还可以根据需要扩展或重写父类的方法。
继承的基本原则:
- 子类继承父类:子类继承了父类的属性和方法,并且可以在子类中新增属性和方法。
- 方法重写(Overriding):子类可以重新定义父类的某些方法。
- 单继承:Java 中的类是单继承的,也就是说,每个类只能有一个直接父类。
2. 继承的好处
继承有以下几个重要的好处:
- 代码复用:继承让我们能够复用父类的代码,避免了重复编写相同的代码。
- 增强可维护性:由于子类共享父类的代码,如果父类发生了变化,只需要修改父类代码,子类无需改变,从而提高了代码的可维护性。
- 扩展性:通过继承,我们可以在子类中扩展新的功能,或者重写父类的方法,实现特定需求。
3. 如何实现继承?
在 Java 中,继承的实现通过使用 extends
关键字。子类通过 extends
关键字继承父类的属性和方法。
基本语法:
public class 子类 extends 父类 {// 子类特有的属性和方法
}
步骤 1:定义父类
首先定义一个父类,包含一些属性和方法。
步骤 2:定义子类
子类通过 extends
关键字继承父类的属性和方法。子类可以使用父类的属性和方法,也可以添加自己独特的属性和方法。
步骤 3:使用父类的构造方法
父类的构造方法可以通过 super()
来调用,子类构造方法可以通过 super
关键字来调用父类的构造器,确保父类的初始化过程。
4. 继承的示例
示例 1:动物类与狗类
在这个例子中,我们有一个 动物类(Animal),它包含基本的属性和行为,然后我们通过继承创建一个 狗类(Dog),它继承了动物类的属性,并扩展了自己特有的方法。
// 父类:Animal
public class Animal {private String name;// 父类构造方法public Animal(String name) {this.name = name;}// 父类方法public void speak() {System.out.println("Animal makes a sound");}public String getName() {return name;}
}// 子类:Dog
public class Dog extends Animal {// 子类构造方法public Dog(String name) {super(name); // 调用父类的构造方法}// 子类重写父类方法@Overridepublic void speak() {System.out.println(getName() + " barks");}public static void main(String[] args) {// 创建子类对象Dog dog = new Dog("Buddy");dog.speak(); // 输出:Buddy barks}
}
输出:
Buddy barks
分析:
Dog
继承了Animal
类,获得了父类的name
属性和speak()
方法。Dog
重写了父类的speak()
方法,使其表现为 “bark”(叫声)。- 子类
Dog
使用super(name)
调用了父类的构造方法来初始化name
属性。
示例 2:形状类与圆形类
我们再来看一个简单的图形类的例子。假设我们有一个 Shape
类作为父类,代表一个普通的形状。然后我们可以创建一个 Circle
类继承 Shape
,表示圆形。
// 父类:Shape
public class Shape {private String color;public Shape(String color) {this.color = color;}public void draw() {System.out.println("Drawing a shape");}public String getColor() {return color;}
}// 子类:Circle
public class Circle extends Shape {private double radius;// 子类构造方法public Circle(String color, double radius) {super(color); // 调用父类的构造方法this.radius = radius;}// 子类方法public void draw() {System.out.println("Drawing a circle with radius " + radius);}public static void main(String[] args) {// 创建子类对象Circle circle = new Circle("Red", 5.0);circle.draw(); // 输出:Drawing a circle with radius 5.0}
}
输出:
Drawing a circle with radius 5.0
分析:
Circle
类继承了Shape
类,继承了color
属性和draw()
方法。Circle
类通过super(color)
调用了父类的构造方法。Circle
类重写了draw()
方法,以实现绘制圆形的特定行为。
5. 方法重写(Method Overriding)
在继承中,子类可以重写(Override)父类的方法。这是一个非常重要的概念,它允许子类在继承父类的基础上修改方法的实现,使其行为符合子类的需求。
重写的规则:
- 子类的方法必须与父类的方法具有相同的名称、返回类型和参数列表。
- 子类的方法可以有不同的实现。
- 子类的方法不能减少父类方法的访问权限(即如果父类方法是
public
,子类不能将其变为private
)。
重写示例:
class Animal {public void sound() {System.out.println("Some generic animal sound");}
}class Dog extends Animal {@Overridepublic void sound() {System.out.println("Bark");}
}public class Test {public static void main(String[] args) {Animal animal = new Animal();Dog dog = new Dog();animal.sound(); // 输出:Some generic animal sounddog.sound(); // 输出:Bark}
}
输出:
Some generic animal sound
Bark
分析:
Dog
类重写了sound()
方法,定义了自己特有的行为。- 当调用
dog.sound()
时,输出了Bark
,而不是父类的通用行为。
6. 继承的常见误区
误区 1:在子类中随意改变父类的方法实现
继承的目的并不是为了随意修改父类的实现,而是让子类通过重写父类的方法来增强或改变功能。
误区 2:继承层级过深
继承层级过深会导致代码难以维护和理解。尽量避免过度继承,使用组合(composition)来代替继承,减少类的层次结构。
7. 总结
今天我们学习了 继承(Inheritance),它是面向对象编程中最基础也是最重要的特性之一。通过继承,子类可以复用父类的代码,扩展父类的功能,并在需要时重写父类的方法。继承帮助我们减少代码的重复,提高代码的可维护性和可扩展性。
继承是构建 Java 程序的重要工具,但在使用时要注意避免过度继承,并合理设计类的层次结构。
明天我们将继续学习 面向对象编程的其他特性——多态(Polymorphism)。敬请期待!
相关文章:
后端Java开发:第十三天
第十三天:继承 - 面向对象的核心概念 欢迎来到第十三天的学习!今天,我们将深入探讨 Java 中的 继承(Inheritance),这是面向对象编程的四大基本特性之一。继承是指一个类(子类)通过继…...
awr报告无法生成:常见分析手段
awr报告无法生成:常见分析手段 STATISTICS_LEVEL和OPEN_MODEAWR快照是否能自动生成?AWR快照能否手动生成?日志有无ORA-12751或ORA-32701报错?MMON进程是否被挂起?排查数据库隐藏参数分析快照生成错误信息分析AWR Snapshot Tracing分析AWR Table Flush是否超时STATISTICS_L…...
基础算法——差分
原理与特点 先回顾一下前缀和算法。 | arr | 1 | 3 | 7 | 5 | 6 | | ---------- | ------ | ------ | ------ | ------ | ------ | | prefix 值 | 101 | 134 | 13711 | 137516 | 1375622 |前缀和的特点是前面的相加prefix(i)sum(i-1)arr(i)。那么差分数组diff就如下面的形式 |…...
[ LeetCode 75 ] 283 移动零(JavaScript)
283 移动零 题目描述解题思路步骤解析时间和空间复杂度代码实现 题目描述 LeetCode 283 移动零 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操…...
YOLOv10改进,YOLOv10添加HAttention注意机制用于图像修复的混合注意力转换器,CVPR2023,超分辨率重建
摘要 基于Transformer的方法在低层视觉任务中表现出色,例如图像超分辨率。然而,作者通过归因分析发现,这些网络只能利用有限的空间范围的输入信息。这意味着现有网络尚未充分发挥Transformer的潜力。为了激活更多的输入像素以获得更好的重建效果,作者提出了一种新型的混合…...
VS调试MFC进入系统源代码配置
调试MFC代码有时候能进入MFC的源代码,有时候不能.之前一直没有深入研究.后面经过查资料发现每次调试必能进入源代码的配置.很简单,只需要3步. 1.打开工具->选项->调试->符号,勾选Microsoft符号服务器. 2.打开项目->属性->配置属性->常规,MFC的使用修改成&qu…...
C# 告别FirstOrDefault
一、开篇:FirstOrDefault 的 “江湖地位” 在 C# 编程的世界里,FirstOrDefault 可谓是一位 “常客”,被广大开发者频繁地运用在各种项目场景之中。无论是 Windows 窗体应用程序,需要从数据集中检索第一条记录,或是满足…...
图像处理|腐蚀操作
在计算机视觉与图像处理中,腐蚀操作(Erosion)是形态学操作的一种。形态学操作广泛应用于二值图像中,主要用于分析和提取图像中的结构信息。腐蚀操作是这类操作中最常见的一种,用来对图像进行“收缩”处理,消…...
全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之循环结构(应用)
实战训练1—报数游戏 问题描述: 小明和小鹏玩报数游戏,小明按1∼20 报数,小鹏按1∼30报数。若两人同时开始,并以同样的速度报数,当两人都报了1000个数时,同时报相同数的次数是多少呢? 输入格…...
140.WEB渗透测试-信息收集-小程序、app(11)
免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于: 易锦网校会员专享课 上一个内容:139.WEB渗透测试-信息收集-小程序、app(10) 3.直接有app 直接拿…...
《新闻大厦抢先版》V0.18.105+Dlcs官方学习版
《新闻大厦抢先版》官方版https://pan.xunlei.com/s/VODaeUn3v-ZWVvvmUMfo5AqWA1?pwdnhpz# 建造并不断优化新闻大楼,保障员工权益并及时赶上周日的印刷交期! 招募并管理不同职业以登上成功的阶梯:记者、摄像师、勤杂工,除此以外…...
【Uniapp-Vue3】Prop校验与prop默认值用法及循环遍历数组对象
一、prop校验 如果我们在想要限制prop的类型,就可以在接收prop的时候对接收类型进行限制: defineProps({ 属性名:{ type:类型 } }) 需要注意类型的首字母大写 但是设置了传入参数类型限制并不能严格限制,只会在后台进行提示: 二、…...
Android Studio创建新项目并引入第三方jar、aar库驱动NFC读写器读写IC卡
本示例使用设备:https://item.taobao.com/item.htm?spma21dvs.23580594.0.0.52de2c1bbW3AUC&ftt&id615391857885 一、打开Android Studio,点击 File> New>New project 菜单,选择 要创建的项目模版,点击 Next 二、输入项目名称…...
Spring Boot | 基于MinIO实现文件上传和下载
关注:CodingTechWork 介绍 在现代的 web 应用中,文件上传和下载是常见的需求。MinIO 是一个开源的高性能分布式对象存储服务,可以用来存储和管理大量的非结构化数据,如图片、视频、日志文件等。本文将介绍如何在 Spring Boot 应用…...
【DNS 阿里云,域名解析,解析到IP的指定端口】
- 进入 阿里云域名解析界面 - 点击 解析设置 - 添加记录 1.添加一条 A/AAAA 类型解析你的服务器的IP地址(不需要带端口号,这条解析只是起到中转作用) 示例:主机记录:aa.bb.com 记录值:xxx.xxx.xxx.xxx (…...
力扣经典二分题:4. 寻找两个正序数组的中位数
题目链接:4. 寻找两个正序数组的中位数 - 力扣(LeetCode) 一、题目分析 这道题目是让我们在 两个正序的数组中寻找中位数已知两个数组的大小分别是:int m nums1.size(),n nums2.size();中位数性质1:中位数左侧元素 …...
Java Web开发进阶——Spring Boot与Spring Data JPA
Spring Data JPA 是 Spring 提供的一种面向数据访问的持久化框架,它简化了 JPA 的实现,为开发者提供了一种快速操作数据库的方式。在结合 Spring Boot 使用时,开发者能够快速完成数据库访问层的开发。 1. 介绍Spring Data JPA 1.1 什么是Spr…...
PySpark用sort-merge join解决数据倾斜的完整案例
假设有两个大表 table1 和 table2 ,并通过 sort-merge join 来解决可能的数据倾斜问题。 from pyspark.sql import SparkSession from pyspark.sql.functions import col# 初始化SparkSession spark SparkSession.builder.appName("SortMergeJoinExample&quo…...
【2025 Rust学习 --- 11 实用工具特型01】
清理特型Drop 当一个值的拥有者消失时,Rust 会丢弃(drop)该值。丢弃一个值就必须释放 该值拥有的任何其他值、堆存储和系统资源。 丢弃可能发生在多种情况下: 当变量超出作用域时;在表达式语句的末尾;当…...
关于Linux PAM模块下的pam_listfile
讲《Linux下禁止root远程登录访问》故事的时候,说好会另开一篇讲讲pam_listfile。我们先看看pam_listfile的man文档怎么介绍的。 下面这些就好比人物的简介,甚是恼人;让人看得不明就里,反正“他大舅他二舅都是他舅”。可以直接跳…...
根据中文名称首字母进行分组
很多项目中,需要用到中文名称到首字母进行分组,例如:城市、游戏等等。。。 /*** 将集合数据按照汉字首字母分组排序** param list* return*/public Map<String, Object> screenManufacturer(List<Game> list) {Set<String>…...
springboot 集成 etcd
springboot 集成 etcd 往期内容 ETCD 简介docker部署ETCD 前言 好久不见各位小伙伴们,上两期内容中,我们对于分布式kv存储中间件有了简单的认识,完成了docker-compose 部署etcd集群以及可视化工具 etcd Keeper,既然有了认识&a…...
人工智能-数据分析及特征提取思路
1、概况 基于学生行为数据预测是否涉黄、涉黑等。 2.数据分析 数据分析的意义包括得到数据得直觉、发掘潜在的结构、提取重要的变量、删除异常值、检验潜在的假设和建立初步的模型。 2.1数据质量分析 2.1.1数据值分析 查看数据类型: 首先明确各字段的数据类型…...
设计模式 行为型 状态模式(State Pattern)与 常见技术框架应用 解析
状态模式(State Pattern)是一种行为型设计模式,它允许对象在内部状态改变时改变其行为,使得对象看起来好像修改了它的类。这种设计模式的核心思想是将对象的状态和行为封装成不同的状态类,通过状态对象的行为改变来避免…...
Android 系统签名 keytool-importkeypair
要在 Android 项目中使用系统签名并将 APK 打包时与项目一起打包,可以按照以下步骤操作: 步骤 1:准备系统签名文件 从 Android 系统源码中获取系统签名文件,通常位于 build/target/product/security 目录下,包括 pla…...
ubuntu22.04 gcc,g++从10.5切换到低版本9.5
一、安装gcc-9.5 mkdir gcc cd gcc sudo apt-get download $(apt-cache depends --recurse --no-recommends --no-suggests --no-conflicts --no-breaks --no-replaces --no-enhances --no-pre-depends gcc-9 | grep -v i386 | grep "^\w") sudo dpkg -i *.deb sudo…...
Microsoft 已经弃用了 <experimental/filesystem> 头文件
#define _CRT_SECURE_NO_WARNINGS 1 #define _SILENCE_EXPERIMENTAL_FILESYSTEM_DEPRECATION_WARNING 1 //Microsoft 已经弃用了 <experimental / filesystem> 头文件,并计划在将来移除它。取而代之的是 C17 标准引入的 //<filesystem> 头文件…...
git 提交命令记录
1.已有本地和远程仓库 查看仓库远程地址: git remote -v 大量提交 git add . git commit -m "提交说明" git push 之后输入用户名密码 删除文件 git rm 文件名 替代git add 后面一样 2.全新提交 新建远程仓库 git init touch README.md git add . …...
Unity + Firebase + GoogleSignIn 导入问题
我目前使用 Unity版本:2021.3.33f1 JDK版本为:1.8 Gradle 版本为:6.1.1 Firebase 版本: 9.6.0 Google Sign In 版本为: 1.0.1 问题1 :手机点击登录报错 apk转化成zip,解压,看到/lib/armeabi-v…...
深度学习的加速器:Horovod,让分布式训练更简单高效!
什么是 Horovod? Horovod 是 Uber 开发的一个专注于深度学习分布式训练的开源框架,旨在简化和加速多 GPU、多节点环境下的训练过程。它以轻量级、易用、高性能著称,特别适合需要快速部署分布式训练的场景。Horovod 的名字来源于俄罗斯传统舞…...
AI刷题-异或编码、拼凑单词 chi
目录 一、异或编码 问题描述 测试样例 解题思路: 问题理解 解题思路 数据结构选择 算法步骤 最终代码: 运行结果: 二、拼凑单词 chi 问题描述 测试样例 解题思路: 问题理解 数据结构选择 算法步骤 最终代码&a…...
xml简介
目录 基本语法特点及应用场景一个简单示例 xml(全称eXtensible Markup Language)是一种用于存储和传输数据的标记语言,跨平台并且跨语言,xml内容较多,这篇文章会介绍一些基础的内容。 基本语法 xml文档通常以xml声明开…...
MYSQL------MySQL 复制MySQL Cluster 架构
MySQL 复制 安装配置 主服务器配置 首先,在主服务器的配置文件(my.cnf 或 my.ini)中添加以下基本配置: [mysqld] server-id 1 log-bin /var/log/mysql/mysql-bin.logserver-id:为服务器分配唯一的标识࿰…...
【人工智能】 用Python构建图像分类模型:从TensorFlow到PyTorch的全面指南
随着深度学习在计算机视觉领域的迅猛发展,图像分类作为其核心任务之一,受到了广泛的关注。本文旨在详细介绍如何使用Python构建图像分类模型,从TensorFlow到PyTorch两个主流深度学习框架进行全面对比与实践。文章首先回顾了图像分类的基本概念…...
计算机网络 笔记 数据链路层 2
1,信道划分: (1)时分复用TDM 将时间等分为“TDM帧”,每个TDM帧内部等分为m个时隙,m个用户对应m个时隙 缺点:每个节点只分到了总带宽的1/m,如果有部分的1节点不发出数据,那么就会在这个时间信道被闲置,利用…...
2024年度漏洞态势分析报告,需要访问自取即可!(PDF版本)
2024年度漏洞态势分析报告,需要访问自取即可!(PDF版本),大家有什么好的也可以发一下看看...
Apache Hop从入门到精通 第一课 揭开Apache Hop神秘面纱
一、Apache Hop是什么? 1、Apache Hop,简称Hop,全称为Hop Orchestration Platform,即Hop 工作编排平台,是一个数据编排和数据工程平台,旨在促进数据和元数据编排的所有方面。Hop让你专注于你想要解决的问题…...
Unity 人体切片三维可视化,可任意裁切切割。查看不同断层的图像。
Unity 人体切片三维可视化,真彩色,可任意裁切切割。查看不同断层的图像。 点击查看效果: 视频效果...
ModuleNotFoundError: No module named ‘podm.metrics‘报错等解决方法
ModuleNotFoundError: No module named podm.metrics’报错等解决方法 podm.metrics 在运行时报错: ModuleNotFoundError: No module named ‘podm.metrics’ 安装了podm后还是报错 解决方法: 查看安装位置 查看podm的安装位置,并打开到该…...
Java虚拟机运行时数据区域(内存模型)
程序计数器(线程私有内存) What:程序计数器是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。 程序控制流的指示器, 分支,循环,跳转,异常处理,线程…...
trf 4.10安装与使用-生信工具42
01 背景 DNA 中的串联重复(Tandem Repeat)指的是两个或多个相邻且近似的核苷酸模式的拷贝。Tandem Repeats Finder (TRF) 是一个程序,用于定位并显示 DNA 序列中的串联重复。用户只需提交一个以 FASTA 格式编写的序列,无需指定重…...
rom定制系列------小米max3安卓12 miui14批量线刷 默认开启usb功能选项 插电自启等
小米Max3是小米公司于2018年7月19日发布的机型。此机型后在没有max新型号。采用全金属一体机身设计,配备6.9英寸全面屏.八核处理器骁龙636,后置双摄像头1200万500万像素,前置800万像素.机型代码 :nitrogen.官方最终版为稳定版12.5…...
PySide6-UI界面设计
导论: PySide6和PyQt都是Python对Qt框架的绑定,允许开发者使用Qt创建平台的GUI应用程序。如果你正在开发商业项目,或者需要使用最新的QT6特性,PySide6是一个更好的选择。如果你更倾向于一个成熟的社区和丰富的资源,Py…...
Java创建线程的方式有哪些?
创建线程的方式 1. 继承 Thread 类 在 Java 中,当你启动一个线程时,实际上是调用了 Thread 类的 start() 方法。这个方法会执行以下几个步骤: 线程的状态转变:调用 start() 方法后,线程的状态从 NEW 转变为 RUNNABL…...
Ubuntu | PostgreSQL | 解决 ERROR: `xmllint` is missing on your system.
解决 sudo apt install apt-file sudo apt-file updatesudo apt-file search xmllint sudo apt install libxml2-utils执行 # postgres源码安装包解压文件夹中 make install make install问题 make -C src install make[2]: Entering directory /home/postgres/postgresql-1…...
Jenkins pipeline 发送邮件及包含附件
Jenkins pipeline 发送邮件及包含附件 设置邮箱开启SMTP服务 此处适用163 邮箱 开启POP3/SMTP服务通过短信获取TOKEN (保存TOKEN, 后面Jenkins会用到) Jenkins 邮箱设置 安装 Build Timestamp插件 设置全局凭证 Dashboard -> Manage Jenkins …...
基于深度学习的视觉检测小项目(十) 通过样式表改变界面的外观
一、创建色卡模板文件 在PS中打开之前创建的色卡文件,用吸管拾色器吸取各个色卡的色彩值: 并保存为JSON文件,color_card.json,文件保存在项目的/settings目录下: {"colors": {"RED": "#dc1…...
【Java基础】Stream流、文件File相关操作,IO的含义与运用
1. Java 流(Stream)、文件(File)和IO Java.io 包几乎包含了所有操作输入、输出需要的类。所有这些流类代表了输入源和输出目标。Java.io 包中的流支持很多种格式,比如:基本类型、对象、本地化字符集等等。 一个流可以理解为一个数据的序列。 输入流表…...
Java-日志-Slf4j-Log4j-logback
文章目录 SLF4J基础概念使用输出形式日志绑定桥接旧的框架实战 logback基础概念配置文件 Log4j概述 SLF4J 参考: https://www.cnblogs.com/shenStudy/p/15806951.html https://slf4j.org/ 基础概念 是什么?SLF4J(Simple Logging Facade fo…...
探索式测试
探索式测试是一种软件测试风格,它强调独立测试人员的个人自由和职责,为了持续优化其工作的价值,将测试学习、测试设计、测试执行和测试结果分析作为相互支持的活动,在整个项目实现过程中并行地执行。 选择合适的探索式测试方法我…...