教你快速认识Java中的继承和多态

news2024/11/16 13:00:10

目录

继承

继承的概念

继承的语法

父类成员访问

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

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

super关键字

子类构造方法:

代码块执行顺序:

多态

多态的实现条件

重写

重写的规则:

重写和重载的区别​编辑

向上转移和向下转型

向上转型

结语


继承

继承的概念

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

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

继承的语法

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

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

代码演示如下:

class Shape {
    public void draw() {
        System.out.println("画图!");
    }
}

public class Test extends Shape {
    public static void main(String[] args) {
    }
}

 

注意:子类会将父类中的成员变量或者成员方法继承到子类中

父类成员访问

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

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

注意:成员变量访问遵循就近原则,自己有优先自己的,如果没有则向父类中找。

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

  • 成员方法没有同名时,在子类方法中或者通过子类对象访问方法时,则优先访问自己的,自己没有时再到父类中找,如果父类中也没有则报错。
  • 通过子类对象访问父类与子类中不同名方法时,优先在子类中找,找到则访问,否则在父类中找,找到则访问,否则编译报错。
  • 通过派生类对象访问父类与子类同名方法时,如果父类和子类同名方法的参数列表不同(重载),根据调用方法适传递的参数选择合适的方法访问,如果没有则报错。

super关键字

        子类和父类中可能会存在相同名称的成员,为了在子类方法中访问父类的同名成员,Java提供了super关键字,该关键字主要作用:在子类方法中访问父类的成员。

代码演示如下:

class Shape {
    public void draw() {
        System.out.println("画图!");
    }
}

public class Test extends Shape {
    public void draw() {
        int a = 20;//子类a
        System.out.println(super.a);//super关键字说明访问的是父类的成员
        System.out.println(a);
    }

    public static void main(String[] args) {
        Test test = new Test();
        test.draw();
    }
}

代码运行结果如下:

这样我们就通过super关键字访问了继承自父类Shape的a变量。在子类方法中,如果想要明确访问父类中成员时,借助super关键字即可。

注意:只能在非静态方法中使用。

子类构造方法:

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

代码块执行顺序:

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

 (注意:Java不支持多继承)

多态

多态的实现条件

在java中要实现多态,必须要满足如下几个条件,缺一不可:

  • 必须在继承体系下
  • 子类必须要对父类中方法进行重写
  • 通过父类的引用调用重写的方法

多态体现:在代码运行时,当传递不同类对象时,会调用对应类中的方法。

多态的优点:

  • 能够降低代码的 "圈复杂度", 避免使用大量的 if - else
  • 可扩展能力更强

多态的缺陷:

  • 代码的运行效率降低。

重写

重写的规则:

  • 子类在重写父类的方法时,一般必须与父类方法原型一致: 返回值类型 方法名 (参数列表) 要完全一致。
  • 被重写的方法返回值类型可以不同,但是必须是具有父子关系的。
  • 访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类方法被public修饰,则子类中重写该方法就不能声明为 protected。
  • 父类被static、private修饰的方法、构造方法都不能被重写。
  • 重写的方法, 可以使用 @Override 注解来显式指定. 有了这个注解能帮我们进行一些合法性校验. 例如不小心将方法名字拼写错了 (比如写成 aet), 那么此时编译器就会发现父类中没有 aet 方法, 就会编译报错, 提示无法构成重写。
     

重写和重载的区别

静态绑定:也称为前期绑定(早绑定),即在编译时,根据用户所传递实参类型就确定了具体调用那个方法。典型代表函数重载。
动态绑定:也称为后期绑定(晚绑定),即在编译时,不能确定方法的行为,需要等到程序运行时,才能够确定具体调用那个类的方法。

向上转移和向下转型

向上转型

        实际就是创建一个子类对象,将其当成父类对象来使用。语法格式:父类类型 对象名 = new 子类类型()。

Animal animal = new Cat();

animal是父类类型,但可以引用一个子类对象,因为是从小范围向大范围的转换。

