JavaSE【继承和多态】(2)(向上转型、向下转型、重写、动态绑定、静态绑定、多态的运用)

一、多态

1.多态的概念

多态的概念:通俗来说,就是多种形态, 具体点就是去完成某个行为,当不同的对象去完成时会产生出不同 的状 态。
简单说就是,同一件事情,发生在不同对象身上,就会产生不同的结果。
多态体现:在代码运行时,当传递不同类对象时,会调用对应类中的方法 

2.多态实现条件

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

1. 必须在继承体系下,向上转型

2. 子类必须要对父类中方法进行重写

3. 通过父类的引用调用重写的方法

完成以上3步,就会发生动态绑定,动态绑定就是多态的基础

二、向上转型 、向下转型

1)向上转型:实际就是创建一个子类对象,将其当成父类对象来使用。

常见的3个向上转型的时机:
1.直接赋值     : 语法格式:父类类型 对象名 = new 子类类型 ()
2.方法的参数,传参的时候
3.返回值 
class Animal{
    public String name;
    public int age;

    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void eat(){
        System.out.println(this.name+"正在吃饭!");
    }
}
class Dog extends Animal{

    public Dog(String name, int age) {
        //帮助初始化子类从父类继承过来的成员
        super(name, age);
    }

    public void bark(){
        System.out.println(this.name+"旺旺叫");
    }
}

 父类本身时只能调用自己的成员方法和成员变量

1.直接赋值时 - 向上转型

 

 

2. 调用函数传参时 - 向上转型

 3.返回值 向上转型

 

2)向下转型(不安全)

向下转型: 将一个子类对象经过向上转型之后当成父类方法使用,再无法调用子类的方法,但有时候可能需要调用子类特有的
方法,此时:将父类引用再还原为子类对象即可,即向下转换

 

不安全的原因是:
         不同于向上转型,子类向上转型的父类是唯一的。
         而向下转型,父类下面的子类有多种,不唯一,不能保证向下转型的那一类就是之前向上转型的那个类。
例如:
         猫、狗 向上转型 动物(唯一)
        动物 向下转型 可以有 猫、狗、狼、马等(不唯一)
1)animal引用Dog,向上转型,狗是动物
然后dog引用animal,向下转型,刚刚好这个动物是狗,强制类型转换为Dog,再用dog接收
2)animal引用Dog,向上转型,狗是动物
然后Cat引用animal,向下转型,但此时这个动物是狗不是猫,强制类型转换为Cat
运行报错

 可以观察到:只有animal引用的对象是cat对象的实例

animal才能 向下转型 为cat

 

 

 

 

三、重写 - 父类和子类同名的方法 

重写 (override) :也称为覆盖。
重写是子类对父类 非静态 非private修饰 非fifinal修饰 非构造方法 等的实现过程 进行重新编写, 返回值和形参都不能改变 即外壳不变,核心重写! 重写的好处在于子类可以根据需要,定义特定 于自己的行为。 也就是说子类能够根据需要实现父类的方法。

如果在继承关系上,满足者3点

1.方法的返回类型一样

2.方法名一样

3.方法的参数列表一样

那么,就说这两个方法之间的关系是重写

重写的设计原则
对于已经投入使用的类,尽量不要进行修改。最好的方式是:重新定义一个新的类,来重复利用其中共性的内容,
并且添加或者改动新的内容。

1.一般来说  参数列表、 方法名 必须是一样的 ,返回值可以不同(但必须是父子关系)

1)参数列表 方法名 返回值 全都相同

没写子类eat方法时,父类调用的eat是自己的方法

 

 当子类有一个和父类同名的eat方法时(重写)

此时通过父类对象的引用,调用这个重写的方法

 

2)参数列表、方法名 相同,返回值 不同 。(称为:协变类型)

 

2.被重写的方法的访问修饰限定符( 子类要大于等于父类的)

private < 默认 < protected < public

如果父类是默认的,那么子类就只能是 默认 、protected 、 public。

 

 

 

 

3. 父类 private 、static、final、构造方法 不能被重写

1)被private修饰的方法 ,不能被重写

        因为本身private的范围就是,同一包中同一类

然后此时父类和子类是在两个不同的类中,固然错了。

2)被static修饰的方法,不能被重写

