一篇文章带你彻底理解继承(Java面向对象的基石)——菜鸟教程学习记录

news2024/12/26 3:42:29

一篇文章带你彻底理解继承(Java面向对象的基石)——菜鸟教程学习记录

基本概念:

​ **继承是Java面向对象编程技术的一块基石,因为它允许创建“分等级层次的类“。**它允许一个类(称为子类或派生类)继承另一个类(称为父类、超类或基类)的属性和方法。

怎么理解分等级层次的类呢?

​ 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。

简单来讲:

通过继承,子类可以获得父类的非私有成员变量和非私有方法,包括字段、方法和构造函数。子类可以使用继承来扩展父类的功能,添加新的字段和方法,或者覆盖父类的方法以提供自定义的实现。

如下图这就是分等次层次的类:

img

可以点击链接去菜鸟教程看这一图的详解,如果简单理解的话那就是:父类更通用,子类更具体。


类的继承格式

在 Java 中通过 extends 关键字可以申明一个类是从另外一个类继承而来的,一般语法如下:

//类的继承格式
class 父类 {
}
class 子类 extends 父类 {
}

为什么需要继承?

从上面的例子中我们可以看出:

继承它提供了以下几个主要的好处和理由:
  1. **代码重用:**继承允许子类获得父类的属性和方法,避免了重复编写相同的代码。子类可以直接使用父类的成员,从而实现代码的重用和简化。
  2. 扩展性:通过继承,可以在现有的类的基础上进行扩展,添加额外的功能和特性。子类可以继承父类的行为,并且可以在此基础上添加新的行为或修改现有行为,从而实现类的功能扩展。
  3. **分类和抽象:**继承提供了一种分类和抽象的方式。通过将共同的属性和方法抽取到一个父类中,可以更好地组织和管理代码,使代码结构更加清晰和易于理解。
  4. **多态性:继承是实现多态性的基础。**通过将子类的对象赋值给父类的引用变量,可以在运行时根据对象的实际类型调用相应的方法。这种多态性提高了代码的灵活性和可扩展性。
  5. **继承关系的建模:**继承可以用于建立对象之间的关系,并模拟现实世界中的相关概念。例如上面的例子一样,我们可以通过继承建立"动物"和"食肉动物"之间的关系,其中"食肉动物"是"动物"的子类。

**PS:然继承有好处,但是过度的继承可能导致类之间的紧密耦合,使代码难以理解和维护。**因此,在使用继承时需要遵循面向对象编程的原则和最佳实践,确保继承关系合理、可靠和易于扩展。简单来说就是:合理暴露,合理开放!


继承类型

需要注意的是 “Java 不支持多继承,但支持多重继承。”

img


继承的特性

  • 子类拥有父类非 private 的属性、方法。
  • 子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。
  • 子类可以用自己的方式实现父类的方法。
  • Java 的继承是单继承,但是可以多重继承,单继承就是一个子类只能继承一个父类,多重继承就是,例如 B 类继承 A 类,C 类继承 B 类,所以按照关系就是 B 类是 C 类的父类,A 类是 B 类的父类,这是 Java 继承区别于 C++ 继承的一个特性。
  • 提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系越紧密,代码独立性越差)。

继承关键字extends和implements

在Java中,extendsimplements关键字都用于实现类之间的继承关系,但它们有不同的应用场景和语义。

  • **extends关键字用于实现类与类之间的继承关系。**一个类可以继承另一个类的属性和方法,从而扩展该类的功能。在继承关系中,子类(派生类)通过使用extends关键字指定一个父类(基类、超类),从而继承父类的非私有成员。Java中的继承是单继承的,即一个类只能有一个直接的父类。

    例如:

    class Animal {
        // 父类 Animal 的属性和方法
    }
    
    class Dog extends Animal {
        // 子类 Dog 继承了父类 Animal 的属性和方法,并可以进行扩展
    }
    
  • implements关键字用于实现类与接口之间的继承关系。接口定义了一组规范,而类通过实现接口来提供具体的实现。一个类可以实现一个或多个接口(多个接口的实现使用;隔开,变相让java巨头多继承特性),从而获得接口中定义的方法,并需要提供这些方法的具体实现。“接口的方法在实现类中必须被重写”。

    例如:

    interface Flyable {
        void fly();  // 接口 Flyable 定义了飞行的规范
    }
    
    class Bird implements Flyable {
        public void fly() {
            // 实现类 Bird 提供了飞行方法的具体实现
        }
    }
    

