继承详细说明

概述

Java中提供一个关键字extends,用这个关键字,我们可以让一个类和另一个类建立起父子关系。

例如:public class Student extends People {}

Student称为子类(派生类),People称为父类(基类 或超类)。

使用继承的好处

当子类继承父类后,就可以直接使用父类公共的属性和方法了。

提高代码复用性,减少代码冗余,增强类的功能扩展性。

案例练习:

请阅读以下代码存在的问题,并使用继承这个技术进行优化。

 解决方案:把相同的属性和行为抽离出来,构成父类,子类继承即可

继承的设计规范

子类们相同特征(共性属性,共性方法)放在父类中定义,子类独有的的属性和行为应该定义在子类自己里面。

为什么? 如果子类的独有属性、行为定义在父类中,会导致其它子类也会得到这些属性和行为,这不符合面向对象逻辑。

内存运行原理

继承的特点

子类可以继承父类的属性和行为,但是子类不能继承父类的构造器。

Java是单继承模式:一个类只能继承一个直接父类。

Java不支持多继承、但是支持多层继承。

Java中所有的类都是Object类的子类。

1、子类是否可以继承父类的构造器?

不可以的,子类有自己的构造器,父类构造器用于初始化父类对象。

2、子类是否可以继承父类的私有成员? 可以的,只是不能直接访问。

3、子类是否可以继承父类的静态成员?

有争议的知识点。

子类可以直接使用父类的静态成员(共享)

但个人认为:子类不能继承父类的静态成员。(共享并非继承) 

4、Java为何不支持多继承,请看如下反证法

public class 父类A {     public void method(){         System.out.println("复习数学");     } }

public class 父类B {     public void method(){         System.out.println("复习语文");     } }

public class 子类C extends 父类A , 父类B{    

        public static void main(String[] args) {              

                子类 z = new 子类();        

                z.method();   // 复习啥?出现二义性,听哪个爸爸的呢?java懵了!因此不支持多继承    

} }

继承后:成员变量、成员方法的访问特点

在子类方法中访问成员(成员变量、成员方法)满足:就近原则

        先子类局部范围找

        然后子类成员范围找

        然后父类成员范围找,如果父类范围还没有找到则报错。

如果子父类中,出现了重名的成员,会优先使用子类的,此时如果一定要在子类中使用父类的怎么办?

        可以通过super关键字,指定访问父类的成员。格式:super.父类成员变量/父类成员方法

继承后:方法重写

在继承体系中,子类出现了和父类中一模一样的方法声明,我们就称子类这个方法是重写的方法。

方法重写的应用场景

当子类需要父类的功能,但父类的该功能不完全满足自己的需求时。

子类可以重写父类中的方法。

案例演示:

旧手机的功能只能是基本的打电话,发信息

新手机的功能需要能够:基本的打电话下支持视频通话。基本的发信息下支持发送语音和图片。

public class Phone {
    public void call(){
        System.out.println("打电话开始~~~");
    }

    public void sendMessage(){
        System.out.println("发送短信开始~~~");
    }
}
public class NewPhone extends Phone{
    /**
      方法重写了
     */
    @Override
    public void call() {
        super.call();
        System.out.println("支持视频通话~~~");
    }

    /**
     方法重写了
     */
    @Override
    public void sendMessage() {
        super.sendMessage();
        System.out.println("支持发送图片和视频~~~");
    }
}

 @Override重写注解

@Override是放在重写后的方法上,作为重写是否正确的校验注解。

加上该注解后如果重写错误,编译阶段会出现错误提示。

建议重写方法都加@Override注解,代码安全,优雅!

方法重写注意事项和要求

重写方法的名称、形参列表必须与被重写方法的名称和参数列表一致。

私有方法不能被重写。

子类重写父类方法时,访问权限必须大于或者等于父类 (暂时了解 :缺省 < protected < public) 。

子类不能重写父类的静态方法,如果重写会报错的。

继承后:子类构造器的特点

子类中所有的构造器默认都会先访问父类中无参的构造器,再执行自己。

为什么?

子类在初始化的时候,有可能会使用到父类中的数据,如果父类没有完成初始化,子类将无法使用父类的数据。

子类初始化之前,一定要调用父类构造器先完成父类数据空间的初始化。

怎么调用父类构造器的?

子类构造器的第一行语句默认都是:super(),不写也存在。

继承后:子类构造器访问父类有参构造器

super调用父类有参数构造器的作用:

初始化继承自父类的数据。