重写后的方法,最后是依赖父类对象来调用的,

而static不依赖于对象,而是用类来调用的,所以重写报错。

3)被final修饰的方法,不能被重写

        被final修饰,就表示这个类不能被继承。

而重写是在继承的基础上进行的,所以重写报错了。

4)构造方法不能被重写

        构造方法是每个类特有的,不能重写

 

 

4.避免在构造方法中调用重写的方法

        构造 D 对象的同时 , 会调用 B 的构造方法 .
        B 的构造方法中调用了 func 方法 , 此时会触发动态绑定 , 会调用到 D 中的 func
此时 D 对象自身还没有构造 , 此时 num 处在未初始化的状态 , 值为 0. 如果具备多态性, num 的值应该是 1.
        所以在构造函数内,尽量避免使用实例方法,除了fifinal private 方法。
结论 : " 用尽量简单的方式使对象进入可工作状态 ", 尽量不要在构造器中调用方法 ( 如果这个方法被子类重写 , 就会触 发动态绑定, 但是此时子类对象还没构造完成 ), 可能会出现一些隐藏的但是又极难发现的问题 .

 

 

 

5.建议重写之后,在重写的方法上面写一个@Override

这是一个注解,提示这个方法是重写的

 如果重写错误了,会给予提示

6.快捷键 生成 重写方法

按需要字节选择要重写的方法

 

回顾之前的 重写toString 方法

 ​​​​​

 

 

 

7.重写和重载的区别

 

 四、动态绑定 和 静态绑定

1.动态绑定:也称为后期绑定(晚绑定),即在编译时,不能确定方法的行为,需要等到程序运行时,才能够确定具体 调用那个类的方法。

打开字节码文件

 在这个路径里,输入cmd

 找到main方法

 

2.静态绑定:也称为前期绑定(早绑定),即在编译时,根据用户所传递实参类型就确定了具体调用那个方法。

典型代表函数重载。

例如

 

 五、多态的应用

   当父类引用,引用的子类对象不一样的时候,调用这个重写的方法,所表现出来的行为时不一样的!
   这种思想就时 多态!!!

 

使用多态的好处
1. 能够降低代码的 " 圈复杂度 ", 避免使用大量的 if - else
什么叫 " 圈复杂度 " ?
        圈复杂度是一种描述一段代码复杂程度的方式. 一段代码如果平铺直叙 , 那么就比较简单容易理解 . 而如 果有很多的条件分支或者循环语句, 就认为理解起来更复杂 .
        因此我们可以简单粗暴的计算一段代码中条件语句和循环语句出现的个数, 这个个数就称为 " 圈复杂度 ".
        如果一个方法的圈复杂度太高, 就需要考虑重构 .
不同公司对于代码的圈复杂度的规范不一样 . 一般不会超过 10

 1.画图形

1)普通if方法

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

}
class Rect extends Shape{
    @Override
    public void draw() {
        System.out.println("矩形");
    }
}
class Triangle extends Shape{
    @Override
    public void draw() {
        System.out.println("三角形");
    }
}
class Cycle extends Shape{
    @Override
    public void draw() {
        System.out.println("圆形");
    }
}
public class Test2 {
    public static void main(String[] args) {
        Rect rect = new Rect();
        Cycle cycle = new Cycle();
        Triangle triangle = new Triangle();
        String[] strings = {"cycle","rect","cycle","rect","triangle"};

        for (String x:
             strings) {
            if(x.equals("cycle")){
                cycle.draw();
            } else if (x.equals("rect")) {
                rect.draw();
            }else {
                triangle.draw();
            }

        }
    }


}

 

 

2)多态方法

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

}
class Rect extends Shape{
    @Override
    public void draw() {
        System.out.println("矩形");
    }
}
class Triangle extends Shape{
    @Override
    public void draw() {
        System.out.println("三角形");
    }
}
class Cycle extends Shape{
    @Override
    public void draw() {
        System.out.println("圆形");
    }
}
public class Test2 {
    public static void main(String[] args) {
//        Shape shape =  new Cycle();
//        Shape shape1 =  new Rect();
//        Shape shape2 =  new Triangle();
        Shape[] shapes = {new Cycle(),new Rect(),new Cycle(),new Rect(),new Triangle()};

        for (Shape shape:shapes){
            shape.draw();
        }
    }


}

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

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

