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

【C++核心】面向对象的三大特性 静态多态: 函数重载和运算符重载属于静态多态,复用函数名。动态多态: 派生类和虚函数实现运行时多态。静态多态的函数地址早绑定:编译阶段确定函数地址。动态多态的函数地址晚绑定:运行阶段确定函数地址。动态多态的本质是父类指针或引用指向子类对象。本部分所介绍的多态,指的都是动态多态。因此,为了方便起见,下文只要说到多态的地方,都代表动态多态。 阅读详情

目录

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
结论 : " 用尽量简单的方式使对象进入可工作状态 ", 尽量不要在构造器中调用方法 ( 如果这个方法被子类重写 , 就会触 发动态绑定, 但是此时子类对象还没构造完成 ), 可能会出现一些隐藏的但是又极难发现的问题

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

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

 

 

 

面向对象三大特性之多态(详解) 目录 一.多态的概念 协变 析构函数的特殊处理 二.抽象类和override和final 抽象类 接口继承和实现继承 override和final 三.多态的原理 动态绑定和静态绑定 单继承和多继承的虚函数表 虚函数与虚继承 重载,重写和重定义(隐藏) 补充: 一.多态的概念 举例.我们在买票时会有成人票和儿童票,成人票的价格和儿童票的价格不一样,我们需要去区分成人票和儿童票,当然也有可能有其他的票型,这就很麻烦.我们就需要使用多态来处理 概念:当不同对象完成同一个操.. 阅读详情

相关推荐

【Java笔记】第8章:面向对象的三大特性(封装、继承、多态)

