Java中的继承及相关概念
在 Java 中,继承是一种允许一个类继承另一个类的特性。通过继承,子类可以获取父类的属性和方法,这有助于减少代码冗余并提高代码的可维护性。以下是关于文件内容的相关分析和知识点总结:
一、继承的核心概念
1.继承的语法
-
Java 中的继承通过
extends关键字实现,基本语法如下:
class ParentClass {// 父类代码
}class ChildClass extends ParentClass {// 子类代码
}
-
子类会自动继承父类的非私有属性和方法
2.方法的继承与重写
-
在继承中,子类可以继承父类中的方法和属性。例如,在
BBB.java中,BBB类继承了AAA类的testA方法(通过super.testA()调用) 文件内容在下方 -
子类也可以重写父类的方法。在
BBB.java中,BBB类重写了父类的testA方法,使其具有不同的实现
3.构造器的调用
-
子类在创建对象时,会自动调用父类的无参构造器(如果父类有无参构造器)。如果父类没有无参构造器,则子类需要显式调用父类的带参构造器,如
BBB.java中的super(name)
4.继承层次
-
Java 只支持单继承,即一个子类只能继承一个父类。这是为了避免多重继承可能带来的复杂性问题,如 “菱形继承” 问题(Diamond Problem)
-
例如,
BBB.java只能继承自AAA.java,不能同时继承多个父类
二、相关代码示例及分析
1. 示例:AAA.java
package com.qcby;public class AAA {public void testA() {System.out.println("该方法当中有很多逻辑运算----》AAA");}public AAA(String name) {// 父类带参构造器}
}
-
AAA类定义了一个方法testA和一个带参构造器
2. 示例:BBB.java
package com.qcby;public class BBB extends AAA {public void testA() {System.out.println("该方法当中有很多逻辑运算----》BBB");}public void name() {super.testA(); // 调用父类的方法testA(); // 调用子类自己的方法}public BBB(String name) {super(name); // 调用父类的带参构造器}
}
-
BBB类继承了AAA类,并重写了testA方法 -
在
name方法中,通过super.testA()调用了父类的testA方法,展示了如何在子类中调用父类的方法 -
子类的构造器调用了父类的
super(name),确保父类的初始化
3. 示例:Test.java(继承测试)
package com.qcby;public class Test {public static void main(String[] args) {BBB bbb = new BBB("Example");bbb.name(); // 输出:// 该方法当中有很多逻辑运算----》AAA// 该方法当中有很多逻辑运算----》BBB}
}
-
在
main方法中,创建了BBB类的对象,并调用了name方法,演示了继承和方法调用的过程
三、静态初始化与构造函数调用顺序
1. 示例代码:Demo.java
package stack;public class Demo {public Demo(String aa) {System.out.println("====" + aa);}static {System.out.println("11");}public static Demo demo = new Demo("+++");static {System.out.println("22");}public static void main(String[] args) {Demo demo = new Demo("----");}
}
2. 运行结果
11
11
===+
22
===-
3. 分析
-
静态块的执行顺序:静态块在类加载时执行,且按照代码中出现的顺序依次执行
-
在
Demo类中,有两个静态块和一个静态变量初始化。静态块的执行顺序是:-
首先执行第一个静态块(
System.out.println("11");) -
然后初始化静态变量
demo = new Demo("+++");,这会触发Demo类的构造函数执行 -
接着执行第二个静态块(
System.out.println("22");)
-
-
-
构造函数的调用顺序:构造函数在对象创建时调用。在
main方法中,调用new Demo("----");时:-
首先执行
Demo类的构造函数,输出====----
-
4. 总结
-
静态块用于类的初始化,执行顺序按照代码中的位置顺序。
-
构造函数用于对象的初始化,在创建对象时执行。
-
类加载过程中,静态块和静态变量初始化的顺序会影响程序的输出。
四、关键知识点总结
| 概念 | 说明 |
|---|---|
| 继承语法 | 使用 extends 关键字实现,子类继承父类的非私有属性和方法。 |
| 方法重写 | 子类可以重写父类的方法,方法名、参数列表必须相同,实现不同。 |
| 构造器调用 | 子类创建对象时,需调用父类的构造器(super)初始化父类成员。 |
| Java 单继承特性 | 一个子类只能继承一个父类,避免多重继承的复杂性。 |
| 静态块与构造函数 | 静态块用于类初始化,按代码顺序执行;构造函数用于对象初始化,在对象创建时调用。 |
五、实例代码与运行结果
1. 继承测试(Test.java)
package com.qcby;public class Test {public static void main(String[] args) {BBB bbb = new BBB("重写");bbb.name();bbb.testA();bbb.run();bbb.run("方法重载");}
}
2. 运行结果
该方法当中有很多逻辑运算----》AAA
该方法当中有很多逻辑运算----》BBB
该方法当中有很多逻辑运算----》BBB
该方法当中有很多逻辑运算----→BBB
3. 分析
-
调用
name方法时:-
先通过
super.testA()调用父类的testA方法。 -
再调用子类的
testA方法。
-
-
调用
run方法时,展示了方法重载的特性。
六、总结
-
继承是 Java 中面向对象编程的重要特性,允许我们扩展类的功能,实现代码复用。通过继承,子类可以获取父类的属性和方法,并在此基础上添加自己的特性
-
super关键字 在继承中扮演了重要角色,它可以用来调用父类的构造器、方法和属性 -
注意 Java 的单继承特性,避免过度使用继承,以保持代码的清晰性和可维护性
-
方法重载和重写 是继承机制中的常见概念,理解它们的区别和使用场景对于编写高质量的 Java 代码至关重要
-
静态块和构造函数的调用顺序 在类和对象的初始化过程中起着关键作用,需要根据实际需求合理安排代码
希望这篇博客能够帮助你更好地理解 Java 中的继承机制以及相关知识点!如有任何疑问,欢迎在评论区留言讨论。
相关文章:
Java中的继承及相关概念
在 Java 中,继承是一种允许一个类继承另一个类的特性。通过继承,子类可以获取父类的属性和方法,这有助于减少代码冗余并提高代码的可维护性。以下是关于文件内容的相关分析和知识点总结: 一、继承的核心概念 1.继承的语法 Java …...
语言月赛 202308【小粉兔做麻辣兔头】题解(AC)
》》》点我查看「视频」详解》》》 [语言月赛 202308] 小粉兔做麻辣兔头 题目描述 粉兔喜欢吃麻辣兔头,麻辣兔头的辣度分为若干级,用数字表示,数字越大,兔头越辣。为了庆祝粉兔专题赛 #1 的顺利举行,粉兔要做一些麻…...
云原生后端|实践?
云原生(Cloud Native)是一种构建和运行应用程序的方法,它充分利用云计算的优势,包括弹性、可扩展性、高可用性和自动化运维。云原生后端开发通常涉及微服务架构、容器化、持续集成/持续部署(CI/CD)、服务网…...
GrassWebProxy
GrassWebProxy第一版: using System; using System.Collections.Generic; using System.Linq; using System.Net.Sockets; using System.Net; using System.Text; using System.Threading; using System.Threading.Tasks; using System.IO; using Newtonsoft.Json;…...
6.Python函数:函数定义、函数的类型、函数参数、函数返回值、函数嵌套、局部变量、全局变量、递归函数、匿名函数
1. 函数定义 Python函数通过def关键字定义。一个函数通常包括函数名、参数列表和函数体。 def greet(name):return f"Hello, {name}!"2. 函数的类型 Python中的函数主要有以下几种类型: 普通函数:具有明确的输入参数和返回值。递归函数&am…...
青少年编程与数学 02-008 Pyhon语言编程基础 22课题、类的定义和使用
青少年编程与数学 02-008 Pyhon语言编程基础 22课题、类的定义和使用 一、类类的定义和使用示例 二、定义1. 类定义语法2. 属性和方法3. 构造器和初始化4. 实例化5. 类变量和实例变量6. 类方法和静态方法7. 继承8. 多态总结 三、使用1. 创建类的实例2. 访问属性3. 调用方法4. 修…...
CosyVoice /F5-TTS /GPT-SoVITS /Fish-Speech 开源语音克隆与文本转语音(TTS)项目的对比整理
四个主流开源语音克隆与文本转语音(TTS)项目的对比整理,基于公开资料与实测反馈总结: 项目CosyVoice F5-TTS GPT-SoVITS Fish-Speech 核心技术双向流式语音合成,支持离线与流式一体化建模基于流匹配的ConvNeXt文本表示…...
MySQL基于binlog和gtid主从搭建方案
MySQL基于binlog和gtid主从搭建方案 一.主库配置 1.1 确认 binlog 是否开启 SHOW VARIABLES LIKE %log_bin%; 1.2 创建日志目录并设置权限 mkdir -p /opt/mysql/log_bin chown -R mysql:mysql /usr/local/mysql chmod -R 755 /usr/local/mysql 1.3 修改 my.cnf 配置文件 …...
5 计算机网络
5 计算机网络 5.1 OSI/RM七层模型 5.2 TCP/IP协议簇 5.2.1:常见协议基础 一、 TCP是可靠的,效率低的; 1.HTTP协议端口默认80,HTTPSSL之后成为HTTPS协议默认端口443。 2.对于0~1023一般是默认的公共端口不需要注册,1024以后的则需…...
Vim跳转文件及文件行结束符EOL
跳转文件 gf 从当前窗口打开那个文件的内容,操作方式:让光标停在文件名上,输入gf。 Ctrlo 从打开的文件返回之前的窗口 Ctrlwf 可以在分割的窗口打开跳转的文件,不过在我的实验不是次次都成功。 统一行尾格式 文本文件里存放的…...
智能理解 PPT 内容,快速生成讲解视频
当我们想根据一版 PPT 制作出相对应的解锁视频时,从撰写解锁词,录制音频到剪辑视频,每一个环节都需要投入大量的时间和精力,本方案将依托于阿里云函数计算 FC 和百炼模型服务,实现从 PPT 到视频的全自动转换࿰…...
【鸿蒙开发】第二十四章 AI - Core Speech Kit(基础语音服务)
目录 1 简介 1.1 场景介绍 1.2 约束与限制 2 文本转语音 2.1 场景介绍 2.2 约束与限制 2.3 开发步骤 2.4 设置播报策略 2.4.1 设置单词播报方式 2.4.2 设置数字播报策略 2.4.3 插入静音停顿 2.4.4 指定汉字发音 2.5 开发实例 3 语音识别 3.1 场景介绍 3.2 约束…...
Java/Kotlin双语革命性ORM框架Jimmer(一)——介绍与简单使用
概览 Jimmer是一个Java/Kotlin双语框架 包含一个革命性的ORM 以此ORM为基础打造了一套综合性方案解决方案,包括 DTO语言 更全面更强大的缓存机制,以及高度自动化的缓存一致性 更强大客户端文档和代码生成能力,包括Jimmer独创的远程异常 …...
番外02:前端八股文面试题-CSS篇
一:CSS基础 1:CSS选择器及其优先级 2:display的属性值及其作用 属性值作用none元素不显示,并且会从文档流中移除block块类型,默认元素为父元素宽度,可设置宽高,换行显示inline行内元素类型&a…...
Redis Copilot:基于Redis为AI打造的副驾工具
我们最近发布了Redis Copilot,以帮助开发者更快地使用Redis构建应用。我们的使命是使应用程序快速运行,并简化构建过程。为此,Redis Copilot作为您的AI助手,能够让您更迅速地完成与Redis相关的任务。您今天就可以在Redis Insight中…...
JavaScript遍历对象的7种方式
注:纯手打,如有错误欢迎评论区交流! 转载请注明出处:https://blog.csdn.net/testleaf/article/details/145523427 编写此文是为了更好地学习前端知识,如果损害了有关人的利益,请联系删除! 本文章…...
如何避免NACK重传风暴
策略 1,10 次 NACK 模块对同一包号的最大请求次数,超过这个最大次数限制,会把该包号移出 nack_list,放弃对该包的重传请求。 策略 2,20 毫秒 NACK 模块每隔 20 毫秒批量处理 nack_list,获取一批请求包号…...
并发工具CountDownLatch、CyclicBarrier、Semaphore
文章目录 学习链接CountDownLatchCountDownLatch类的作用类的主要方法介绍图解await和countDown方法两个典型用法注意点总结示例CountDownLatchDemo1CountDownLatchDemo2CountDownLatchDemo1And2 CyclicBarrierCyclicBarrier循环栅栏CyclicBarrier和CountDownLatch的区别示例Cy…...
十二. Redis 集群操作配置(超详细配图,配截图详细说明)
十二. Redis 集群操作配置(超详细配图,配截图详细说明) 文章目录 十二. Redis 集群操作配置(超详细配图,配截图详细说明)1. 为什么需要集群-高可用性2. 集群概述(及其搭建)3. Redis 集群的使用4. Redis 集群故障恢复5. Redis 集群的 Jedis 开发(使用Java…...
网络工程师 (26)TCP/IP体系结构
一、层次 四层: 网络接口层:TCP/IP协议的最底层,负责网络层与硬件设备间的联系。该层协议非常多,包括逻辑链路和媒体访问控制,负责与物理传输的连接媒介打交道,主要功能是接收数据报,并把接收到…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...
高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...
LRU 缓存机制详解与实现(Java版) + 力扣解决
📌 LRU 缓存机制详解与实现(Java版) 一、📖 问题背景 在日常开发中,我们经常会使用 缓存(Cache) 来提升性能。但由于内存有限,缓存不可能无限增长,于是需要策略决定&am…...
毫米波雷达基础理论(3D+4D)
3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文: 一文入门汽车毫米波雷达基本原理 :https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...
【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error
在前端开发中,JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作(如 Promise、async/await 等),开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝(r…...
【Kafka】Kafka从入门到实战:构建高吞吐量分布式消息系统
Kafka从入门到实战:构建高吞吐量分布式消息系统 一、Kafka概述 Apache Kafka是一个分布式流处理平台,最初由LinkedIn开发,后成为Apache顶级项目。它被设计用于高吞吐量、低延迟的消息处理,能够处理来自多个生产者的海量数据,并将这些数据实时传递给消费者。 Kafka核心特…...
QT开发技术【ffmpeg + QAudioOutput】音乐播放器
一、 介绍 使用ffmpeg 4.2.2 在数字化浪潮席卷全球的当下,音视频内容犹如璀璨繁星,点亮了人们的生活与工作。从短视频平台上令人捧腹的搞笑视频,到在线课堂中知识渊博的专家授课,再到影视平台上扣人心弦的高清大片,音…...
Netty自定义协议解析
目录 自定义协议设计 实现消息解码器 实现消息编码器 自定义消息对象 配置ChannelPipeline Netty提供了强大的编解码器抽象基类,这些基类能够帮助开发者快速实现自定义协议的解析。 自定义协议设计 在实现自定义协议解析之前,需要明确协议的具体格式。例如,一个简单的…...
运行vue项目报错 errors and 0 warnings potentially fixable with the `--fix` option.
报错 找到package.json文件 找到这个修改成 "lint": "eslint --fix --ext .js,.vue src" 为elsint有配置结尾换行符,最后运行:npm run lint --fix...