相关文章

Mac强制停止应用

有时候使用Mac的时候&#xff0c;某个应用卡住了&#xff0c;但是肯定不能因为一个应用卡住了&#xff0c; 就将电脑重启吧&#xff0c;所以只需要单独停止该应用即可&#xff0c;使用快捷键optioncommandesc就会出现强制停止的界面&#xff0c;选择所要停止的应用&#xff0c;…

如何解决跨域问题?

一&#xff0c;什么是跨域 域&#xff08;Origin&#xff09;是由协议、域名和端口组成的&#xff0c;只有这三者完全一致的情况下&#xff0c;浏览器才会认为两个网址同源&#xff0c;否则就认为存在跨域。跨域是指在Web开发中&#xff0c;一个网页的JavaScript代码试图访问另…

yolov8-制作数据集,数据集格式转换(yolo格式-voc格式)附完整代码

yolo训练时可使用的数据集格式为yolo格式以及voc格式&#xff0c; voc格式的数据集在训练时需要先转换为yolo格式&#xff0c;然后根据自己的数据集的位置更改yaml配置文件的文件路径即可。基于目前对Yolo系列训练模型的讲解已经很全面&#xff0c;所以本文主要讲解yolo数据集与…

aws中opensearch 日志通(Centralized Logging with OpenSearch)2.0(一)

aws日志通2.0 实现全面的日志管理和分析功能 一体化日志摄取 &#xff1a;把aws服务器日志和应用日志传输到opensearch域中无代码日志处理 &#xff1a;在网页控制台中就可以实现数据处理开箱即用 &#xff1a;提供可视化模版&#xff08;nginx、HTTP server &#xff09; 架构…

如何有效保障企业内部网络安全?好的方式是什么?

据统计&#xff0c;70%的数据泄露安全事故来源于企业内部。所以有效保障企业内部网络安全至关重要。但不少企业还不知道如何有效保障企业内部网络安全&#xff1f;也不知道有哪些好的方式&#xff1f;这里我们小编就跟大家来一起简单探讨一下。 什么是网络安全&#xff1f; 网…

【沁恒蓝牙mesh】CH58x系统时钟配置与计算

本文主要记录了【沁恒蓝牙mesh】CH58x系统时钟配置与计算 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是喜欢记录零碎知识点的小菜鸟。&#x1f60e;&#x1f4dd; 个人主页&#xff1a;欢迎访问我的 Ethernet_Comm 博客主页&#x1f525;&#x1f389; 支持我&am…

Redis秒杀:一人一单问题及初步解决

优惠券秒杀一人一单 前言一、需求以及之前存在的问题二、增加一人一单逻辑1.初步代码2.封装一人一单逻辑3.控制锁的粒度 三、事务控制问题四、总结 前言 跟随黑马虎哥学习redis&#xff1a; 这是我认为b站上最好的redis教程&#xff0c;各方面讲解透彻&#xff0c;知识点覆盖…

【网络安全带你练爬虫-100练】第16练:使用session发送请求

目录 一、目标1&#xff1a;使用seesion进去请求 二、网络安全O 一、目标1&#xff1a;使用seesion进去请求 &#xff08;1&#xff09;应用&#xff1a; 通过创建会话&#xff08;session&#xff09;对象来请求并爬取返回的数据包 情景&#xff1a;需要登录才能爬取的网…

六、JVM-垃圾收集器浅析

垃圾收集器浅析 主 JVM参数 3.1.1 标准参数 -version -help -server -cp3.1.2 -X参数 非标准参数&#xff0c;也就是在JDK各个版本中可能会变动 -Xint 解释执行 -Xcomp 第一次使用就编译成本地代码 -Xmixed 混合模式&#xff0c;JVM自己来决定3.1.3 -XX参数 使用得…

四、JVM-对象内存模型

Java对象内存模型 一个Java对象在内存中包括3个部分&#xff1a;对象头、实例数据和对齐填充 数据 内存 – CPU 寄存器 -127 补码 10000001 - 11111111 32位的处理器 一次能够去处理32个二进制位 4字节的数据 64位操作系统 8字节 2的64次方的寻址空间 指针压缩技术 JDK1.6出…

