【Java SE】继承

news2024/11/16 7:52:12

学习完了类之后,我们将继续学习一个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的知识

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

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


 

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

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

相关文章

PCL 半径滤波剔除噪点(二)

目录 一、算法原理二、注意事项三、代码实现一、算法原理 PCL半径滤波是删除在输入的点云一定范围内没有达到足够多领域的所有数据点。通俗的讲:就是以一个点p给定一个范围r,领域点要求的个数为m,r若在这个点的r范围内部的个数大于m则保留,小于m则删除。因此,使用该算法时…

【MATLAB源码-第82期】基于matlab的OFDM系统载波频移偏差(CFO)估计,对比三种不同的方法。

操作环境: MATLAB 2013b 1、算法描述 正交频分复用(OFDM)系统中的载波频率偏移(CFO)估计是一项关键技术,用于确保数据传输的准确性和效率。CFO通常由于振荡器频率不匹配和多普勒频移引起。不同的CFO估计…

Docker Volume: 实现容器间数据共享与持久化的利器

文章目录 Docker Volume的作用Docker Volume与容器内数据的比较优势劣势 Docker Volume的创建和管理创建Docker Volume管理Docker Volume 演示Docker Volume的挂载Docker Volume的生命周期安全性考虑与Docker Volume应用场景Docker Volume与多容器协作容器迁移与Docker Volume未…

电子学会2023年6月青少年软件编程(图形化)等级考试试卷(二级)真题,含答案解析

青少年软件编程(图形化)等级考试试卷(二级) 一、单选题(共25题,共50分) 1. 运行下列哪段程序,可以让狗狗走到木屋门口?( ) A.

vite vue3安装element-plus

准备 参考 安装 官网 yarn add element-plus完整引入 如果你对打包后的文件大小不是很在乎,那么使用完整导入会更方便。 main.ts // main.ts import { createApp } from vue import ElementPlus from element-plus import element-plus/dist/index.css import…

数据资产到底如何入表?

2024年1月1日起,财政部《企业数据资源相关会计处理暂行规定》正式施行,距离现在只有一个多月的时间。 数据资源入表意味着企业可以将数据资源确认为企业资产负债表中“资产”一项。对于拥有丰富数据资源的企业来说,有望在财务报表中体现其真…

C++软件开发面试场景题

自己在秋招过程中遇到的一些场景题 海量数据N取Top K个元素,复杂度是多少 在处理海量数据中获取前K个元素(Top K)的问题中,通常会使用一些高效的算法来减少时间和空间复杂度。以下是两种常见的解决方案和它们的复杂度&#xff1…

VS中修改解决方案名称和项目名称

如何修改visual studio2019中的项目名 - 知乎 (zhihu.com) 查了很多,还是这个可行。虽然文中说不是最简单的,但在所查找资料中是可行且最简单的。 要点主要是: 1、比如我们复制一个解决方案,最好是带代码哈,也就是添…

Python 爬虫入门

文章目录 Python 爬虫入门requests 库beautifulsoup4库函数findall(),find()函数get() 爬虫实例 1:抓小说爬虫实例 2:抓豆瓣 top 250 的电影信息后记 Python 爬虫入门 Python 的爬虫功能使得程序员可以快速抓取并分析网页中的信息&#xff0…

【Nacos】配置管理、微服务配置拉取、实现配置热更新、多环境配置

🐌个人主页: 🐌 叶落闲庭 💨我的专栏:💨 c语言 数据结构 javaEE 操作系统 Redis 石可破也,而不可夺坚;丹可磨也,而不可夺赤。 Nacos 一、nacos实现配置管理1.1 统一配置管…

C#WPF用户控件及自定义控件实例

本文演示C#WPF自定义控件实例 用户控件(UserControl)和自定义控件(CustomControl)都是对UI控件的一种封装方式,目的都是实现封装后控件的重用。 只不过各自封装的实现方式和使用的场景上存在差异。 1 基于UserControl 创建 创建控件最简单一个方法就是基于UserControl …

基于Vue+SpringBoot的高校学生管理系统 开源项目

项目编号: S 029 ,文末获取源码。 \color{red}{项目编号:S029,文末获取源码。} 项目编号:S029,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 学生管理模块2.2 学院课程模块2.3 学…

java智慧校园信息管理系统源码带微信小程序

一、智慧校园的定义 智慧校园指的是以云计算和物联网为基础的智慧化的校园工作、学习和生活一体化环境。以各种应用服务系统为载体,将教学、科研、管理和校园生活进行充分融合,让校园实现无处不在的网络学习、融合创新的网络科研、透明高效的校务治理、…

利用X6 制作一个简单的流程图工具

介绍 项目模版使用 我自己基于 arco-design 封装的一个 B 端项目模版 。 地址:https://github.com/duKD/antv-x6-org 运用 antv/X6 : https://x6.antv.antgroup.com/ 来实现 一个简单的流程图工具 项目预览: 功能 支持框选 alt鼠标左键…

linux课程第一课------命令的简单的介绍

作者前言 🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂 ​🎂 作者介绍: 🎂🎂 🎂 🎉🎉&#x1f389…

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

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

cadence virtuoso PEX option error

在设置PEX options时出现error。 Error while compiling rules file /home/IC/Tech/PDk_13mmrf_1P6M_30k/Calibre/LvS/SmicSPM7PR12R_cal013_mixR_sali_pimtx_1233_v2.6_2P . xrc: ErrorINCLi on lire 838of /home/IC/Tech/PDK_13mmrf_1P6M_30k/Calibre/LvS/SmicSPM7PR12R_cal…

深入理解Linux网络笔记(六):深度理解TCP连接建立过程

本文为《深入理解Linux网络》学习笔记,使用的Linux源码版本是3.10,网卡驱动默认采用的都是Intel的igb网卡驱动 Linux源码在线阅读:https://elixir.bootlin.com/linux/v3.10/source 5、深度理解TCP连接建立过程 1)、深入理解liste…

圆弧插补-逐点比较法

圆弧插补-逐点比较法 逐点比较法直线插补流程 逐点比较法直线插补流程 逐点比较法第I象限逆圆插补 在圆弧加工过程中,要描述刀具位置与被加工圆弧之间的相对位置关系,可用动点到圆心的距离大小来反映。 如下图所示,假设被加工零件的轮廓为第…

杭州信息安全

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