各位小伙伴大家好!上期小编给大家讲解了Java中的面向对象,接下来讲讲Java中面向对象的三大特性!Java中面向对象的三大特性是封装(Encapsulation)、继承(Inheritance)和多态(Polymorphism)。这些特性是Java编程语言中实现面向对象编程(OOP)的核心概念。封装(Encapsulation)封装是指将数据(属性)和操作数据的方法(行为)封装在一起,形成一个不可分割的整体。在Java中,封装通过访问修饰符(如publicprivateprotected和。

GUIQU的博客 2188

面向对象——多态

1. 多态概念        多态是面向对象程序设计(OOP)的一个重要特征,指同一个实体同时具有多种形式,即同一个对象,在不同时刻,代表的对象不一样,指的是对象的多种形态。        可以把不同的子类对象都当作父类来看,进而屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,统一调用标准。 多态的主要用途 1、提高程序的可扩展性; 2、降低系统耦合度; 3

杨思默 3133

C# 面向对象的三大特性

目录 一、封装 二、继承 三、多态 C# 面向对象的三大特性分别是封装、继承、多态,下面将帮助您更深一步了解并运用这三大特性。 一、封装 封装被定义为"把一个或多个项目封闭在一个物理的或者逻辑的包中"。在面向对象程序设计方法论中,封装是为了防止对实现细节的访问。 抽象和封装是面向对象程序设计的相关特性。抽象允许相关信息可视化,封装则使开发者实现所需级别的抽象。 C# 封装根据...

Carey 6408

面向对象的三大特征

面向对象的三大特征——封装、继承、多态

Demon_and_Angle_的博客 1万+

C++学习——面向对象三大特性:封装、继承、多态

今天来更新面向更新的三大特性,分别是封装、继承、多态,是C++面试中常考也是非常重要的面试题之一,如果最近有春招的宝可以关注我噢,我会定时分享C++相关常考的知识与面试题哒!

mingyuexin235的博客 1934

Python 面向对象三大特性:封装、继承与多态的深度解析

在 Python 中,可使用abc模块定义抽象基类和抽象方法,来规范子类必须实现的接口,进一步强化多态的约束性。passprint(f"使用信用卡支付 {amount} 元")print(f"使用支付宝支付 {amount} 元")Payment作为抽象基类,定义了抽象方法pay,子类CreditCardPayment和AlipayPayment必须实现pay方法,确保了在支付功能接口上的统一,体现了多态的规范与灵活性。

srlsong的博客 1421

【超详细】C#基础-面向对象三大特性:多态

今天来详细学习一下C#面向对象的三大特性:多态。多态(Polymorphism)是面向对象编程(OOP)中的一个核心概念,它允许对象以不同的方式表现出不同的行为。通过多态,子类可以在继承父类的方法时,修改或扩展父类的行为,甚至在运行时决定调用哪个类的方法,这使得程序更加灵活和可扩展。多态有两种主要形式:1)编译时多态(静态多态):主要通过方法重载和方法隐藏来实现。2)运行时多态(动态多态):主要通过方法重写和接口实现来实现。方法重写是指子类重写父类的虚方法或抽象方法

grapefruit_lyy的博客 1968

面向对象三大特性:封装、继承、多态深度解析

OOP。

KBkongbaiKB的博客 1577

面向对象程序三大特性

面向对象程序三大特性:封装、继承、多态

2301_80641575的博客 2087

python面向对象三大特性:封装,继承,多态

面向编程三大特性:封装(隐藏),继承,多态。 一. 封装 通过私有属性,私有方法的方式实现封装。 二. 继承 python支持多重继承,一个之类可以继承多个父类。 class 子类类名(父类1,父类2,…): 类体 父类名.__init__(self,参数列表) 1.成员继承:子类继承了父类除构造方法之外的所有成员。 2.方法重写:子类可以重新定义父类中的方法,这样就会覆盖父类中的方法,也称为重写。 通过类的方法**dir()**查看对象属性 重写__str__方法: 用于返回一个对于“

rosefun96的博客 1657

Java面向对象(进阶)-- 面向对象特征之三:多态性

Java面向对象(进阶)-- 面向对象特征之三:多态性

人生得意须尽欢 743

面向对象三大特性:封装、继承、多态

封装是基础,保障数据安全与模块独立;继承实现代码复用与层次化设计;多态通过动态绑定提升代码灵活性。三者协同作用,使得Java程序既高效又易于扩展。例如,一个游戏角色系统通过封装保护属性、继承复用代码、多态实现多样攻击行为,充分体现了三大特性的价值。版权声明:本博客内容为原创,转载请保留原文链接及作者信息。参考文章深入理解Java三大特性:封装、继承和多态面向对象三大特性:封装、继承、多态(最全面最详细的解释)

ning的博客 2004

Hyper-V创建Ubuntu虚拟机设置固定IP

本文记录使用hyper-v创建ubuntu虚拟机,为虚拟设置固定IP且通过物理机可访问。

2623

【c++】面向对象三大特性之——多态

一、多态的概念 二、多态的定义及实现 多态的构成条件 虚函数 虚函数的重写 虚函数的重写,两个例外 协变(基类与派生类虚函数的返回值类型不同) 析构函数的重写(基类与派生类的析构函数的函数名不同) 为什么要完成析构函数的重写? 析构函数虚函数的进行重写的原理 c++11 override和final override final 如何禁掉类的继承 c++98做法 要被继承的类的构造函数私有化 优化方案 要被继承的类的析构函数私有化 优化方案 c++11的做法 重载,重写(覆盖),重定义(隐藏)的对比 三、抽

重铸自身根基的博客 1697

stm32 + freertos + c++混合编程方法

其他一些资料上面,c++配置成--cpp11或者-cpp 都是把工程配置成c++。三、添加cpp文件,我们调用cpp文件里面的接口函数,不需要修改main.c后缀名。2、配置工程编译时候是--c99,是因为工程里面FreeRTOS是c语言,c++模式会报错。我们这里是默认c,编写的c++文件,单独选择--cpp编译,这在后面配置!c++是面向对象编程,对于一些项目来说,c++编程更加合适!stm32cubemax配置,这里就不写了,配置资料比较多。这里就是让cpp文件在c++下编译。最后,编程成功,点亮!

yuhu0012的博客 2629

YOLO26涨点改进 | 全网独家创新,注意力改进篇| SCI一区Top | 引入AFCA自适应细粒度通道注意力,联合建模全局与局部通道依赖关系,适合目标检测、图像去雾、关键点检测、图像分类、图像分割

🔥本文提出了一种基于AFCA(自适应细粒度通道注意力)模块改进的YOLO26目标检测网络。AFCA通过联合建模全局与局部通道依赖关系,实现了更精细的通道注意力分配,能够增强目标相关特征并抑制背景噪声。该模块采用自适应融合策略动态平衡通道权重,在保持轻量级结构的同时,显著提升了小目标和复杂背景下的检测性能。文章详细介绍了AFCA的结构原理、实现优势,并提供了完整的代码实现和YAML配置文件,指导读者如何将该模块集成到YOLO26框架中。实验结果表明,AFCA在检测精度和鲁棒性方面优于传统注意力机制。

Ai缝合怪、助力小伙伴高效发论文 304

Java面向对象程序三大特性:封装、继承、多态

通过合理地运用这三大特性,开发者能够将复杂的问题分解为更小的、易于管理的单位,大大提升了软件开发的效率和质量。封装是面向对象程序设计的基础,指的是将对象的状态和行为封装在一起,并对外提供访问接口。在该示例中,Manager类继承自Employee类,拥有Employee类的所有属性和方法,并能够重写work()方法来实现自己的行为。简化接口:通过封装,用户只需关注对象提供的接口,而不必关心其具体实现,降低了程序的复杂性。3.多态性:通过继承支持多态特性,使得同一接口可以有不同的实现,增强了系统的灵活性。

XHgga_的博客 1197

金三银四!风控建模岗面试题库大全:从理论到实战避坑指南

风控建模面试大全

阿黎逸阳的博客 767

C++每日一问:什么是面向对象?面向对象的三大特性

一、什么是面向过程? 面向过程是一种以过程为中心的编程思想,其原理就是将问题分解成一个一个详细的步骤,然后通过函数实现每一个步骤,并依次调用。面向过程我们所关心的是解决一个问题的步骤,举个例子,汽车发动、汽车熄火,这是两个不同的事件,对于面向过程而言,我们关心的是事件本身,因此我们会使用两个函数完成以上两个动作,然后依次调用即可。 二、什么是面向对象? 面向对象则是一种以对象为中心的编程思想,就是通......

欧特GO 6178

Yocto开发讲解系列 - 总目录

Yocto开发讲解系列总纲Yocto开发专栏前言

fulinux的博客 3万+

【ArcGIS Pro微课1000例】0022:基于DEM进行流域分析生成流域图

填洼Fill,在进行水文分析后续操作前,首先要对DEM进行填洼,创建无凹陷点的DEM。在ArcGIS中使用的是八方向流量建模(D8算法),工具位于水文分析下的【流向】。填洼需要使用水文分析工具下的【填洼】。确定输入与输出即可。

智慧空间实验室 2753

面向对象的三大特性: 继承,封装,多态

封装即隐藏对象的属性和实现细节,仅对外提供公共访问方式,保证了模块具有较好的独立性,使得程序维护修改较为容易。继承提高了代码的复用性,多态提高代码的扩展性和可维护性。三者共同达到了一个目的:使得对应用程序的修改带来的影响更加局部化,程序更加健壮,而且易维护、更新和升级。

Yietong的博客 2655

OpenClaw对接本地大模型:Llama3/Qwen/ChatGLM全适配,完全私有化部署

OpenClaw对接本地大模型,是企业级AI智能体落地的必经之路——它不仅解决了数据隐私和合规问题,还能大幅降低成本、提升响应速度、实现定制化。这篇文章我给大家完整拆解了两套部署方案:Ollama(新手首选,5分钟搞定)和vLLM(生产环境首选,高性能),覆盖了Llama3/Qwen/ChatGLM三大主流模型,还有真实的落地案例、高级优化、踩坑避坑指南,看完你就能零代码完成完全私有化的部署。从零开发自定义工具,给OpenClaw添加专属业务能力;

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 808

面向对象三大特性:封装,继承,多态;多态的机制;以及多态是如何实现的,实现的必要条件

所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。多态分为编译时多态和运行时多态。

weixin_44797327的博客 1058

【LE Audio】CAP精讲[1]: 从理论到实操,CAP 协同流程入门全攻略

LEAudio生态中的CommonAudioProfile(CAP)是一个关键协同框架,它通过整合基础音频协议(BAP/VCP/MICP等)构建多设备协同能力。CAP定义了三大核心功能:音频流管理、设备组控制和统一交互服务,解决了传统蓝牙音频在多设备场景下的协同痛点。其规范历经v1.0到v1.0.1的优化,修正了角色定义、连接流程等关键模块,提升设备兼容性。CAP采用严格的语言约定(shall/must/should)和术语体系(ContextType/CCID/协同集),确保不同厂商设备能相互理解。

byte轻骑兵的技术小窝 2万+

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

上一篇: 面向对象程序三大特性一:继承(超详细)
下一篇: 抽象类的顶级理解
WH牛
博客等级 码龄4年 613粉丝 107原创
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值