【JavaSE】解密 继承和多态(上)

news2024/11/26 2:54:04

前言

本篇将会通过典型代码案例来揭开 Java中继承和多态 的神秘面纱~

欢迎关注个人主页:逸狼


创造不易,可以点点赞吗~

如有错误,欢迎指出~



目录

前言

继承

继承代码举例

子类访问父类的成员变量和方法

子类访问父类的成员变量

super

this和super比较

相同点

区别

​编辑

子类访问父类的成员方法 规则同理

子类与父类的构造方法

执行顺序

代码块的执行顺序

测试代码如下


继承

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

继承代码举例

Dog和Cat称为子类或派生类,Animal称为父类、基类或超类。Dog和Animal的关系可以简单理解为is-a的关系(即狗是一个动物)

  • 子类会将父类的成员变量和方法继承子类中(子类不用自己再定义了)
  • 子类必须要有自己特有的成员(体现与父类不同)
class Animal{
    public String name;
    public int age ;
    public String color;
    public void eat(){
        System.out.println(this.name+"正在吃饭!");
    }
}
//Dog子类 继承了 Animal父类
class Dog extends Animal{

    public void bark(){
        System.out.println(this.name+"正在汪汪汪~");
    }
}
//Cat子类 继承了 Animal父类
class Cat extends Animal{

    public void miao(){
        System.out.println(this.name+"正在喵喵喵~");
    }
}

子类访问父类的成员变量和方法

子类访问父类的成员变量

  • 子类中有,就优先访问子类的;
  • 子类若没有,访问父类的;
  • 若父类中也没有,会报错。

例如代码

  • 父类和子类都有a,优先使用子类的,所以a=11
  • 子类没有b,父类中有,所以b=2;
  • 父类没有c,子类有,所以c=3;

class Base {
    public int a = 1;
    public int b = 2;
}
class Derived extends Base{
    public int a=11;
    public int c=3;

    public void test(){
        System.out.println("a="+a);
        System.out.println("b="+b);
        System.out.println("c="+c);
    }
}
public class Test2 {
    public static void main(String[] args) {
        Derived derived=new Derived();//产生子类对象
        derived.test();//调用子类的test方法
    }
}

结果如图

那如果子类和父类都有a的情况下,我想访问父类中的a,应该怎么办呢?

super

super是一个关键字,可以调用父类的成员变量

在上述问题中,我们可以在成员变量a的前面加上super,就可以解决了;

this和super比较

相同点

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

区别

  • this的访问范围比super大,它可以访问父类和子类中的成员变量和方法
  • super只是用于访问父类的成员变量

将上面代码加上this和super测试

    public void test(){
        System.out.println("a="+this.a);
        System.out.println("a="+super.a);
        System.out.println("b="+this.b);
        System.out.println("c="+this.c);
    }

结果如图

子类访问父类的成员方法 规则同理

  • 只能在非静态方法中使用(因为在静态方法中是不能用this和super的)
  • 在子类方法中,访问父类的成员变量和方法。

子类与父类的构造方法

当子类继承了父类之后,在实例化子类对象之前,要先初始化父类成员

  • 若自己没写父类构造方法,Java中会有一个默认的不带参数的构造方法,子类会自己调用那个默认的构造方法
  • 若自己写了父类构造方法,则要在子类中必须先调用那个存在的构造方法,进行初始化父类成员,否则会报错

初始化父类成员的时候只有一种方法:调用构造方法

    //自己写的父类构造方法
    public Animal(String name, int age, String color) {
        this.name = name;
        this.age = age;
        this.color = color;
    }

在子类当中初始化父类成员,例如下图是 调用不带参数的构造方法

利用Java生成带有3个参数(也可以是1个、2个都行)的构造方法,在实例化对象时对父类成员进行赋值

执行顺序

父类构造方法比子类的先执行,

如图测试代码

代码结果

代码块的执行顺序

测试代码如下

结果

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

  1. 父类静态代码块优先于子类静态代码块执行,且是最早执行
  2. 父类实例代码块和父类构造方法紧接着执行
  3. 子类的实例代码块和子类构造方法紧接着再执行
  4. 第二次实例化子类对象时,父类和子类的静态代码块都将不会再执行(只执行一次)

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

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

相关文章

实战 | YOLOv8自定义数据集训练实现手势识别 (标注+训练+预测 保姆级教程--含数据集)

导 读 本文将手把手教你用YoloV8训练自己的数据集并实现手势识别。 安装环境 【1】安装torch, torchvision对应版本,这里先下载好,直接安装 pip install torch-1.13.1+cu116-cp38-cp38-win_amd64.whlpip install torchvision-0.14.1+cu116-cp38-cp38-win_amd64.whl 安装好…

每日一题 --- 右旋字符串[卡码][Go]

右旋字符串 题目:55. 右旋字符串(第八期模拟笔试) (kamacoder.com) 题目描述 字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k,请编写一个函数,将字符串中的后面…

书生浦语第一次课

模型的发展 从专业模型到通用模型 书生浦语大模型全链路开源体系 2023.06.07 -> InternLM千亿参数语言大模型发布 2023.07.06 -> InternLM千亿参数语言大模型全面升级,支持8K语境、26种语言。全面开源、免费商用:InternLM-7B、全链条开源工具…

【内存泄漏】数据库连接connectionPhantomRefs内存过大

1. 问题背景 线上出现内存报警,内存增长曲线如下 dump内存文件,临时重新发布服务。后经排查发现是数据库连接池设置不合理以及mysql-connector-java 5.1.49有内存泄漏bug。以下为对此问题的分析及问题总结。 1.1 应用背景 数据库连接池: …

