【Java SE】继承

学习完了类之后,我们将继续学习一个Java中的重点内容“继承”


继承

1.1 为什么需要继承

举例:

  

在Cat类中和Dog类中我们发现有很多一样的地方,这样写太浪费空间和内存了

我们可以把它相同的地方都用一个类来表示,并且使用它1.2 继承概念 

那能否将这些共性抽取呢?面向对象思想中提出了继承的概念,专门用来进行共性抽取,实现代码复用。 


1.2 继承概念

继承(inheritance)机制:是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特 性的基础上进行扩展,增加新功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构, 体现了由简单到复杂的认知过程。

继承主要解决的问题是:共性的抽取,实现代码复用。

例如:狗和猫都是动物,那么我们就可以将共性的内容进行抽取,然后采用继承的思想来达到共用。 

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

从继承概念中可以看出继承最大的作用就是:实现代码复用,还有就是来实现多态(后序讲) 


1.3 继承的语法

 在Java中如果要表示类之间的继承关系,需要借助extends关键字,具体如下:

修饰符 class 子类 extends 父类 {
 // ... 
}

 

注意:
1. 子类会将父类中的成员变量或者成员方法继承到子类中了
2. 子类继承父类之后,必须要新添加自己特有的成员,体现出与基类的不同,否则就没有必要继承了 


1.4 父类成员访问 

在继承体系中,子类将父类中的方法和字段继承下来了,那在子类中能否直接访问父类中继承下来的成员呢?


1.4.1 子类中访问父类的成员变量

1.4.1 子类中访问父类的成员变量

 

  // 访问从父类中继承下来的a
  // 访问从父类中继承下来的b
  // 访问子类自己的c


1.4.2. 子类和父类成员变量同名 

在子类方法中 或者 通过子类对象访问成员时

  • 如果访问的成员变量子类中有,优先访问自己的成员变量。
  • 如果访问的成员变量子类中无,则访问父类继承下来的,如果父类也没有定义,则编译报错。
  • 如果访问的成员变量与父类中成员变量同名,则优先访问自己的。
  • 记住:父类对象和子类对象同名时,优先访问子类的
  • 要想访问的父类的成员变量时,一定要使用super关键字

在这里就可以看见super关键字this关键字的区别 


1.4.2 子类中访问父类的成员方法 

 要想访问到父类中的成员,得记住super关键字

1. 成员方法名字不同

当你成员方法不相同的时候,不管是父类方法还是子类方法都会被调用 


2. 成员方法名字相同 

所以想访问父类成员,必须使用super关键字 

【注意事项】
1. 只能在非静态方法中使用
2. 在子类方法中,访问父类的成员变量和方法。

super的其他用法在后文中介绍 


1.5 子类构造方法

父子父子,先有父再有子,即:子类对象构造时,需要先调用基类构造方法,然后执行子类的构造方法。

为什么调用了父类对象的构造方法,子类对象开始报错了 

因为:子类对象中成员是有两部分组成的,基类继承下来的以及子类新增加的部分 。

所以在构造子类对象时候 ,先要调用基类的构造方法,将从基类继承下来的成员构造完整
,然后再调用子类自己的构造方法,将子类自己新增加的成员初始化完整 。

例如: 

它是先打印父类的构造方法,在打印子类的构造方法 

 因此,所以父类对象已经构造了方法,子类必须重写构造方法

注意:
1. 若父类显式定义无参或者默认的构造方法,在子类构造方法第一行默认有隐含的super()调用,即调用基类构造方法

所以默认情况下是不会报错的 但父类对象写了构造方法,子类必须重写构造方法


2. 如果父类构造方法是带有参数的,此时需要用户为子类显式定义构造方法,并在子类构造方法中选择合适的父类构造方法调用,否则编译失败。


3. 在子类构造方法中,super(...)调用父类构造时,必须是子类构造函数中第一条语句。

super关键字必须在构造方法前面


4. super(...)只能在子类构造方法中出现一次,并且不能和this同时出现 


 1.6 super和this

 【相同点】
1. 都是Java中的关键字
2. 只能在类的非静态方法中使用,用来访问非静态成员方法和字段
3. 在构造方法中调用时,必须是构造方法中的第一条语句,并且不能同时存在


【不同点】 

1. this是当前对象的引用,当前对象即调用实例方法的对象,super相当于是子类对象中从父类继承下来部分成员的引用

2. 在非静态成员方法中,this用来访问本类的方法和属性,super用来访问父类继承下来的方法和属性

3. 在构造方法中:this(...)用于调用本类构造方法,super(...)用于调用父类构造方法,两种调用不能同时在构造方法中出现