向上转型的出现场景:1.直接赋值 2. 方法传参 3. 方法返回
向上转型的优点:让代码实现更简单灵活。
向上转型的缺陷:不能调用到子类特有的方法。
(由于向下转型非常不安全并不推荐,因此不做介绍)

请注意:应避免在构造方法中调用重写的方法。(在构造器中调用方法(如果这个方法被子类重写, 就会触发动态绑定, 但是此时子类对象还没构造完成), 可能会出现一些隐藏的但是又极难发现的问题.

结语

        感谢大家耐心的阅读,如有错误欢迎在评论区指出!!!

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

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

相关文章

MySql安全加固:配置不同用户不同账号禁止使用旧密码禁止MySql进程管理员权限

MySql安全加固:配置不同用户不同账号&禁止使用旧密码&禁止MySql进程管理员权限 1.1 检查是否配置不同用户不同账号1.2 检查是否禁止使用旧密码1.3 禁止MySql进程管理员权限 💖The Begin💖点点关注,收藏不迷路&#x1f496…

shell自定义日志输出函数log

Background 在编写比较复杂的脚本时,需要输出相关日志信息,方便知悉脚本的执行情况以及问题的排查。 源码 log.sh # 自定义日志函数 function log(){if [[ $1 "i" || $1 "info" ]]; thenecho -ne "\033[1;34mINFO: \033[0m&…

使用Python操作SQLite数据库

大家好,在数据涌现的今天,数据库已成为生活中不可或缺的工具。Python作为一种流行的编程语言,内置了多种用于操作数据库的库,其中之一就是SQLite。SQLite是一种轻量级的关系型数据库管理系统,它在Python中的应用非常广…

c++异常机制(6) -- 标准库中的异常类

标准程序库异常 我们使用c标准库中的异常类&#xff0c;来实现我们之前文件拷贝的代码。 #include <iostream> #include <stdlib.h> #include <exception> #include <ios>using namespace std;#define BUFFER_SIZE 1024// 将一个文件中的内容拷贝到另…

python中版本,操作系统等问题汇总

1. linux源码部署到windows 1.1ModuleNotFoundError: No module named pwd 这个问题&#xff0c;是因为源码是给linux的。这里在windows中&#xff0c;没有该命令。 解决方法之一&#xff0c;在相应的环境目录中&#xff0c;如图中<MetaGPTenv>虚拟环境中&#xff0c;在…

makefileGDB使用

一、makefile 1、make && makefile makefile带来的好处就是——自动化编译&#xff0c;一旦写好&#xff0c;只需要一个make命令&#xff0c;整个工程完全自动编译&#xff0c;极大的提高了软件开发的效率 下面我们通过如下示例来进一步体会它们的作用&#xff1a; ①…

今日arXiv最热大模型论文:点击即可播放!港中文发布大模型写歌神器!

一首歌&#xff0c;包含作词作曲两个部分。擅长作词or作曲就已经很牛了。比如方文山是周杰伦的御用作词人&#xff0c;而周杰伦写过很多耳熟能详的曲子。而兼具作词作曲才华的全能创作人却是难得一见。 最近港中文发布了一款歌曲创作大模型SongComposer&#xff0c;作词作曲都…

Pegasus智能家居套件样例开发--软定时器

样例简介 此样例将演示如何在Pegasus Wi-Fi IoT智能家居套件上使用cmsis 2.0 接口进行定时器开发。 工程版本 系统版本/API版本&#xff1a;OpenHarmony 3.0 releaseIDE版本&#xff1a;DevEco Device Tool Release 3.0.0.401 快速上手 准备硬件环境 预装windows系统的PC…

uniapp项目申请短信模板临时Nginx配置

现在申请短信模板不允许有变量&#xff0c;且要指向实际业务网站&#xff0c;因为项目是小程序&#xff0c;用uniapp写的&#xff0c;现在申请短信&#xff0c;把uniapp打包成h5项目&#xff0c;上传至服务器&#xff0c;修改niginx配置中springboot项目部分&#xff0c;记录一…

Netty之ChannelHandlerMask详解

Netty的ChannelHandlerMask是用于标记ChannelHandler的位掩码。它被用于指示ChannelHandler的事件处理方式。ChannelHandlerMask 定义了ChannelHandler所有事件。 final class ChannelHandlerMask {static final int MASK_EXCEPTION_CAUGHT 1;static final int MASK_CHANNEL_…

前端src中图片img标签资源的几种写法?

在 Vue 项目中引用图片路径有几种不同的方法&#xff0c;具体取决于你的项目结构和配置。以下是几种常见的方式&#xff1a; 1. 静态资源目录 (Public) 如果你的图片放在了项目的 public 目录下&#xff08;例如&#xff0c;Vite 和 Create Vue App 脚手架工具通常使用这个目…

关于页面置换算法的例题(2)

考虑一个500字的程序的下述逻辑地址访问序列&#xff1a;10&#xff0c;11&#xff0c;104&#xff0c;170&#xff0c;73&#xff0c;309&#xff0c;185&#xff0c;245&#xff0c;246&#xff0c;434&#xff0c;458&#xff0c;364。假定采用页式虚拟内存管理&#xff0c;…

力扣hot100题解(python版41-43题)

41、二叉树的层序遍历 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[[3],[9,20],[15,7]]示例…

理解C#里面的集合有哪些?怎么用,什么是安全集合?

介绍 在C#中&#xff0c;集合是一种用于存储和操作多个元素的数据结构。它们提供了各种操作&#xff0c;如添加、删除、查找等&#xff0c;以及遍历集合中的元素。集合通常根据其实现方式和行为特征进行分类。 集合继承IEnumerable 在C#中&#xff0c;几乎所有的集合类型都实现…

uniapp同步将本地图片转换为base64,支持微信、H5、APP

接上篇&#xff0c;少了一个方法的源代码。 先上代码&#xff1a; ploadFilePromiseSync (url) > { return new Promise((resolve, reject) > { // #ifdef MP-WEIXIN uni.getFileSystemManager().readFile({ filePath: url, encoding: base64, success: res > { let …

TVM 和模型优化的概述(1)

文章目录 1. 从 Tensorflow、PyTorch 或 Onnx 等框架导入模型&#xff08;model&#xff09;。2.翻译成 Relay3. lower 到 张量表达式。4. 使用 auto-tuning 模块 AutoTVM 或 AutoScheduler 搜索最佳 schedule。5. 选择最佳配置进行模型编译。6. lower 到 TIR。7. 编译成机器码…

【JavaScript】面试手撕节流

引入 上篇我们讲了防抖&#xff0c;这篇我们就谈谈防抖的好兄弟 – 节流。这里在老生常谈般的提一下他们两者之间的区别,顺带给读者巩固下。 PS: 开源节流中节流与这个技术上的节流&#xff0c;个人认为本质上是一样的。 开源节流的节流指的是节省公司的金钱开支。前端技术上的…

#stm学习总结 (二十八)硬件随机数实验

28.1 随机数发生器简介 STM32F407 自带了硬件随机数发生器&#xff08;RNG&#xff09;&#xff0c;RNG 处理器是一个以连续模拟噪声为基础的随机数发生器&#xff0c;在主机读数时提供一个 32 位的随机数。 28.1.1 RNG 框图 STM32F407 的随机数发生器&#xff08;RNG&#x…

Python实现双向链表:从基础到应用

一、引言 双向链表是一种比单向链表更复杂的数据结构&#xff0c;每个节点除了包含数据和指向下一个节点的指针外&#xff0c;还包含一个指向前一个节点的指针。这种结构使得我们可以从链表的任何节点开始&#xff0c;向前或向后遍历链表。 目录 一、引言 二、节点定义 三、…

谷歌最强开源大模型亮相!Gemini技术下放,笔记本就能跑,可商用

明敏 发自 凹非寺 量子位 | 公众号 QbitAI 谷歌大模型&#xff0c;开源了&#xff01; 一夜之间&#xff0c;Gemma系列正式上线&#xff0c;全面对外开放。 它采用Gemini同款技术架构&#xff0c;主打开源和轻量级&#xff0c;免费可用、模型权重开源、允许商用&#xff0c;…