面向对象程序三大特性一:多态(超详细)

news2024/10/6 6:50:37

目录

1.重写

1.1基本语法规则

1.2规则深化

1.3重写与重载的区别

2.向上转型

2.1简单介绍

2.3向上转型的作用

3.向下转型

3.1介绍

3.2instanceof 基本介绍

4.多态

4.1多态实现条件

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


1.重写

重写 (override) :也称为覆盖。重写是子类对父类非静态、非 private 修饰,非 final 修饰,非构造方法等的实现过程 进行重新编写, 返回值和形参都不能改变 即外壳不变,核心重写。

1.1基本语法规则

1) 返回值类型 (2)方法名 (3)参数列表 要完全一致
例子:

将eat()方法在子类中进行重写 

1.2规则深化

(1) 被重写的方法返回值类型可以不同 但是必须是具有父子关系的
(2) 访问权限不能比父类中被重写的方法的访问权限更低 。例如:如果父类方法被 public 修饰,则子类中重写该方 法就不能声明为 protected
(3) 父类被static、final和private修饰的方法、构造方法都不能被重写。

1.3重写与重载的区别

 重写和重载就体现多态

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

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

                                                             (图1-1) 


2.向上转型

2.1简单介绍

向上转型:

实际就是创建一个子类对象,将其当成父类对象来使用

语法格式:
父类类型 对象名 = new 子类类型()

具体代码在代码(2-1) 

向上转型的形式

(1)直接赋值

Animal animal = new Cat("元宝",2);

(2)方法传参

就是传参时进行 向上转型

(3)方法返回

同理:就是返回时进行 向上转型

2.3向上转型的作用

 

我们按向上转型的语法写完代码具体能做些什么?

(1)调用父类特有的方法 

(2)仅调用被子类重写的方法

看代码(2-1)
public class Animal {
    String name;
    int age;

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

    public void eat(){
        System.out.println(name+"吃点啥");
    }
    public void Father(){
        System.out.println("我是父类");
    }
}
public class Dog extends Animal{

    public Dog(String name, int age) {
        super(name, age);
    }

    @Override
    public void eat() {
        System.out.println(name+"吃狗粮");
    }

    public void cry(){
        System.out.println("狗叫");
    }
}
public class Cat extends Animal{
    public Cat(String name, int age) {
        super(name, age);
    }

    @Override
    public void eat() {
        System.out.println(name+"吃猫粮");
    }
    public void cry(){
        System.out.println("猫叫");
    }
}
public class Text {
    public static void fun(Animal a){
        a.eat();
    }

    public static void main(String[] args) {
      Animal animal1=new Dog("圆圆",19);
      Animal animal2=new Cat("方方",17);
      animal1.Father();
      fun(animal1);
      fun(animal2);
    }
}

运行结果:

(1)调用父类特有的方法 

 

无法调用子类特有方法

 

 (2)仅调用被子类重写的方法

 

问:如果想调用子类特有方法,怎么办?

3.向下转型

3.1介绍

将一个子类对象经过向上转型之后当成父类方法使用,再无法调用子类的方法,但有时候可能需要调用子类特有的 方法,此时:将父类引用再还原为子类对象即可,即向下转换。
Animal,Dog的代码请看代码(2-1)
class Text2{
    public static void main(String[] args) {
        Animal a1=new Dog("haha",8);
        if(a1 instanceof Dog){
            Dog dog=(Dog) a1;
            dog.cry();
        }
    }
}

运行结果:

3.2instanceof 基本介绍

语法为:

引用类型变量(object) instanceof 类(class)

 功能:

判断前面的对象是否属于后面的类,或者属于其子类;
如果是,返回 true,不是返回 false

instanceof 前面的引用变量编译时的类型要么与后面的类型相同,要么与后面的类型具有父子继承关系


 

4.多态

4.1多态实现条件