elb 直接配置到后端服务器组

出现上图报错的原因是&#xff0c;前面elb配置了https证书&#xff0c;后端的nginx也配置了证书&#xff0c;导致冲突。 需要修改后端的nginx配置文件&#xff0c;将证书配置注释掉。 如果出现健康检查异常&#xff0c;需要在对应服务器的安全组上配置elb所在的网段的访问权限…

以CS32F031为例浅说国产32位MCU的内核处理器

芯片内核又称CPU内核&#xff0c;它是CPU中间的核心芯片&#xff0c;是CPU最重要的组成部分。由单晶硅制成&#xff0c;CPU所有的计算、接受/存储命令、处理数据都由核心执行。各种CPU核心都具有固定的逻辑结构&#xff0c;一级缓存、二级缓存、执行单元、指令级单元和总线接口…

PHP使用Redis实战实录3:数据类型比较、大小限制和性能扩展

PHP使用Redis实战实录系列 PHP使用Redis实战实录1&#xff1a;宝塔环境搭建、6379端口配置、Redis服务启动失败解决方案PHP使用Redis实战实录2&#xff1a;Redis扩展方法和PHP连接Redis的多种方案PHP使用Redis实战实录3&#xff1a;数据类型比较、大小限制和性能扩展 数据类型…

节日福利发什么?OI易问卷调查员工意见,“卷”赢其他公司

春节、妇女节、端午节、中秋节、元宵节、周年庆……近几年各公司之间的员工福利比拼“卷”上新高度&#xff0c;让HR、行政每逢佳节倍焦虑。 节日福利是表达公司对员工的关心和感谢&#xff0c;同时提高员工的归属感和满意度。礼品、购物券、节日慰问金、节日活动、食品饮料……

【雕爷学编程】MicroPython动手做(27)——物联网之掌控板小程序

知识点&#xff1a;什么是掌控板&#xff1f; 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片&#xff0c;支持WiFi和蓝牙双模通信&#xff0c;可作为物联网节点&#xff0c;实现物联网应用。同时掌控板上集成了OLED…

[Linux]手把手教你制作进度条小程序

[Linux]制作进度条小程序 文章目录 [Linux]制作进度条小程序C语言中的\n和\r字符缓冲区的刷新策略进行进度条代码编写 C语言中的\n和\r字符 C语言中字符分为两种: 可显字符控制字符 其中可显字符就是字符a这类的字符&#xff0c;控制字符就是\n这种控制字符。 对于我们制作…

便捷就医新选择,深度解析诊所小程序的功能要求

随着移动互联网的快速发展&#xff0c;越来越多的诊所选择开发诊所小程序来提供便捷的医疗服务。诊所小程序是一种基于微信平台的轻量级应用程序&#xff0c;为用户提供在线挂号、诊疗记录查看、医生咨询等功能。本文将介绍诊所小程序的功能要求&#xff0c;以帮助诊所更好地了…

web集群学习--静态网页和动态网页的区别、WEB1.0和WEB2.0的区别、Tomcat安装以及部署jpress应用

1.静态网页和动态网页的区别 1.1概念 静态网页&#xff1a; 由在服务器上提前创建好的HTML文件组成&#xff0c;它的内容在用户请求页面时不会发生改变。当用户访问一个静态网页时&#xff0c;服务器会直接将预先准备好的HTML文件发送给用户的浏览器进行显示。因为静态网页的…

快速远程桌面控制公司电脑远程办公

文章目录 第一步第二步第三步 远程办公的概念很早就被提出来&#xff0c;但似乎并没有多少项目普及落实到实际应用层面&#xff0c;至少在前几年&#xff0c;远程办公距离我们仍然很遥远。但2019年末突如其来的疫情&#xff0c;着实打了大家一个措手不及。尽管国内最初的大面积…

改进粒子群算法优化BP神经网络---回归+分类两种案例

今天采用改进的粒子群算法(LPSO)优化算法优化BP神经网络。本文选用的LPSO算法是之前作者写过的一篇文章&#xff1a;基于改进莱维飞行和混沌映射&#xff08;10种混沌映射随意切换&#xff09;的粒子群优化算法&#xff0c;附matlab代码 文章一次性讲解两种案例&#xff0c;回归…