Java——继承详解、super 关键字、super和this的异同、protected关键字、final关键字、继承与组合

1、继承的概念:

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

可以让我们在保持原有类(父类、超类、基类)特性的基础上进行扩展,增加新功能,这样产生新的类,称为派生类(子类)

2、继承的语法:

  • Java中表示类之间的继承关系,要用到 extends 关键字
  • 子类会将父类中的成员变量或成员方法继承到子类中
  • 子类继承父类后,必须要新添加自己特有的成员

3、父类成员访问

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

1、子类和父类中不存在同名成员变量

public class Base {
    int a;
    int b;
}

public class Derived extends Base{
    int c;
    public void method(){
        a = 10;//访问从父类中继承下来的a
        b = 20;//访问从父类中继承下来的b
        c = 30;//访问子类自己的c
    }
}

2、子类和父类中存在同名成员变量

public class Base {
    int a;
    int b;
}


public class Derived extends Base{
    int a;//与父类中成员a同名,且类型相同
    char b;//与父类中成员b同名,但类型不同
    int c;
    public void method(){
        a = 55;
        b = 66;
        c = 77;
        //d = 40;error

        System.out.println(a);
        System.out.println(b);
        System.out.println(c);
    }
    public static void main(String[] args) {
        Derived d = new Derived();
        d.method();
    }
}

结果:

分析:

  • 如果访问的成员变量子类中有,优先访问自己的成员变量,遵循就近原则
  • 如果访问的成员变量子类中没有,则访问父类继承下来的,若父类中也没有定义,则编译报错
  • 若个访问的成员变量与父类中成员变量同名,则优先访问自己的

3.2 子类访问父类的成员方法

  • 通过子类对象访问父类与子类中不同名方法时,优先在子类中找,找不到就在父类中找,都找不到则编译报错
  • 通过子类对象访问父类与子类中同名方法时,如果父类和子类同名方法的参数列表不同(重载),根据调用方法所传递的参数选择合适的方法访问,没有则报错
  • 想要通过子类对象访问父类与子类中同名的方法,且参数列表也相同时,需用到关键字 super

 4、super 关键字

作用:在子类方法中访问父类的成员

示例:

public class Base {
    int a;
    int b;

    public void methodA(){
        System.out.println("methodA()::Base");
    }
    public void methodB(){
        System.out.println("methodB()::Base");
    }
}


public class Derived extends Base{
    int a;//与父类中成员a同名,且类型相同
    char b;//与父类中成员b同名,但类型不同
    int c;

    //与父类methodA()构成重载
    public void methodA(int x){
        System.out.println("methodA()::Derived");
    }

    //与父类methodB()构成重写
    public void methodB(){
        System.out.println("methodB()::Derived");
    }

    public void method(){
        a = 55;
        super.b = 66;//访问父类与子类同名成员变量用super
        c = 77;
    //父类与子类中构成重载的方法,通过参数列表区分访问
        methodA();
        methodA(c);

    //父类与子类中构成重写的方法,需借助super访问父类方法
        methodB();
        super.methodB();

        System.out.println(a);
        //访问父类与子类同名成员变量用super
        System.out.println(super.b);
        System.out.println(c);
    }
    public static void main(String[] args) {
        Derived d = new Derived();
        d.method();
    }
}

结果:

tips:

  • super关键字只能在非静态方法中使用
  • 使用 super() 必须在第一行,与 this() 不共存
  • super只能指代当前类的父类,不能指代父类的父类

 5、子类构造方法

子类对象构造时,需要先调用父类的构造方法,然后执行子类的构造方法

示例:

public class Animal {

    static{
        System.out.println("static::Animal{ }");
    }

    {
        System.out.println("实例代码块::Animal{ }");
    }

    public Animal() {
        System.out.println("构造方法::Animal()...");
    }
}

//==================================

public class Dog extends Animal{
    static{
        System.out.println("static::Dog{ }");
    }

    {
        System.out.println("实例代码块::Dog{ }");
    }

    public Dog() {
        System.out.println("构造方法::Dog()...");
    }
}

//==================================

public class Cat extends Animal{
    static{
        System.out.println("static::Cat{ }");
    }

    {
        System.out.println("实例代码块::Cat{ }");
    }

    public Cat() {
        System.out.println("构造方法::Cat()...");
    }
}

//==================================

public class Test {
    public static void main(String[] args) {
        Dog dog = new Dog();
    }
}

结果:

原理:子类对象中成员是由两部分组成的,父类继承的部分以及子类新增的部分,先有父再有子,所以在构造子类对象时,先调用父类构造,将继承下来的成员构造完整,再调用子类的构造,将新增成员初始化完整。

