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

news2024/9/21 19:36:58

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:

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

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

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

相关文章

Blender 导入资源包的例子

先到清华源下载资源包: Index of /blender/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 具体地址:https://mirrors.tuna.tsinghua.edu.cn/blender/demo/asset-bundles/human-base-meshes/human-base-meshes-bundle-v1.1.0.zip 解压/hum…

2024数学建模深圳杯B题成品论文43页word+完整可视化结果图+可执行代码

【无水印word】2024深圳杯B题成品论文43页(附带1-4小问完整py解题代码思路)https://www.jdmm.cc/file/2710664 批量工件并行切割下料优化研究 摘 要 本研究针对批量工件并行切割下料问题展开了深入的探讨与分析。通过建立数学模型和运用优化算法&…

如何去除字符串两侧的空白字符?

TRIM函数会去掉字符串左侧和右侧的空格,语法是:TRIM(字符串) excel中,TRIM函数能去掉字符串左侧和右侧的空格,它的ASCII码是32。 以下设定一个字符串组合,它的第一个字符中空格,最后一个字符是换行符 &q…

vue3专栏项目 -- 六、上传组件(上)

1、上传组件需求分析 我们还需要新建和展示文章,新建文章自然是发送post请求,同时在post中自带对应的数据,展示文章就是根据id取出已有的数据并且展示出来。 这里有一个难点就是上传组件,上传文件是App应用中最基本的需求&#…

五丰黎红销量增长的秘诀:一物一码数字化营销开创调味品行业新格局!

根据当今经济环境和未来的发展趋势,传统经济向数字化经济转型的发展方向可以说是大势所趋,如何把握先机,率先迈出数字化转型第一步,可以说是无数传统企业都需要思考的问题。 作为中国调味品行业的佼佼者,五丰黎红踩着时…

如何查看SNMP设备的OID

什么是OID和MIB OID OID 代表对象标识符。 OID 唯一地标识 MIB 层次结构中的托管对象。 这可以被描述为一棵树,其级别由不同的组织分配。MIB MIB(管理信息基)提供数字化OID到可读文本的映射。 使用MIB Browser扫描OID 我的设备是一台UPS SN…

13、24年--信息系统治理——IT审计

1、IT审计基础 1.1 IT审计定义 无重要的考点,自己读课本了解即可。 1.2 IT审计目的 1)IT审计的目的是指通过开展IT审计工作,了解组织IT系统与IT活动的总体状况,对组织是否实现IT目标进行审查和评价,充分识别与评估相关IT风险,提出评价意见及改进建议,促进组织实现IT目…

TCP(1)

传输层的两大协议是TCP 和 UDP ,他们在传输数据的时候起到了不可替代的作用。那么什么是TCP呢? 首先TCP是一个网络传输协议,这个协议保证了可靠的数据传输。TCP是面向字节流的,全双工的(也就是通信双方互相发消息&…

单位内部防泄密策略与技术实践

在信息时代,企业内部数据安全至关重要,尤其是涉及核心竞争力的重要文件,员工的不当操作或恶意泄露都可能给企业带来重大损失。本文将从制度建设、技术防护、以及日常管理三个方面入手,探讨如何构建一套行之有效的内部防泄密体系&a…

汇聚荣:拼多多长期没有流量如何提高?

在电商的海洋中,拼多多以其独特的团购模式吸引了众多消费者的目光。然而,随着市场竞争的加剧和消费者需求的多样化,一些商家发现自家店铺的流量持续低迷,销售业绩难以突破。面对这样的挑战,如何有效提升拼多多店铺的客…

大模型算法(零) - Transformer中的细节与实现

讲transformer的文章已经铺天盖地了,但是大部分都是从原理的角度出发的文章,原理与实现之间的这部分讲解的较少,想要了解实现细节,还是要去看代码才行。记录一下自己学习过程中遇见的细节问题和实现问题。 Transformer整体架构 图…

树链剖分详解,看这一篇就够了

前置知识: 树形结构链式前向星(熟练)线段树(熟练)DFS序(熟练)LCA(了解定义) 什么是树链剖分 树链剖分其实有两种:重链剖分和长链剖分。重链剖分就是把儿子节点最重的儿子称为重儿子,把树分成若干条重链(如图一)&#…

【NR学习一】NR中的带宽、子载波间隔、PRB数量、FFT点数与采样率之间的关系

NR中的带宽、子载波间隔、PRB数量、FFT点数与采样率之间的运算关系 在5G NR(New Radio)系统设计中,带宽(Bandwidth)、子载波间隔(Subcarrier Spacing, SCS)、资源块(Resource Block…

汇聚荣科技:如何有效为拼多多店铺引流?

在电商竞争激烈的今天,为拼多多店铺引流是每个店主必须面对的挑战。有效的引流策略不仅能增加店铺曝光度,还能提升转化率,促进销量增长。 一、社交媒体营销 利用微信、微博等社交平台进行推广,可以通过发布产品信息、用户评价和促…

Web3Tools - 助记词生成

Web3Tools - 助记词生成工具 本文介绍了一个简单的助记词生成工具,使用 React 和 Material-UI 构建。用户可以选择助记词的语言和长度,然后生成随机的助记词并显示在页面上 功能介绍 选择语言和长度: 用户可以在下拉菜单中选择助记词的语言&…

【半夜学习MySQL】复合查询(含多表查询、自连接、单行/多行子查询、多列子查询、合并查询等详解)

🏠关于专栏:半夜学习MySQL专栏用于记录MySQL数据相关内容。 🎯每天努力一点点,技术变化看得见 文章目录 回顾基本查询多表查询自连接子查询单行子查询多行子查询多列子查询在from子句中使用子查询合并查询 回顾基本查询 下面使用…

设计非递归算法,编程:在二叉排序树中,打印关键码a, b的公共祖先。注:例,若a是b的祖先,则a不算作公共祖先。反之亦然。

二叉排序树&#xff1a; 代码&#xff1a; #include <iostream> using namespace std;// 定义二叉树节点结构 typedef struct BTNode {char show;struct BTNode* left;struct BTNode* right; } BTNode;// 非递归插入节点的函数 BTNode* insertNode(BTNode* root, char k…

Hadoop3:HDFS副本节点选择逻辑讲解

一、副本节点选择&#xff08;机架感知&#xff09; 说明 第一个副本&#xff0c;因为我们的client可能是web页&#xff0c;也可能是shell终端。 如果是web页&#xff0c;则随机选取一个节点&#xff0c;如果是shell终端&#xff0c;则选择当前shell终端所在的节点。 节点距离最…

TiDB学习2:TiDB Sever

目录 1. TiDB Server架构 2. sql语句的解析和编译 2.1 Parse ​编辑 2.2 compile 3. 行转化为KV对(聚簇表) ​编辑4. SQL 读写相关模块 4.1 DistSQL(复杂查询) 4.2 KV(简单查询) 5. 在线DDL相关模块 6. GC机制与相关模块 7. TiDB Server的缓存 8. 热点小表缓存 9. …

财富增长新途径:副业赚钱方法全攻略

探寻财富之路:多元化赚钱途径解析 在追求财富的道路上,每个人都在以自己的方式前行。然而,正如古人所云:“君子爱财,取之有道。”今天,我将为您揭示一些新颖且实用的赚钱途径,希望能为您的财富积累之路注入新的活力。 1、视频内容的创作与分享 在这个视频内容为王的时…