4. 构造方法中一定会存在super(...)的调用,用户没有写编译器也会增加,但是this(...)用户不写则没有(默认情况下不写会隐藏)


1.7 再谈初始化

class Animals {
    public String name;
    public int age;

    public Animals(String name, int age) {
        this.name = name;
        this.age = age;
        System.out.println("父类构造代码块被执行了。。。");
    }
    static {
        System.out.println("父类静态代码块被执行了。。。");
    }
    {
        System.out.println("父类实例代码块被执行了。。。");
    }

    public void eat() {
        System.out.println(this.name + "正在吃。。。");
    }
}
class Cat extends Animals {
    public String color;
    public Cat(String name ,int age,String color) {
        super(name,age);
        this.color = color;
        System.out.println("子类构造代码块被执行了。。。");
    }
    static {
        System.out.println("子类静态代码块被执行了。。。");
    }
    {
        System.out.println("子类实例代码块被执行了。。。");
    }
    public void mmm() {
        System.out.println(this.name + "正在喵喵喵");
    }
}
public class Test {
    public static void main(String[] args) {
        Cat cat = new Cat("小白",3,"baise");
    }
}

通过分析执行结果,得出以下结论:

1、父类静态代码块优先于子类静态代码块执行,且是最早执行
2、父类实例代码块和父类构造方法紧接着执行
3、子类的实例代码块和子类构造方法紧接着再执行 

 4、第二次实例化子类对象时,父类和子类的静态代码块都将不会再执行


1.9 protected 关键字 

 

 

 

 


1.10 继承方式

 但在Java中只支持以下几种继承方式:

单继承:

多层继承: 

 

不同的类继承同一个父类: 

 多继承不支持

 

注意:Java中不支持多继承,但可以多态 


1.11 final 关键字 

final关键字可以用来修饰变量、成员方法以及类

 1. 修饰变量或字段,表示常量(即不能修改)

 

跟C语言中的const相似,不能被修改 

 2. 修饰类:表示此类不能被继承

 3. 修饰方法:表示该方法不能被重写(后序介绍)


 1.12 继承与组合

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

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

 

组合和继承都可以实现代码复用,应该使用继承还是组合,需要根据应用场景来选择,一般建议:能用组合尽量用组合 


总结:  

后期博主会陆续更新Java SE的知识

如有不足之处欢迎补充交流

看到这里的友友们,支持一下博主,来个免费三连,感谢! ! !


 

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

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

相关文章

【python零基础入门学习】python进阶篇之数据库连接-PyMysql-全都是干货-一起来学习吧!!!

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》:python零基础入门学习 《python运维脚本》: python运维脚本实践 《shell》:shell学习 《terraform》持续更新中:terraform_Aws学习零基础入门到最佳实战 《k8…

Springboot+vue的学生成绩管理系统(有报告),Javaee项目,springboot vue前后端分离项目。

演示视频: Springbootvue的学生成绩管理系统(有报告),Javaee项目,springboot vue前后端分离项目。 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家…

Windows11 python3.12 安装pyqt6 pyqt6-tools

Windows11 python3.12 安装pyqt6比较容易,但pyqt6-tools一直安装不上去。出错信息如下: (venv) PS D:\python_project\pyqt6> pip install pyqt6-tools Collecting pyqt6-toolsUsing cached pyqt6_tools-6.4.2.3.3-py3-none-any.whl (29 kB) Collec…

《少儿编程启蒙指南》

《少儿编程启蒙指南》大纲 本文详细阐述少儿编程启蒙,如果有人喜欢,往后我会继续更新迭代此文。 “Everyone should know how to program a computer, because it teaches you how to think.”—Steve Jobs 每个人都应该知道如何编程,因为它…

杭州信息安全

更轻量级的用户开销 (Lower online burden) 更灵活的通信模型 (Flexible metadata-private messaging) 一对一通信 >多对一、一对多通信 Group messaging Broadcast / anycast 元数据隐私保护技术在其他系统的推广

RocketMQ(二):原生API快速入门

RocketMQ系列文章 RocketMQ(一):基本概念和环境搭建 RocketMQ(二):原生API快速入门 目录 一、RocketMQ快速入门1、生产者发送消息2、消费者接受消息3、代理者位点和消费者位点 二、消费模型特点1、同一个消费组的不同消费者,订阅主题必须相…

Python每日一练@前言

Python每日一练前言 导读 人生苦短,我用Python 大家好,我是鹅不糊涂 欢迎大家来到Python每日一练 好处 加强编程能力: 每日一练可以帮助提升编程技能,通过解决各种编程问题和挑战,你能够不断锻炼自己的逻辑思维和解决问题的能力…