如果父类中没有无参数构造器,只有有参构造器,会出现什么现象呢?

会报错,因为子类默认是调用父类无参构造器的。

如何解决?

子类构造器中可以通过书写 super(…),手动调用父类的有参数构造器

this、super使用总结

this:代表本类对象的引用;super:代表父类存储空间的标识。

案例

需求:

在学员信息登记系统中,后台创建对象封装数据的时候如果用户没有输入学校,则默认使用“黑马培训中心”。

如果用户输入了学校则使用用户输入的学校信息。 

public class Student {
    private String name;
    private String schoolName;

    public Student() {
    }

    public Student(String name) {
        // 借用兄弟构造器!
        this(name, "黑马培训中心");
    }


    public Student(String name, String schoolName) {
        this.name = name;
        this.schoolName = schoolName;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSchoolName() {
        return schoolName;
    }

    public void setSchoolName(String schoolName) {
        this.schoolName = schoolName;
    }
}

this(...)和super(…)使用注意点:

子类通过 this (...)去调用本类的其他构造器,本类其他构造器会通过 super 去调用父类的构造器,最终还是会调用父类构造器的。

注意:this(…) super(…) 都只能放在构造器的第一行,所以二者不能共存在同一个构造器中。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

分布式系统架构设计之分布式消息队列 VS 分布式事务

1、分布式事务的挑战 在分布式系统中&#xff0c;事务的处理变得尤为复杂&#xff0c;传统的数据库事务&#xff08;ACID&#xff09;在单一数据库中可以确保数据的完整性和一致性&#xff0c;但在多个分布式节点间保证事务的原子性、一致性、隔离性和持久性变得极具挑战性。 …

【Go】excelize库实现excel导入导出封装(三),基于excel模板导出excel

前言 大家好&#xff0c;这里是符华~ 关于excelize库实现excel导入导出封装&#xff0c;我已经写了两篇了&#xff0c;我想要的功能基本已经实现了&#xff0c;现在还差一个模板导出&#xff0c;这篇文章就来讲讲如何实现用模板导出excel。 前两篇&#xff1a; 【Go】excel…

作业:通过两台linux主机配置ssh实现互相免密登陆

做题步骤&#xff1a; 一.开启两个Linux主机&#xff0c;并且用ssh连接&#xff0c;要能够ping通 我这里是server&#xff1a;192.168.81.129 client&#xff1a;192.168.81.130 举例 步骤&#xff1a; 1.安装服务软件 2.运行软件程序 3.根据自定配置提供对应的服务/etc/chr…

02.构建和使用的大型语言模型(LLMs)阶段

我们为什么要建立自己的LLMs?LLM从头开始编码是了解其机制和局限性的绝佳练习。此外,它还为我们提供了必要的知识,可以保留或微调现有的开源LLM架构,以适应我们自己的特定领域的数据集或任务。 研究表明,在建模性能方面,定制(LLMs为特定任务或领域量身定制的)可以胜过…

如何高效阅读Linux的man page

有时候需要在man page中查某个命令的用法&#xff0c;我们一般会使用man command的方式来查询&#xff0c;例如man vmstat.但是对于一些bash内置的命令&#xff0c;如alias,如果使用man alias会打开General Commands Manual ,如下图 可以看到&#xff0c;内置命令很多&#xff…

如何通过 Prompt 优化大模型 Text2SQL 的效果

前言 在上篇文章中「大模型LLM在Text2SQL上的应用实践」介绍了基于SQLDatabaseChain的Text2SQL实践&#xff0c;但对于逻辑复杂的查询在稳定性、可靠性、安全性方面可能无法达到预期&#xff0c;比如输出幻觉、数据安全、用户输入错误等问题。 本文将从以下4个方面探讨通过Pr…

用于生成信息提取的大型语言模型综述

论文地址&#xff1a;https://arxiv.org/pdf/2312.17617.pdf 代码仓库&#xff1a;https://github.com/quqxui/Awesome-LLM4IE-Papers 信息抽取&#xff08;IE&#xff09;旨在从纯自然语言文本中提取结构化知识&#xff08;如实体、关系和事件&#xff09;。最近&#xff0c…

初识 Elasticsearch 应用知识,一文读懂 Elasticsearch 知识文集(2)

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

手拉手springboot3整合mybatis-plus多数据源

环境介绍 技术栈 springbootmybatis-plusmysql 软件 版本 mysql 8 IDEA IntelliJ IDEA 2022.2.1 JDK 17 Spring Boot 3.1.7 dynamic-datasource 3.6.1 mybatis-plus 3.5.3.2 加入依赖 <dependency><groupId>com.baomidou</groupId><arti…

WAVENET: A GENERATIVE MODEL FOR RAW AUDIO

ABSTRACT 这篇论文提出了WaveNet&#xff0c;一个生成原始音频波形的深度神经网络。这是一个完全的概率自回归模型&#xff0c;它基于之前已经生成的所有样本&#xff0c;来预测当前音频样本的概率分布&#xff1b;不过&#xff0c;我们将会展示它可以在每秒数万采样率的音频数…

精华整理几十个Python数据科学、机器学习、深度学习、神经网络、人工智能方面的核心库以及详细使用实战案例,轻松几行代码训练自己的专有人工智能模型

精华整理几十个Python数据科学、机器学习、深度学习、神经网络、人工智能方面的核心库以及详细使用实战案例,轻松几行代码训练自己的专有人工智能模型。 机器学习 人工智能的核心,是使计算机具有智能的根本途径。机器学习专注于算法,允许机器学习而不需要编程,并在暴露于新…

【VTKExample::Visualization】第四期 BLOW

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 前言 本文分享Blow样例,用于挤出吹塑工艺的有限元分析,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ~YO 目录 前言 1. Blow样例

求幸存数之和 - 华为OD统一考试

OD统一考试&#xff08;C卷&#xff09; 分值&#xff1a; 100分 题解&#xff1a; Java / Python / C 题目描述 给一个正整数列nums&#xff0c;一个跳数jump&#xff0c;及幸存数量left。运算过程为:从索引为0的位置开始向后跳&#xff0c;中间跳过 J 个数字&#xff0c;命中…

netdisk-fast-download强大的网盘直链解析工具源码

源码介绍 开源的网盘直链解析工具 netdisk-fast-download&#xff0c;这款强大的工具能够解析各类网盘直链&#xff0c;实现文件的快速上传与下载。目前已完美支持蓝奏云、奶牛快传、移动云空间、UC网盘、夸克网盘、小飞机盘、亿方云以及123云盘等众多知名网盘平台。 直链&am…

Spark---行动算子RDD

文章目录 1.行动算子1.1 reduce1.2 collect1.3 first1.4 count1.5 take1.6 takeOrdered1.7 aggregate1.8 fold1.9 countByKey1.10 countByValue1.11 save 相关算子1.12 foreach 1.行动算子 Spark的行动算子是触发作业执行的方法&#xff0c;它们会直接触发计算并返回结果。 行…

【集合大练习】---------------简易学生管理系统

目标&#xff1a; 实现学生对象新增&#xff0c;删除&#xff0c;查看&#xff0c;对象信息修改 整体实现思路&#xff1a; 1.定义学生类-------------创建学生对象 2.管理界面代码编写-------------命令提示面板 3.添加学生的代码编写---------add功能实现 4.查看学生信…

PPT插件-大珩助手-清除同类

清除同类-颜色 对于选定的形状&#xff0c;删除相同颜色 清除同类-文本 删除当前幻灯片中的文本对象 清除同类-非文本 删除当前幻灯片中的非文本对象 清空当页 删除当前幻灯片中的所有对象 选中的形状动画 删除选中的对象上的形状动画 当前页形状动画 对于当前页中的…

HDFS相关API操作

文章目录 API文档环境配置API操作准备工作创建文件夹文件上传文件下载文件删除文件的更名和移动获取文件详细信息 API文档 HDFS API官方文档&#xff1a;https://hadoop.apache.org/docs/r3.3.1/api/index.html 环境配置 将Hadoop的Jar包解压到非中文路径&#xff08;例如D:…

移动通信原理与关键技术学习之信道编解码(5)

先回顾调制的过程&#xff1a;调制就是对信号源的信息进行处理加到载波上&#xff0c;使其变为适合于信道传输的形式的过程&#xff0c;就是使载波随信号而改变的技术。 1.什么是IQ调制&#xff1f; 答&#xff1a;将数据分为两路&#xff0c;分别进行载波调制&#xff0c;两…

多维时序 | Matlab实现RIME-HKELM霜冰算法优化混合核极限学习机多变量时间序列预测

多维时序 | Matlab实现RIME-HKELM霜冰算法优化混合核极限学习机多变量时间序列预测 目录 多维时序 | Matlab实现RIME-HKELM霜冰算法优化混合核极限学习机多变量时间序列预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现RIME-HKELM霜冰算法优化混合核极限学…
最新文章