赛奥分离技术现已加入2024第13届生物发酵展

参展企业介绍 上海赛奥分离技术工程有限公司成立于2010年,是上海市高新技术企业、上海市专精特新企业,宝山区工程及技术中心。公司着重于在流体分离净化领域,研究开发制造膜技术领域中错流微滤、超滤系统、纳滤系统、反渗透、精细过滤等膜分离设备及适用…

光伏无人机:绿色能源与航空技术的融合创新

在可再生能源和无人机技术快速发展的背景下,光伏无人机作为一种新兴的绿色航空器,正逐渐展现出其独特的优势和广阔的应用前景。本文将深入探讨光伏无人机的原理、优势以及其在多个领域的应用,展望其未来的发展趋势。 一、光伏无人机的原理 光…

【LeetCode】热题100 刷题笔记

文章目录 T1 两数之和T49 字母异位词分组常用小技巧 T1 两数之和 链接:1. 两数之和 题目: 【刷题感悟】这道题用两层for循环也能做出来,但我们还是要挑战一下时间复杂度小于 O ( n 2 ) O(n^2) O(n2)的解法,不能因为它是第一道 …

SAP Fiori开发中的JavaScript基础知识6 - 数组(Arrays)

1 背景 在本篇博客中,我将介绍JavaScript中数组(Arrays)的概念和用法。 2 数组 在JavaScript中,数组是一种特殊的对象,用于存储多个值在单个变量中。 2.1 创建数组 在JavaScript中,创建数组有以下有2种…

鸿蒙OS元服务开发说明:【WebGL网页图形库开发接口】

一、场景介绍 WebGL主要帮助开发者在前端开发中完成图形图像的相关处理,比如绘制彩色图形等。目前该功能仅支持使用兼容JS的类Web开发范式开发。 二、接口说明 表1 WebGL主要接口列表 鸿蒙OS开发更多内容↓点击HarmonyOS与OpenHarmony技术鸿蒙技术文档开发知识更…

反弹shell的方法和场景

Netcat反弹Shell 1 NC正向反弹shell Netcat简称NC,是一个简单、可靠的网络工具,被誉为网络界的瑞士军刀。通NC可以进行端口扫描、 反弹Shell、端口监听和文件传输等操作,常用参数如下: -c指定连接后要执行的shell命令-e指定连接后要执行的文件名-k配置 Socket一…

制造业工厂怎么通过MES系统来升级改造车间管理

在当今高度竞争的市场环境下,制造业企业需要不断提高生产效率,以在激烈的竞争中立于不败之地。而一种被广泛应用的方法就是利用MES控制系统,通过数字化管理和自动化控制来改造生产车间提升生产效率。 1、MES管理系统能够实现对生产过程的全面…

Linux环境基础和工具的使用

目录 1、Linux软件包管理器---yum 2、Linux开发工具 2.1、vim基本概念 2.2 vim基本操作 2.3 vim正常模式命令集 2.4 vim末行模式命令集 2.5 简单vim配置 2.5.1 配置文件的位置 3 Linux编译器--gcc/g的使用 3.1 背景知识 3.2 gcc完成 4 Linux调试器--gdb使用 4.1 背…

网页的血液——javascript

JavaScript 基础知识概述 1. JavaScript 介绍 JavaScript 是一种高级的、解释型的编程语言,它是一种基于对象的、事件驱动的语言,它允许开发者创建动态的网页。JavaScript 是一种脚本语言,它可以嵌入到 HTML 中,或者作为外部文件…

一篇商业稿件值千元,我的过稿经验大公开

撰写过上百篇企业和品牌稿件,甚至一篇商业稿件可值千元,可能很多人还不太相信,事实就是真的会有很多的企业和品牌愿意为此买单,是因为稿件带来的价值也是无法衡量的,直接给产品或是品牌带来更多的曝光甚至转化。今天伯…

一种新的基于STT-MRAM的时域内存计算单元

大数据、物联网和人工智能等技术的进步揭示了传统冯诺依曼的瓶颈架构,导致高能耗和有限的内存带宽。内存计算(IMC通过直接在内存中进行计算,提高了能效,提供了一个有前景的解决方案计算。现有的基于时域(TD&#xff09…

vue+elementUI搭建动态表头的表格

前提:以下代码是vue2项目结合elementUi完成的 数据结构 后端传来的数据是两个list,一个表头的list,一个表格内容的list // 表头 headTableAtts: [{ columnLabel: 姓名, columnName: name },{ columnLabel: 年龄, columnName: age },{ colu…

算法学习——LeetCode力扣动态规划篇4(377. 组合总和 Ⅳ、322. 零钱兑换、279. 完全平方数、139. 单词拆分)

算法学习——LeetCode力扣动态规划篇4 377. 组合总和 Ⅳ 377. 组合总和 Ⅳ - 力扣(LeetCode) 描述 给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的个数。 题目数据保…

苹果手机系统文件浏览技巧:实现高效的文件查找与管理

​ 目录 引言 用户登录工具和连接设备 查看设备信息,电池信息 查看硬盘信息 硬件信息 查看 基带信息 销售信息 电脑可对手机应用程序批量操作 运行APP和查看APP日志 IPA包安装测试 注意事项 引言 苹果手机与安卓手机不同,无法直接访问系统文件…

linux shell命令(进程管理、用户管理)

一、进程的概念 主要有两点: 1.进程是一个实体。每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)…