不允许你还没有了解哈希表、哈希桶、哈希冲突的解决,如何避免冲突

✏️✏️✏️今天给各位带来的是哈希桶、哈希冲突方面的知识。 清风的CSDN博客 😛😛😛希望我的文章能对你有所帮助,有不足的地方还请各位看官多多指教,大家一起学习交流! 动动你们发财的小手,点…

实用篇-ES-DSL查询文档

数据的存储不是目的,我们希望从海量的酒店数据中检索出需要的信息,这就是ES的搜索功能 官方文档: https://elastic.co/guide/en/elasticsearch/reference/current/query-dsl.html#query-dsl。DSL是用来查询文档的 Elasticsearch提供了基于JSON的DSL来定…

vite vue3配置eslint和prettier以及sass

准备 教程 安装eslint 官网 vue-eslint ts-eslint 安装eslint yarn add eslint -D生成配置文件 npx eslint --init安装其他插件 yarn add -D eslint-plugin-import eslint-plugin-vue eslint-plugin-node eslint-plugin-prettier eslint-config-prettier eslint-plugin…

【数据结构】图的存储结构及实现(邻接表和十字链表)

一.邻接矩阵的空间复杂度 假设图G有n个顶点e条边,则存储该图需要O(n^2) 不适用稀疏图的存储 二.邻接表 1.邻接表的存储思想: 对于图的每个顶点vi,将所有邻接于vi的顶点链成一个单链表,称为顶点vi的边表&#xff08…

C/C++ 运用VMI接口查询系统信息

Windows Management Instrumentation(WMI)是一种用于管理和监视Windows操作系统的框架。它为开发人员、系统管理员和自动化工具提供了一种标准的接口,通过这个接口,可以获取有关计算机系统硬件、操作系统和应用程序的信息&#xf…

PS学习笔记——新建文档/修改文档

文章目录 新建文档文档属性像素/分辨率颜色模式背景内容高级选项存储预设 修改文档 新建文档 方法一:ctrlN快捷键可直接打开新建文档界面 方法二:点击菜单栏中 文件->新建,即可打开新建文档界面 文档参数可按需调节(标题可以提前设定或者…

face_recognition:高准确率、简单易用的人脸识别库 | 开源日报 No.79

ageitgey/face_recognition Stars: 49.8k License: MIT 这个项目是一个使用 Python 编写的人脸识别库,可以从图片中识别和操作人脸。它基于 dlib 开发,并采用深度学习技术构建了最先进的人脸识别模型,在 Labeled Faces in the Wild 数据集上…

Redis(消息队列Stream)

Stream是一个轻量级的消息队列。 Redis中Stream的作用是提供一种高效的消息传递机制,允许多个消费者并行地消费消息,并且不会重复消费已经处理过的消息。它可以用于实现分布式任务队列、日志收集、实时数据处理等场景。Redis中的Stream支持多个消费者组…

Python数据分析实战① Python实现数据可视化

文章目录 一、数据可视化介绍二、matplotlib和pandas画图1.matplotlib简介和简单使用2.matplotlib常见作图类型3.使用pandas画图4.pandas中绘图与matplotlib结合使用 三、订单数据分析展示四、Titanic灾难数据分析显示 一、数据可视化介绍 数据可视化是指将数据放在可视环境中…

6.2 List和Set接口

1. List接口 List接口继承自Collection接口,List接口实例中允许存储重复的元素,所有的元素以线性方式进行存储。在程序中可以通过索引访问List接口实例中存储的元素。另外,List接口实例中存储的元素是有序的,即元素的存入顺序和取…

【Linux网络编程】高级I/O

目录 五种I/O模型 阻塞和非阻塞 非阻塞I/O I/O多路复用之Select、Poll、与Epoll 本文目的是深入浅出理解高级I/O相关的知识,结尾附上代码加深理解相关知识。 五种I/O模型 1.阻塞I/O:在内核将数据准备好之前,系统调用会一直等待。所有的套…

【踩坑笔记】国科GK7202V300芯片开发常见问题解决办法

国科Linux芯片开发常见问题&解决办法 0.读前须知 不管什么时候,下载程序还是啥,一定要检查路径!!!别问我为什么,呜呜呜~ tips:该芯片是仿造海思的产品,所以,有些不…

cp: can‘t stat ‘/usr/share/zoneinfo/Asia/Shanghai‘: No such file or directory

目录 问题描述问题分析解决方案容器时区验证 问题描述 使用下面的 Dockerfile 为 youlai-boot 项目制作镜像设置容器时区报错。 # 基础镜像 FROM openjdk:17-jdk-alpine # 时区修改 RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \&& echo Asia/Sha…