1. 必须在继承体系下
2 . 子类必须要对父类中方法进行重写
3 . 通过父类的引用调用重写的方法
缺一不可(上面 代码(2-1) 其实已经使用了 多态
多态体现:在代码运行时,当传递不同类对象时,会调用对应类中的方法
我们再看一个新例子
例子:
public class Shape {
    public void draw(){
        System.out.println("图形");
    }

}
class Rect extends Shape{
    @Override
    public void draw() {
        System.out.println("矩形");
    }
}

class Cycle extends Shape{
    @Override
    public void draw() {
        System.out.println("圆");
    }
}

class Flower extends Shape{
    @Override
    public void draw() {
        System.out.println("花");
    }
}
class Text2{
    public static void main(String[] args) {
        Shape shape[]={new Cycle(),new Rect(),new Flower()};
        for(Shape shape1:shape){
            shape1.draw();
        }
    }
}

运行结果:

多态缺陷:
1. 属性没有多态性
当父类和子类都有同名属性的时候,通过父类引用,只能引用父类自己的成员属性
2. 构造方法没有多态性

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

我们创建两个类 , B 是父类 , D 是子类 . D 中重写 func 方法 . 并且在 B 的构造方法中调用 func
class B {
public B() {
// do nothing
func();
}
public void func() {
System.out.println("B.func()");
}
}
class D extends B {
private int num = 1;
@Override
public void func() {
System.out.println("D.func() " + num);
}
}
public class Test {
public static void main(String[] args) {
D d = new D();
}
}
执行结果
D . func ()  0
解释:
(1) 构造 D 对象的同时 , 会调用 B 的构造方法
(2)B 的构造方法中调用了 func 方法 , 此时会触发动态绑定 , 会调用到 D 中的 func
(3) 此时 D 对象自身还没有构造 , 此时 num 处在未初始化的状态 , 值为 0
结论 : " 用尽量简单的方式使对象进入可工作状态 ", 尽量不要在构造器中调用方法 ( 如果这个方法被子类重写 , 就会触 发动态绑定, 但是此时子类对象还没构造完成 ), 可能会出现一些隐藏的但是又极难发现的问题

以上为我个人的小分享,如有问题,欢迎讨论!!! 

都看到这了,不如关注一下,给个免费的赞 

 

 

 

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

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

相关文章

数据库导出Excel格式的表结构

数据库导出Excel格式的表结构 你是否遇到到导出数据库里面的表结构,包含字段名称、类型、长度、小数、默认值、字段描述之类的需求;当我们去navcat里面找时发现没有,因为navcat没有提供这一功能,他只可以导出表结构的sql&#xff…

一百四十、海豚调度器——海豚删除无法直接删除的工作流

一、目的 海豚调度器有时会遇到无法直接删除的工作流,一旦直接删除就会报错: 批量删除工作流实例错误: 218 二、解决方法 (一)打开MySQL的dolphinscheduler数据库的表t_ds_process_definition (二)根据报错的工作流名称hive_ba…

上海亚商投顾:沪指震荡微涨 金融、地产午后大幅走强

上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 市场情绪 三大指数早盘震荡,午后集体拉升反弹,创业板指涨超1%。券商等大金融板块午后再度走强&#…

C语言多级指针

#include "stdio.h" #include <stdlib.h>int main() {int a 10;//*p int a int *pint* p &a;int** q &p;//int** q int *(*q) int *(q) a//int**q int*(*q) int*(&a) int*&a aint*** k &q;//分析&#xff1a;首先k是个变量&…

HDFS介绍

目录 ​编辑 一、HDFS基础 1.1 概述 1.2 HDFS的设计目标 1.2.1 硬件故障 1.2.2 流式数据访问 1.2.3 超大数据集 1.2.4 简单的一致性模型 1.2.5 移动计算而不是移动数据 1.2.6 跨异构硬件和软件平台的可移植性 1.3 基础概念 1.3.1 块&#xff08;Block&#xff09; 1.3.2 复制…

【智慧校园】智慧班牌解决方案

【智慧校园】智慧班牌全套源码 智慧校园saas云平台系统 前后端分离架构 1、使用springboot框架Javavue2 2、数据库MySQL5.7 3、移动端小程序使用小程序原生语言开发 4、电子班牌固件安卓7.1&#xff1b;使用Java Android原生 5、elmentui &#xff0c;Quartz&#xff0c;jpa&a…

MyBatis的动态SQL语句

文章目录 前言LocalDate数据库代码po 包 ifwhere 标签 查trim 标签 增set 标签 改foreach 标签 删 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 查询条件是动态的 MyBatis的动态SQL语句是指在运行时根据不同条件选择不同的SQL语句执行。 这些条件可…

华为OD机试真题 Java 实现【阿里巴巴找黄金宝箱(IV)】【2023 B卷 100分】,附详细解题思路

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 七、复杂度分析1、时间复杂度2、空间复杂度 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAV…

CAD随机球体颗粒过渡区3D插件

插件介绍 CAD随机球体颗粒&过渡区3D插件可用于在AutoCAD软件内生成随机分布的球体及球体外侧过渡区部件&#xff0c;适用于科研绘图、有限元建模如混凝土细观、颗粒增强复合材料、随机三维骨料及过渡区等方面的应用。 插件可指定的参数有模型的长、宽、高&#xff1b;球…

批处理文件的@echo off是什么意思?

echo off 关闭回显 echo on 打开回显 echo off并不是DOS程序中的&#xff0c; 而是DOS批处理中的。 当年的DOS&#xff0c;所有操作都用键盘命令来完成&#xff0c; 当你每次都要输入相同的命令时&#xff0c; 可以把这么多命令存为一个批处理&#xff0c; 从此以后&#xff…

MybatisPlus的QueryWrapper方法解释

QueryWrapper继承AbstractLambdaWrapper 继承自 AbstractWrapper ,自身的内部属性 entity 也用于生成 where 条件以及 LambdaQueryWrapper, 可以通过 new QueryWrapper().lambda() 方法获取. 一些用法 常规 queryWrapper.lt&#xff08;&#xff09;——小于queryWrapper.le…

揭开接口自动化测试的神秘面纱,从入门到高级实战

接口测试背景和必要性 接口测试是测试系统组件间接口&#xff08;API&#xff09;的一种测试&#xff0c;主要用于检测内部与外部系统、内部子系统之间的交互质量&#xff0c;其测试重点是检查数据交换、传递的准确性&#xff0c;控制和交互管理过程&#xff0c;以及系统间相互…

vue3引用Font-Awesome字体图标库

环境&#xff1a;vue3tsviteelement plus 介绍&#xff1a;这里安装引用的是Font-Awesome 6.x 版本&#xff0c;有专业版&#xff08;付费&#xff09;&#xff0c;这里只介绍免费版字体使用方法 一、安装 1.使用npm安装&#xff0c;终端打开项目目录或者命令行cd到目录文件夹…

QMessageBox、QColorDialog、按钮汉化显示

QMessageBox、QColorDialog、按钮汉化显示 版本&#xff1a;Qt5.9.9 环境&#xff1a;QtCretator MinGW 在Qt源码目录下找到qt_zh_CN.ts复制一份到工程目录&#xff0c;该文件在&#xff1a;G:\install\Qt\Qt5.9.9\5.9.9\Src\qttranslations\translations。 打开qt_zh_CN.ts文…

【C#学习笔记】引用类型(1)

文章目录 引用类型class匿名类 记录引用相等和值相等record声明 接口delegate 委托合并委托/多路广播委托 引用类型 引用类型的变量存储对其数据&#xff08;对象&#xff09;的引用&#xff0c;而值类型的变量直接包含其数据。 对于引用类型&#xff0c;两种变量可引用同一对…

【分布式任务调度平台 XXL-JOB 急速入门】从零开始将 XXL-JOB 接入到自己的项目

&#x1f4a7; 分布式任务调度平台 X X L − J O B 急速入门&#xff1a;从零开始将 X X L − J O B 接入到自己的项目 \color{#FF1493}{分布式任务调度平台 XXL-JOB 急速入门&#xff1a;从零开始将 XXL-JOB 接入到自己的项目} 分布式任务调度平台XXL−JOB急速入门&#xff1a…

在.net 6.0中 调用远程服务器web服务,Webservices(xxx.asmx) ,RESTful 风格,2种解决方案。

1.使用 Connected Services&#xff1a; 右键单击您的项目&#xff0c;选择 "Add"&#xff08;添加&#xff09;-> "Connected Services"&#xff08;已连接的服务&#xff09;。 在 "Connected Services" 对话框中&#xff0c;选择 "W…

如何用 Apache DolphinScheduler 实现自动配置自定义变量?

作者 | sqlboy-yuzhenc 背景介绍 在实际工作应用中&#xff0c;我们可能需要在整个 Apache DolphinScheduler 层面定义共用的日期变量&#xff0c;但是&#xff0c;开源版 Apache DolphinScheduler 只允许配置工作流级别的全局变量&#xff0c;这样&#xff0c;每个工作流就得…

机器学习笔记之优化算法(九)收敛速度的简单认识

机器学习笔记之优化算法——收敛速度的简单认识 引言收敛速度的判别标准 Q \mathcal Q Q-收敛速度 R \mathcal R R-收敛速度关于算法复杂度与收敛速度 引言 本节对收敛速度简单介绍。 收敛速度的判别标准 我们之前几节介绍了线搜索方法 ( Line Search Method ) (\text{Line …

无人驾驶实战-第四课(动态环境感知与2D检测算法)

无人驾驶中的检测框架 2D目标检测的思路 位置&#xff1a;先找到所有的ROI (Region of Interest, bounding box may containing object)类别&#xff1a;对每一个ROI做分类获取类别信息 位置修正&#xff1a;Bounding box Regression 找寻ROI的方法 1.滑窗法。从左到右&#xf…