tips:

  • 若父类显式定义无参或默认的构造方法,在子类构造方法第一行默认有隐含的 super() 调用,即调用基类构造方法
  • 如果父类构造方法是带有参数的,此时需要用户为子类显式定义构造方法,并在子类构造方法中选择合适的父类构造方法调用,否则编译失败
  • 在子类构造方法中,super(...) 调用父类构造时,必须是子类构造函数中第一条语句
  • super(...) 只能在子类构造方法中出现一次,并且不能和this同时出现

结论

  • 父类静态代码块优先于子类静态代码块执行,且最早执行
  • 父类实例代码块和父类构造方法紧接着执行
  • 子类实例代码块和子类构造方法紧接着执行
  • 第二次实例化子类对象时,父类和子类的静态代码块都不会再执行

6、super和this的异同

相同点:

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

不同点:

  • this是当前对象的引用,当前对象即调用实例方法的对象,super相当于是子类对象中从父类继承下来部分成员的引用
  • 在非静态成员方法中,this用来访问本类的方法和属性,super用来访问父类继承下来的方法和属性
  • 在构造方法中,this(...) 用于调用本类构造方法,super(...) 用于调用父类构造方法,两种调用不能同时在构造方法中出现
  • 构造方法中一定会存在super(...) 的调用,用户没有写编译器也会加,但是this(...) 不写则没有

 7、protected关键字

用protected修饰的成员变量不能在 不同包中的非子类 访问

虽然不能直接访问,但是也继承到子类了

8、Java中的继承方式

如图:

tips:

Java中不支持多继承

在应用场景中,尽量不要出现超过三层的继承关系

想要在语法上进行限制,可以使用final关键字,用final修饰的类无法被继承

9、final关键字

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

  • 1.修饰变量或字段,表示常量,即不能修改
  • 2.修饰类,表示此类不能被继承
  • 3.修饰方法,表示该方法不能被重写

10、继承与组合

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

组合表示对象之间是has-a的关系,比如:汽车的零件有轮胎、发动机、方向盘等等

//轮胎类
class Tire {
    //...
}


//发动机类
class Engine {
    //...
}


//组合:轮胎、发动机都是汽车的组成部分
class Car {
    private Tire tire;//可以复用轮胎类中的属性和方法
    public Engine engine;//可以复用发动机类中的属性和方法
}


//继承:奔驰属于汽车中的一类
class Benz extends Car{
    //将汽车中包含的轮胎、发动机全部继承下来
}

优缺点对比:

tips:

  • 组合比继承更符合 高内聚低耦合 的状态 
  • 所以在面向对象中有『多用组合、少用继承』或者说『组合优于继承』的观点
  • 在同样可行的情况下,建议使用组合

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

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

相关文章

springboot jar包下config logback外配置文件不生效

描述 与jar 包同级的config目录下放置配置文件 检查1 确定配置配置文件名称为logback-spring.xml 检查2 确定logback-spring.xml 内容正确 检查3 开发环境为 生产环境(外配置环境下)

Git系列:git log 掌握版本控制的精髓

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

踩坑小结:Linux安装python环境 、安装OpenSSL

一、查看python版本 查看发现,linux上自带了python,不过是2.x版本的。 二、下载python3 2.1 下载 www.python.org/downloads/s… 可在当前目录下找到相对应的版本或者最新版本下载 也可以直接下载 Python 3.10.4 下载完在服务器上选择一个目录存放…

css笔记总结2

找到所有的 h1 标签。 选择器(选对人) 设置这些标签的样式,比如颜色为红色(做对事)。 ##css基础选择器 基础选择器又包括:标签选择器、类选择器、id 选择器和通配符选择器 ###标签选择器: 标签…

防泄密软件有哪些|2024年企业防泄密软件排行榜

在当今数字化时代,企业的信息安全问题愈发显得重要,尤其是随着网络技术的飞速发展,信息泄露和数据窃取的风险也日益增大。为了保障企业的核心机密和客户隐私,许多企业开始使用防泄密软件,以确保信息的安全性和完整性。…

Python进度条工具——tqdm

原文链接:http://www.juzicode.com/python-note-tqdm 在安装Python库文件的时候我们经常可以看到这种进度条: 其实Python库中就自带了现成的工具库——tqdm。 tqdm读起来比较拗口,它是从“进程”的阿拉伯语taqaddum简化而来。 安装tqdm 使用…

Java微信小程序订阅消息提醒的实现与对接