extends和implements的区别小结:

  • extends用于实现类与类之间的继承关系
  • implements用于实现类与接口之间的继承关系。
  • 通过继承和实现接口,可以实现代码的重用、扩展性和多态性等面向对象编程的特性。

super 与 this 关键字

**super关键字:**我们可以通过super关键字来实现对父类成员的访问,用来引用当前对象的父类。

this关键字:指向自己的引用。


[这里还涉及一个向上转型和向下转型的知识点]((14条消息) Java-高级编程继承中向上转型(Upcasting)和向下转型(Downcasting)的简单理解_java父类向下转型_Stevedash的博客-CSDN博客)

这是我前面的文章已经讲过的知识点。


final 关键字

final 可以用来修饰变量(包括类属性、对象属性、局部变量和形参)、方法(包括类方法和对象方法)和类。

final 含义为 “最终的”。

使用 final 关键字声明类,就是把类定义定义为最终类,不能被继承,或者用于修饰方法,该方法不能被子类重写:

  • 声明类:

    final class 类名 {//类体}
    
  • 声明方法:

    修饰符(public/private/default/protected) final 返回值类型 方法名(){//方法体}
    

注: final 定义的类,其中的属性、方法不是 final 的。

解释如下:

当一个类被声明为final时,该类本身不能被继承,但其中的属性和方法并不会自动成为final。”final类中的属性和方法可以根据需要进行修改或重写。“

简单且具体的来讲:

  • 对于属性:final类中的属性没有被隐式地设为final,因此可以通过在构造函数或其他方法中赋值来更改它们的值。
  • 对于方法:final类中的方法也没有被隐式地设为final,因此子类仍然可以覆盖和重写这些方法。

如果希望某个属性或方法在final类中无法被修改或重写,我们可以使用final修饰符来标记它们,例如

final int x = 10;//最终量
final void doSomething() { ... }`。//最终方法

构造器

子类是不继承父类的构造器(构造方法或者构造函数)的,它只是调用(隐式或显式)。

  • 简单理解:
    如果“父类的构造器带有参数”,则必须在子类的构造器中显式地”通过 super 关键字调用父类的构造器并配以适当的参数列表,才能够调用到父类的构造器“
  • 如果“父类构造器没有参数”,则在子类的构造器中不需要使用 super 关键字调用父类构造器,“系统会自动调用父类的无参构造器。”

具体例子如下:

class SuperClass {
  private int n;
  SuperClass(){
    System.out.println("SuperClass()");
  }
  SuperClass(int n) {
    System.out.println("SuperClass(int n)");
    this.n = n;
  }
}
// SubClass 类继承
class SubClass extends SuperClass{
  private int n;
  
  SubClass(){ // 自动调用父类的无参数构造器
    System.out.println("SubClass");
  }  
  
  public SubClass(int n){ 
    super(300);  // 调用父类中带有参数的构造器
    System.out.println("SubClass(int n):"+n);
    this.n = n;
  }
}
// SubClass2 类继承
class SubClass2 extends SuperClass{
  private int n;
  
  SubClass2(){
    super(300);  // 调用父类中带有参数的构造器
    System.out.println("SubClass2");
  }  
  
  public SubClass2(int n){ // 自动调用父类的无参数构造器
    System.out.println("SubClass2(int n):"+n);
    this.n = n;
  }
}
public class TestSuperSub{
  public static void main (String args[]){
    System.out.println("------SubClass 类继承------");
    SubClass sc1 = new SubClass();
    SubClass sc2 = new SubClass(100); 
    System.out.println("------SubClass2 类继承------");
    SubClass2 sc3 = new SubClass2();
    SubClass2 sc4 = new SubClass2(200); 
  }
}

输出结果为:

------SubClass 类继承------
SuperClass()
SubClass
SuperClass(int n)
SubClass(int n):100
------SubClass2 类继承------
SuperClass(int n)
SubClass2
SuperClass()
SubClass2(int n):200

结尾语:记录于2023年7月31号21时00分,以上仅为个人在Java继承——面向对象的学习过程中遇到的问题,还有记录的个人想法,有错误欢迎指出,希望对您有帮助,感谢观看!如果可以的话,点点赞,点点关注

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

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

相关文章

Gartner发布2023年最新技术成熟度曲线,偶数科技位列湖仓一体代表厂商

近日,Gartner 发布技术成熟度曲线《Hype Cycle for Data, Analytics and AI in China, 2023》,偶数科技本次入选湖仓一体代表厂商,这是继在去年偶数荣获Gartner“酷”厂商(《Cool Vendors in Data Management, China》&#xff09…

MACOM EDI 需求分析

MACOM 是一家全球性半导体公司,专注于设计和制造高性能射频、微波和光电元件,其产品被广泛应用于通信、航空航天、国防、工业和医疗等领域。随着 MACOM 的不断发展,传统数据传输方式效率较低,无法满足 MACOM 的需求。为了提高企业…

动作分析的要素有哪些?什么软件可以帮助企业进行动作分析?

一次完整的作业,常常是由一系列细小的动作构成,从表面看来,似乎没有任何浪费存在。事实上,如果我们仔细地对作业行为进行分解,将其单独记录下来,会发现其中许多行为是多余的,或者可以避免的。在…

手把手教你如何在Windows下allure与jenkins的集成生成让你一见钟情的测试报告 - 03(非常详细)

简介 为什么要把allure和jenkins集成了?原因是集成以后,我们就可以直接查看allure的结果,不需要重复输入命令、重复使用浏览器打开文件来查看allure的结果,而且jenkins历史记录可以留存,方便进行对比前后的变化等等。由…

k8s kubeadm命令升级集群 从1.17升级到1.18

k8s kubeadm命令升级集群 从1.17升级到1.18 大纲 注意事项master节点执行升级命令master节点和node节点执行命令 注意事项 目标当前线上k8s集群版本是k8s1.17 想把k8s升级到1.18。注意k8s不能跨版本升级例如k8s1.17不能直接升级到k8s1.19,需要先升级到1.18才后向…

Transformer 要占领地球了,大语言模型最全盘点!

随着最近半年 ChatGPT 火爆全球,基于 Transformer 架构的大语言模型(LLM)逐渐走入大众视野,可以说,Transformer 在AI 领域的影响力绝不亚于变形金刚在科幻领域的影响力。 Transformer 的核心思想是使用自注意力机制&am…

视频怎样分割成两段?分享几种视频分割方法

当需要制作长时间的视频时,将视频分割成几段可以帮助你更好地组织视频内容,使其更易于理解和学习。与此同时,将视频分割成多个小部分也可以在不影响整体视频质量的情况下将其上传到各种平台,并节省存储空间。此外,如果…

使用文心一言等智能工具指数级提升嵌入式/物联网(M5Atom/ESP32)和机器人操作系统(ROS1/ROS2)学习研究和开发效率

以M5AtomS3为例,博客撰写效率提升10倍以上: 0. Linux环境Arduino IDE中配置ATOM S3_zhangrelay的博客-CSDN博客 1. M5ATOMS3基础01按键_zhangrelay的博客-CSDN博客 2. M5ATOMS3基础02传感器MPU6886_zhangrelay的博客-CSDN博客 3. M5ATOMS3基础03给RO…

快速搭建单机RocketMQ服务(开发环境)

一、什么是RocketMQ ​ RocketMQ是阿里巴巴开源的一个消息中间件,在阿里内部历经了双十一等很多高并发场景的考验,能够处理亿万级别的消息。2016年开源后捐赠给Apache,现在是Apache的一个顶级项目。 早期阿里使用ActiveMQ&#xff0c…

SegNeXt:重新思考用于语义分割的卷积注意力

&原文信息 原文题目:《SegNeXt: Rethinking Convolutional Attention Design for Semantic Segmentation》 原文引用:Guo M H, Lu C Z, Hou Q, et al. Segnext: Rethinking convolutional attention design for semantic segmentation[J]. Advance…

SQL从三个表中根据时间分别查询并汇总数量一行展示

需求:如果您要从三个表中根据时间分别查询并汇总数量,然后将结果以时间和数量一行展示,可以使用子查询和条件聚合。 入库主表 入库明细表 出库主表 出库明细表 退货主表 退货明细表 SQL代码 SELECT time,sum(a.inQty) as inQty,sum(a.outQty…

想写几个上位机,是选择学c#还是 c++ qt呢?

C#基本也就上位机开发开发,另外做做日常用的小工具很方便。 结合PLC,以太网做上位机,这个基本上控制这块都比较有需求。 另外我们用C#也做一些工具的二次开发,感觉还行。 C用qt框架其实学习起来可能稍微复杂些,但是…

<MyBatis>MyBatis把空字符串转换成0的问题处理方案

先看问题: Postman入参: MyBatis采用map循环插入: // Mapper接口层void addPar(Param(value "question") Map<String, Object> paramMap);<!-- 新增&#xff1a;参数 --><insert id"addPar" parameterType"map">INSERT IGNO…

linux 配置nacos遇见的问题及解决办法

本次的集群是启动一个服务的三个不同端口&#xff0c;配置如下&#xff1a; 一.application.properties 加上下列配置&#xff0c;目的是使用自己的mysql数据库&#xff1a; spring.datasource.platformmysql db.num1 db.url.0jdbc:mysql://127.0.0.1:3306/nacos_config?s…

【深度学习】InST,Inversion-Based Style Transfer with Diffusion Models,论文,风格迁移,实战

代码&#xff1a;https://github.com/zyxElsa/InST 论文&#xff1a;https://arxiv.org/abs/2211.13203 文章目录 AbstractIntroductionRelated WorkImage style transferText-to-image synthesisInversion of diffusion models MethodOverview ExperimentsComparison with Sty…

构建可靠的前端工程:自动化、代码质量与性能优化

文章目录 代码质量工具与实践1. 代码静态检查工具2. 单元测试和集成测试3. 自动化构建和持续集成4. 代码审查和Pull请求(PR)5. 代码规范和格式化6. Git工作流和版本控制管理 前端性能优化工具与技巧1. 使用压缩和合并2. 图片优化3. 延迟加载4. CDN加速5. 缓存优化6. 代码优化7.…

一个简单的登录功能,你真的会测试吗?

前段时间看了《测试工程师全栈技术进阶与实战》一书&#xff0c;收获颇丰。书中刚开始是以一个登录功能开始的&#xff0c;这个例子非常具有代表性。说到这个登录功能&#xff0c;人人认为很简单&#xff0c;但是要设计好的测试用例&#xff0c;还是要费一番功夫的。把书中的这…

花费7元训练自己的GPT 2模型

在上一篇博客中&#xff0c;我介绍了用Tensorflow来重现GPT 1的模型和训练的过程。这次我打算用Pytorch来重现GPT 2的模型并从头进行训练。 GPT 2的模型相比GPT 1的改进并不多&#xff0c;主要在以下方面&#xff1a; 1. GPT 2把layer normalization放在每个decoder block的前…

森林生物量(蓄积量)数据处理到随机森科估算全流程

python森林生物量&#xff08;蓄积量&#xff09;估算全流程 一.哨兵2号获取/处理/提取数据1.1 影像处理与下载采用云概率影像去云采用6S模型对1C级产品进行大气校正geemap下载数据到本地NDVI 1.2 各种参数计算&#xff08;生物物理变量、植被指数等&#xff09;LAI&#xff1a…

程序员面试金典17.*

文章目录 17.01 不用加号的加法17.04 消失的数字17.05字母与数字17.06 2出现的次数17.07 婴儿名字17.08 马戏团人塔17.09 第k个数17.10 主要元素17.11 单词距离17.12 BiNode17.13 恢复空格&#xff08;未做&#xff0c;字典树dp&#xff09;17.14 最小K个数17.15 最长单词17.16…