文章目录 一、准备工作1. 注册微信小程序,并开通订阅消息功能。2. 获取小程序的AppID和AppSecret。3. 在微信小程序管理后台,设置提醒模板,并获取模板ID。4. 小程序端需要获取用户订阅允许提醒的权限(1)引导用户触发订…

VB6连接各种类型的数据库

VB6连接各种类型的数据库 一、连接VFP数据库 Dim CNN As New ADODB.Connection Dim rssys As New ADODB.Recordset If CNN.state 1 Then CNN.Close CNN.ConnectionString "Driver{Microsoft Visual FoxPro Driver};SourceType.DBc;SourceDb" Trim(Text1) CNN…

经济寒冬 | 品牌策划人还可以去哪些行业发展?

在这个经济寒冬下,咱们品牌策划人也需要考虑后路问题了。 随着市场竞争的加剧和消费者需求的不断变化,品牌策划人的工作不再只是简单的广告宣传和市场推广。 咱们需要重新思考自己的角色,寻找新的生存和发展之道。 当然,品牌策…

45°和68°焕新上市,五粮液完成产品体系化布局

执笔 | 尼 奥 编辑 | 扬 灵 如今,白酒行业正经历周期性调整,头部化和品牌化集中趋势日益显著。五粮液在这一关键时刻,敏锐地捕捉到市场机遇,通过产品焕新,进一步完善和丰富了其代际系列产品体系。 这一举措不仅巩…

大龄程序员是否要入职嵌入式python岗位?

在开始前我有一些资料,是我根据网友给的问题精心整理了一份「Python的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家!!! 是否要做嵌入式 Python 取决于…

提升写作效率的秘密武器:一个资深编辑的AI写作体验

有句话说:“写作是一项你坐在打字机前流血的工作。”而如今,各类生成式软件的涌现似乎打破了写作这一古老的艺术形式壁垒。过去,作家们独自在书桌前冥思苦想,如今,一款名为“玲珑AI工具”的ai写作助手正悄然改变着文案写作行业的创作生态,成为提升写作效率的秘密武器。 在传统…

通俗易懂讲乐观锁与悲观锁

浅谈乐观锁与悲观锁 乐观锁和悲观锁是Java并发编程中的两个概念。使用乐观锁和悲观锁可以解决并发编程中数据不一致性、死锁、性能差等问题,乐观锁与悲观锁的实行方式不同,所以其特性也不近相同,下文将详细介绍两者的特性与适用场景。 《熊…

【C语言】必备Linux命令和C语言基础

🌟博主主页:我是一只海绵派大星 📚专栏分类:嵌入式笔记 ❤️感谢大家点赞👍收藏⭐评论✍️ 目录 一、文件和目录相关命令 Linux 的文件系统结构 文件系统层次结构标准FHS pwd命令 ls 列目录内容 文件的权限 c…

[董晓算法]搜索相关题目及模板

前言: 本系列是学习了董晓老师所讲的知识点做的笔记 董晓算法的个人空间-董晓算法个人主页-哔哩哔哩视频 (bilibili.com) 动态规划系列(还没学完) 【董晓算法】动态规划之线性DP问题-CSDN博客 【董晓算法】动态规划之背包DP问题&#xff…

NSSCTF | [SWPUCTF 2021 新生赛]ez_unserialize

打开题目,发现是一个GIF动图页面,什么都没有。我们来查看一下源代码,看看有没有什么发现 其实只要足够了解网站的构成,看到绿色的注释字样就能知道它这里在提示robots.txt文件。 但是对于小白来说,也不知道它是什么&a…

高效稳定,AH1515-15V转12V8A稳压芯片成为各种设备首选

高效稳定,AH1515 15V转12V稳压芯片成为各种设备首选 随着科技的不断发展,各种电子设备对电源的要求越来越高,尤其是电压稳定性和电流输出能力。为了解决这一问题,我国一款名为AH1515的稳压芯片应运而生,凭借其优异的性…

win11家庭中文版安装docker,报错 Docker Engine stopped

先引一下这位博主的链接超详细Windows11家庭中文版系统安装Docker-20230401_windows11安装docker-CSDN博客,我到前五步(跳出页面重启)和博主都是一样的,但是第六步我并没有报错,直接跳出docker界面 记录一下我的解决办法,首先按照…

[链表专题]力扣141, 142

1. 力扣141 : 环形链表 题 : 给你一个链表的头节点 head ,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾…

2024042001-计算机网络 - 物理层

计算机网络 - 物理层 计算机网络 - 物理层 通信方式带通调制 通信方式 根据信息在传输线上的传送方向,分为以下三种通信方式: 单工通信:单向传输半双工通信:双向交替传输全双工通信:双向同时传输 带通调制 模拟信号…