多态
- 格式:doc
- 大小:35.50 KB
- 文档页数:1
Java基本概念:多态⼀、简介描述:多态性是⾯向对象编程中的⼀个重要特性,主要是⽤来实现动态联编的。
换句话说,就是程序的最终状态只有在执⾏过程中才被决定,⽽⾮在编译期间就决定了。
这对于⼤型系统来说能提⾼系统的灵活性和扩展性。
多态允许相同类域的不同对象对同⼀消息做出响应。
即同⼀消息可以根据发送对象的不同⽽采⽤多种不同的⾏为⽅式。
多态可以让我们不⽤关⼼某个对象到底是什么具体类型,就可以使⽤该对象的某些⽅法,从⽽实现更加灵活的编程,提⾼系统的可扩展性。
如果对象的编译时类型和运⾏时类型不⼀致,就会造成多态。
存在条件:1. 类之间有继承关系。
2. ⼦类重写⽗类⽅法。
3. ⽗类引⽤指向⼦类对象。
注意:多态是⽅法的多态,属性没有多态性。
⼀个对象的实际类型是确定的,但是可以指向这个对象的引⽤的类型,却是可以是这对象实际类型的任意⽗类型。
⼦类继承⽗类,调⽤⽅法,如果该⽅法在⼦类中没有重写,那么就是调⽤的是⼦类继承⽗类的⽅法,如果重写了,那么调⽤的就是重写之后的⽅法。
'protected'修饰的⽗类⽅法可以被⼦类见到,也可以被⼦类重写,但是它是⽆法被外部所引⽤的,所以没有多态性。
通过⼀个变量调⽤其引⽤的对象的⼀个⽅法,编译器是否能让其编译通过,主要是看该变量类型的类中有没有定义该⽅法,如果有则编译通过,如果没有则编译报错。
⽽不是看这个变量所引⽤的对象中有没有该⽅法。
Java中的⽅法调⽤,是运⾏时动态和对象绑定的,不到运⾏的时候,是不知道到底哪个⽅法被调⽤的。
编写程序时,如果想调⽤运⾏时类型的⽅法,只能进⾏类型转换,不然通不过编译器的检查。
但是如果两个没有关联的类进⾏强制转换,会报类型转换异常:ClassCastException。
⽰例:public class Test {public static void main(String[] args) {/* 编译看左,运⾏看右 */Student student = new Student();/* 变量person是可以指向Person类型或其⼦类型的对象,所以可以指向Student类型对象 */Person person = new Student();/* 变量student能调⽤的⽅法是Student类中有的⽅法(包括继承过来的) */student.say();//Student/* 变量person能调⽤的⽅法是Person类中有的⽅法 */person.say();//Student}}class Person {public void say() {System.out.println("Person");}}class Student extends Person {public void say() {System.out.println("Student");}}⼆、重写、重载、多态的关系1. 重载是编译时多态调⽤重载的⽅法,在编译期间就要确定调⽤的⽅法是谁,如果不能确定则编译报错。
多态的概念和作⽤(深⼊理解)多态是⾯向对象的重要特性,简单点说:“⼀个接⼝,多种实现”,就是同⼀种事物表现出的多种形态。
编程其实就是⼀个将具体世界进⾏抽象化的过程,多态就是抽象化的⼀种体现,把⼀系列具体事物的共同点抽象出来, 再通过这个抽象的事物, 与不同的具体事物进⾏对话。
对不同类的对象发出相同的消息将会有不同的⾏为。
⽐如,你的⽼板让所有员⼯在九点钟开始⼯作, 他只要在九点钟的时候说:“开始⼯作”即可,⽽不需要对销售⼈员说:“开始销售⼯作”,对技术⼈员说:“开始技术⼯作”, 因为“员⼯”是⼀个抽象的事物, 只要是员⼯就可以开始⼯作,他知道这⼀点就⾏了。
⾄于每个员⼯,当然会各司其职,做各⾃的⼯作。
多态允许将⼦类的对象当作⽗类的对象使⽤,某⽗类型的引⽤指向其⼦类型的对象,调⽤的⽅法是该⼦类型的⽅法。
这⾥引⽤和调⽤⽅法的代码编译前就已经决定了,⽽引⽤所指向的对象可以在运⾏期间动态绑定。
再举个⽐较形象的例⼦:⽐如有⼀个函数是叫某个⼈来吃饭,函数要求传递的参数是⼈的对象,可是来了⼀个美国⼈,你看到的可能是⽤⼑和叉⼦在吃饭,⽽来了⼀个中国⼈你看到的可能是⽤筷⼦在吃饭,这就体现出了同样是⼀个⽅法,可以却产⽣了不同的形态,这就是多态!多态的作⽤:1. 应⽤程序不必为每⼀个派⽣类编写功能调⽤,只需要对抽象基类进⾏处理即可。
⼤⼤提⾼程序的可复⽤性。
//继承2. 派⽣类的功能可以被基类的⽅法或引⽤变量所调⽤,这叫向后兼容,可以提⾼可扩充性和可维护性。
//多态的真正作⽤,以前需要⽤switch实现----------------------------------------------------多态是⾯向对象程序设计和⾯向过程程序设计的主要区别之⼀,何谓多态?记得在CSDN⾥⼀篇论C++多态的⽂章⾥有⼀名话:“龙⽣九⼦,⼦⼦不同”多态就是同⼀个处理⼿段可以⽤来处理多种不同的情况,在钱能⽼师的《C++程序设计教程》书中有这样⼀个例⼦:定义了⼀个⼩学⽣类[本⽂全部代码均⽤伪码]class Student{public:Student(){}~Student(){}void 交学费(){}//......};⾥⾯有⼀个 “交学费”的处理函数,因为⼤学⽣和⼩学⽣⼀些情况类似,我们从⼩学⽣类中派⽣出⼤学⽣类:class AcadStudent:public Student{public:AcadStudent(){}~ AcadStudent(){}void 交学费(){}//.......};我们知道,中学⽣交费和⼤学⽣交费情况是不同的,所以虽然我们在⼤学⽣中继承了中学⽣的"交学费"操作,但我们不⽤,把它重载,定义⼤学⽣⾃⼰的交学费操作,这样当我们定义了⼀个⼩学⽣,⼀个⼤学⽣后:Student A;AcadStudent B;A.交学费(); 即调⽤⼩学⽣的,B.交学费();是调⽤⼤学⽣的,功能是实现了,但是你要意识到,可能情况不仅这两种,可能N种如:⼩学⽣、初中⽣、⾼中⽣、研究⽣.....它们都可以以Student[⼩学⽣类]为基类。
量子多态的概念和定义量子多态是指量子力学中的一个重要概念,它描述了一个量子系统在不同基态之间的切换,从而表现出多态性质。
量子多态在物理、计算机科学和化学等领域都有广泛的应用,对于理解和利用量子系统的行为具有重要意义。
在经典物理中,一个系统的基态是指系统的最低能量状态,其他状态可以通过加入足够的能量来实现。
但是在量子力学中,情况却有所不同。
量子力学中的系统可以处于多个基态中,这意味着系统可以同时处于多个状态,并且可以通过操作来在这些不同的状态之间切换。
这种多态性质是量子力学的独特特征之一,也是量子计算和量子信息科学等新兴领域的基础。
量子多态的概念可以从不同的角度来定义。
在计算机科学中,量子多态可以通过使用量子位或量子比特来实现。
量子比特是量子计算中的基本单位,与经典计算机中的经典比特不同。
一个经典比特只能处于0或1的状态,而一个量子比特可以同时处于0和1的叠加态。
这种叠加态使得量子比特可以表现出多态性,即同时处于多个基态。
另一方面,在物理学和化学中,量子多态可以描述量子系统在不同的能级上的分布。
量子系统的能级由能量本征值来标识,每个能级对应一个基态。
量子多态描述了不同能级上的概率分布,即不同基态之间的相对权重。
这种概率分布在量子系统的测量中起到关键作用,它决定了测量结果的概率性和可预测性。
量子多态的性质可以通过量子态的叠加和叠乘来描述。
量子态的叠加表示将两个或多个不同的量子态相加,得到一个具有多态性质的新态。
叠加态可以是相同能级上的不同基态,也可以是不同能级上的基态。
量子态的叠乘描述了两个或多个不同的量子态相乘,得到一个新的量子态。
叠乘态可以包含不同能级上的不同基态。
量子多态的行为可以由量子力学中的叠加原理和测量原理来解释。
量子力学中的叠加原理指出,一个量子系统可以处于所有可能基态的叠加态中,而不仅仅是其中的一个。
这样的叠加态可以通过量子操作来生成,并且可以通过测量来解读。
测量原理指出,在测量一个量子系统时,测量结果对系统的状态产生干扰,从而导致系统塌缩到一个确定的基态上。
C++多态分类1.静态多态性C++中的多态性包括静态多态性和动态多态性两类。
静态多态性通常称为编译时多态性,通过函数重载来实现。
动态多态性通常称为运行时多态,通常用虚函数来实现。
函数的重载包括普通函数的重载和类的成员函数的重载两种。
运算符的重载可以归类为函数的重载。
用虚函数来实现动态多态性只有在类的继承中才有意义。
静态多态性(也叫编译时多态性),在C++中是通过函数重载来实现的,运算符重载可以认为是特殊的函数重载。
所谓的函数重载,是指函数名相同,但是函数参数的类型、个数、顺序有所不同,当调用函数时,编译器会根据所给的参数的类型、个数、顺序的不同情况来决定具体调用的函数。
对函数的重载不允许二义性,有些函数重载表面上看起来没有问题,实际上会引起二义性,也是不被允许的。
Type1func1(int*a);Type1func1(int a[]);看起来参数的类型不一样,实际上是重复的两个函数,不允许被重载。
Type1func2(int a);Type1func2(int&a);看起来参数不一样,但在调用的时候同样会出现二义性,所以不允许重载。
Type1func3(int&a);Type1func3(const int&a);调用会引起二义性。
函数的重载和函数的带默认参数值也会引起二义性,如:Type1func4(int x,int y=0,int z=0);Type1func4(int a,int b);Type1func4(int k);三个函数的参数的个数不同,但是在调用的时候会引起二义性,所以原则上是不被允许重载的。
若有多个重载函数同时被定义,则在调用时不出现二义性是允许的,但在原则上会出现二义性的重载函数其实都不是好的处理方法,尽可能避免这样的函数重载。
很多情况下函数重载的定义是允许的,知识调用的时候才发现出现了二义性,如上面的func2()其实是允许的,只要调用的时候不出现二义性不出现二义性是可以的,比如下面的常量定义及相应的调用是可以的:const Type2a=const Exp1;func2(a);但是如果定义了下面的变量和相应的调用,则出现了二义性Type2b=Exp1;func2(a);因为这个调用两个函数都解释的通,既然如此,就无法确定调用的是哪一个,因此,就不被允许。
遗传多态现象遗传多态现象(genetic polymorphism)是指在一个群体中,同时和经常存在的两种或两种以上的变异型或基因型,每种类型的频率比较高,一般认为每种变异型超过1%即可定为多态现象,不足1%的称为罕见变异型。
人类存在多种遗传多态现象(多态性),主要有染色体多态性、酶和蛋白质多态性、抗原多态性的DNA多态性五类。
1.染色体多态性染色体的多态性又称异态性(heteromorphism)是指正常人群中经常可见到各种染色体形态的微小变异。
这种变异主要表现为同源染色体大小形态或着色等方面的变异。
多态性是可遗传的,并且通常仅涉及一对同源染色体中的一个。
例如表现的D和G组的随体增大、重复(双随体)或缺如,短臂的长短,1、9、16号染色体的次缢痕区加长或缩短,染色体着线粒区的荧光强度变异等。
Y染色体长臂的长度变异,可大于F组,也可小于G组,这种变异可能有民族差异。
染色体多态性的临床意义尚不清楚,在产前诊断中,染色体多态性可分胎儿细胞和母体细胞;可探讨异常染色体不分离的来源,有利于对患者家庭进行婚育的指导。
此外,可用于鉴定不同个体,对法医学中的亲权鉴定有一定的意义。
2.蛋白质多态性现在认为,人类结构蛋白质的多态性是一种普遍现象。
例如结合珠蛋白(haptoglobin,Hp)是一种糖蛋白,其生理功能在于Hp和血红蛋白结合后不能透过肾小球膜,因而红细胞破坏后释出的血红蛋白不能被肾清除,既避免铁的大量丢失,也可保护肾免受损害。
构成Hp分子的肽链有α和β链二种。
Hp多态性主要是α链的遗传变异。
α链有α1和α2二种。
α1中又有αIs和αIF二种亚型,各由84个氨基酸组成,两者区别在于第54位氨基酸(αIF为赖氨酸,αIs为谷氨酸),因此可以推断这一区别是通过一次点突变形成。
α2则由143个氨基酸组成。
从α链一级结构分析,Hpα2是HpαIF的N端71个氨基酸和HpISC端的72个氨基酸连接而成,即发生了错误配对和不等交换,形成了与HbLepore相似的融合基因。
多态的原理多态是面向对象编程中的一个重要特性,它是指同样的方法在不同的对象上会有不同的行为。
在实际编程中,多态可以帮助我们实现更加灵活、可扩展的代码,提高代码的复用性和可维护性。
本文将详细介绍多态的原理及其实现方式。
一、多态的原理多态是面向对象编程中的三大特性之一,另外两个特性是继承和封装。
多态的实现原理主要包括两个方面:继承和接口。
1. 继承继承是多态的实现方式之一,它是指一个类可以从另一个类中继承其属性和方法。
在继承关系中,父类是具有通用性的,而子类则是具有特殊性的。
在子类中可以重写父类的方法,从而实现多态。
例如,我们定义一个动物类Animal,它有一个方法叫做move(),表示动物的移动方式。
在这个类中,我们可以定义一个共有的move()方法:```class Animal {public void move() {System.out.println('动物在移动');}}```现在我们再定义一个子类叫做Dog,它继承了Animal类,并且重写了move()方法,表示狗的移动方式:```class Dog extends Animal {@Overridepublic void move() {System.out.println('狗在跑');}}```在这个例子中,我们通过继承的方式实现了多态。
当我们调用move()方法时,如果是Animal类型的对象,它会调用Animal类中的move()方法;如果是Dog类型的对象,它会调用Dog类中重写的move()方法。
这就是多态的实现原理。
2. 接口除了继承之外,接口也是多态的实现方式之一。
接口是一种抽象的数据类型,它定义了一组方法的签名,但是没有实现这些方法的具体内容。
在接口中定义的方法可以被多个类实现,从而实现多态。
例如,我们定义一个接口叫做Shape,它有一个方法叫做draw(),表示绘制图形的方式。
在这个接口中,我们可以定义一个共有的draw()方法:```interface Shape {void draw();}```现在我们再定义两个类叫做Circle和Rectangle,它们都实现了Shape接口,并且实现了draw()方法,分别表示绘制圆形和矩形的方式:```class Circle implements Shape {@Overridepublic void draw() {System.out.println('绘制圆形');}}class Rectangle implements Shape {@Overridepublic void draw() {System.out.println('绘制矩形');}}```在这个例子中,我们通过接口的方式实现了多态。
多态的三种⼿段⽤virtual修饰的⽅法叫做虚⽅法虚⽅法可以在⼦类中通过override关键字来重写常见的虚⽅法:ToString() Equalsc#基础多态的三种⼿段多态的概念概念:让⼀个对象能够表现出多种的状态(类型)实现多态的3种⼿段:1、虚⽅法 2、抽象类 3、接⼝关于虚⽅法需要注意的⼏点:1.⽗类中如果有⽅法需要让⼦类重写,则可以将该⽅法标记为virtual2.虚⽅法在⽗类中必须有实现,哪怕是空实现。
3.虚⽅法⼦类可以重写(override),也可以不重写关于抽象⽅法注意的⼏点:1.需要⽤abstract关键字标记2.抽象⽅法不能有任何⽅法实现。
3.抽象成员必须包含在抽象类中。
4.由于抽象成员没有任何实现,所以⼦类必须将抽象成员重写。
5.抽象类不能实例化,抽象类的作⽤:抽象类的作⽤就是为了让⼦类继承。
6.抽象类中可以包括抽象成员,可以包括有具体代码的成员。
7. 还有抽象⽅法不能⽤static修饰1.接⼝中只能包含⽅法(属性、事件、索引器也都是⽅法)2.接⼝中的成员都不能有任何实现。
光说不做3.接⼝不能被实例化。
4.接⼝中的成员不能有任何访问修饰符。
(默认为public)5.实现接⼝的⼦类必须将接⼝中的所有成员全都实现。
6.⼦类实现接⼝的⽅法时,不需要任何关键字,直接实现即可。
7.接⼝存在的意义就是为了多态。
//1.虚⽅法⽤virtual修饰的⽅法叫做虚⽅法虚⽅法可以在⼦类中通过override关键字来重写常见的虚⽅法:ToString() Equals//1)、虚⽅法//步骤://1、将⽗类的⽅法标记为虚⽅法,使⽤关键字 virtual,这个函数可以被⼦类重新写⼀个遍。
public class Employee{public virtual void DaKa(){Console.WriteLine("九点打卡");}}public class Manager : Employee{public override void DaKa(){Console.WriteLine("经理11点打卡");}}public class Programmer : Employee{public override void DaKa(){Console.WriteLine("程序猿不打卡");}}//抽象类1//2)、抽象类//当⽗类中的⽅法不知道如何去实现的时候,可以考虑将⽗类写成抽象类,将⽅法写成抽象⽅法。
多态概念内容多态(polymorphism)是计算机科学中的一个基本概念,指的是在面向对象编程中,对象能够以不同的方式被调用,而不需要重新创建一个新的对象。
具体来说,一个对象可以通过其属性和方法的组合,表现出不同的行为,而这些行为可以是抽象的(即通用的行为,不考虑具体实现细节)或具体的(即针对特定的对象或场景进行的行为)。
多态的实现方式有很多种,其中最常见的是继承( inheritance )和接口(interface)。
继承是一种将一个类的一部分行为继承到另一个类中的方法,而接口则是一种定义一组方法的协议,让不同的类可以调用这些方法,而不需要知道具体的实现细节。
除了继承和接口,还有其他一些实现多态的方式,如封装(封装是一种将对象的行为和数据分开的方法)和函数式编程(Functional Programming)中的lambda 表达式。
函数式编程中的 lambda 表达式可以用于封装对象的行为,从而隐藏对象的实现细节,使得在调用对象时只需要调用表达式返回的结果即可。
多态在面向对象编程中具有非常重要的意义,能够使得程序更加模块化、易于维护和扩展。
在实际应用中,多态也经常被用于实现客户端和服务端的分离,使得客户端只需要关注其需要的功能,而不需要关注整个系统的实现细节。
拓展:除了计算机科学中常见的多态概念,数学中的多态也可以指代一种函数的多重定义。
在数学中,多重定义指的是同一个函数在不同的上下文中定义了多个不同的函数。
例如,在函数的定义中,可以定义多个函数的参数类型和返回值类型,使得函数可以在不同的上下文中具有不同的功能和用途。
这种多重定义在计算机科学中也可以被称为多态,因为同一个函数可以在不同的上下文中表现出不同的行为。
多态多姿的意思解释词语
多态多姿这个词语由两个词组成,分别是“多态”和“多姿”。
它们分别代表了不同的概念和内涵,合在一起形成了一个有趣且丰富的词语。
首先,我们来解释一下“多态”这个词。
多态是指一个事物具有多种不同的形态或表现方式的特性。
具体来说,它可以表示某个事物在不同条件下呈现出的不同状态或表现形式。
在计算机科学领域,多态是面向对象编程中的一个重要概念,它可以实现不同的对象通过相同的接口表现出不同的行为。
接下来,我们解释一下“多姿”这个词。
多姿是一个形容词,形容某个事物具有多种形态或姿态的特点。
它可以用来形容自然界中的风景、艺术作品等,也可以用来形容人的气质、风采等。
具体来说,多姿可以指事物的多样性、丰富性和变化性,它传达出一种活力、美感和吸引力。
综合起来,多态多姿表示了一个事物具有多种不同形态和姿态的特性。
它强调了事物的多样性、变化性和丰富性。
无论是在计算机科学领域还是日常生活中,多态多姿都是一种积极向上的表现。
它鼓励我们去拥抱不同的选择和变化,欣赏事物的多样性,并且可以激发我们的创造力和想象力。
总结起来,多态多姿是一个富有内涵和诗意的词语,它从不同的角度和领域展示了事物的丰富性和变化性。
它提醒我们要保持开放的心态,欣赏多样性,并积极适应变化。
无论是在学术领域还是生活中,多态多姿都是一个值得我们关注和探索的主题。
解释面向对象程序设计中封装、继承、多态的概念【解释面向对象程序设计中封装、继承、多态的概念】在面向对象程序设计(Object-Oriented Programming,OOP)中,封装(Encapsulation)、继承(Inheritance)、多态(Polymorphism)是三个非常重要的概念,它们构成了OOP的基础。
在本文中,我将深入探讨这些概念,并通过具体的案例和应用来加深理解。
一、封装(Encapsulation)1.1 定义:封装是指将数据和方法打包在一起,同时对外隐藏对象的内部状态。
这样外部程序只能通过对象提供的接口(方法)来访问数据,而不能直接对数据进行操作。
1.2 实例:举一个简单的例子,比如一个汽车类。
我们可以将汽车的速度、油量等属性以及加速、刹车等方法封装在一个类中,并提供公共的接口供外部程序调用。
这样在使用汽车的时候,不需要关心汽车内部的具体实现,只需通过接口来操作汽车即可。
1.3 个人观点:我认为封装是OOP中非常重要的概念,它可以有效地提高代码的可维护性和安全性。
封装也使得对象的实现细节对外部程序透明,从而降低了程序的耦合度,提高了代码的灵活性。
二、继承(Inheritance)2.1 定义:继承是指一个类可以从另一个类中继承属性和方法,并且可以在此基础上进行扩展和修改。
这样可以有效地实现代码的复用,提高了代码的可维护性和可扩展性。
2.2 实例:以动物类和猫类为例,动物类中包含了一些通用的属性和方法,比如呼吸、进食等。
而猫类可以从动物类中继承这些属性和方法,并且可以在此基础上扩展一些猫特有的属性和方法,比如捉老鼠、喵喵叫等。
2.3 个人观点:继承是OOP中非常重要的特性,它可以帮助程序员减少重复代码的编写,提高了代码的复用性和可维护性。
但是在具体应用时,需要注意合理使用继承,避免过度继承导致代码结构复杂和不易理解。
三、多态(Polymorphism)3.1 定义:多态是指同一操作作用于不同的对象上会产生不同的行为。
多态多姿造句1.春天的花,千姿百态,多态多姿。
2.她的舞蹈动作千变万化,多态多姿。
3.这个公园里的植物多态多姿,让人目不暇接。
4.他的生活多态多姿,充满了各种可能性和惊喜。
5.这个艺术展览的内容非常丰富,各种艺术品摆放在那里,显得多态多姿。
6.她的性格多态多姿,从她的衣着就可以看出她的多元化性格。
7.他的生活方式多态多姿,充满了挑战和新鲜感。
8.这个城市的文化活动多态多姿,为市民提供了丰富多彩的选择。
9.她的画作风格多态多姿,每幅画都有自己独特的魅力。
10.他的表演风格多态多姿,让观众们大饱眼福。
11.我觉的雨是那么多姿多态,给人们带来凉爽,给小孩带来快乐,给农民带来丰收。
12.你喜欢花,那种淡淡的鹅黄,充斥了你的眼界,天真烂漫的眼神,抚慰着心中每一处温润。
看看粉色的桃花,摇曳风中多姿多态,辗尘散香,你心怀渴望对自然的那种向往演绎着你善良单纯的心。
13.彩车一辆接一辆地在欢乐的人群中通过,真是五花八门。
多姿多态,看得人眼花缭乱,有“猪八戒背媳妇”、“小人国摔跤”、“城乡建设”、“国防建设”、“丰收有余”……真是数不胜数呀!14.五彩缤纷、多姿多态生活,每人都有自己人生,每人各自有不同生活。
人生只有一次,单单属于我们自己,我们不能白白浪费我们生命,我们都想为自己人生划上一个圆满句号。
那么,就让我们一起感受生活,享受生活吧!15.歌声是多姿多态的,不同的歌有着不一样的韵味,我们听起来是有着不一样的感觉的,酸甜苦辣咸都有。
16.五彩缤纷的大自然充满着美,多姿多态的事物中闪现着美,时间和空间里跳跃着美,等待着美丽的双眼去捕捉,去寻觅......。
多态是什么意思多态,就是指在不改变基本特征前提下允许存在差异。
那么“同一物种”为什么又会出现两种或几种不同状况呢?答案很简单——“变化”!举例来说,原始森林里有着各种野兽、飞禽走兽等,它们之间因相互适应而生活方式与生命周期也大不相同。
但我们可否认为在他们之间并没有发生过“物种进化”呢?只要仔细想想,还真有点儿像那么回事。
假设你到山上碰巧遇见了熊,该怎样打招呼才合乎礼貌呢?你知道吗?虽然同是熊科动物,可熊却有三四十种不同的叫声;即使在冬眠时也各具姿态,不愿被打扰……所谓多态是指同一事物的两种不同属性或形式,或者同一事物由于条件不同表现出两种甚至更多的不同状态。
正如《老子》第二章云:“物或损之而益,或益之而损。
”同一物体既可以受到外力作用而发生变化,也可以通过自身内部的调整得到恢复。
比如汽车轮胎爆裂后,车主往往将其卸下换上备胎,此时若再加装防护钢板则显然增加了油耗。
反之亦然,备胎未及时更换而长期暴露在外容易遭受破坏。
但这些都不妨碍它继续工作。
当我们面对新问题、解决新矛盾时,切忌把自己固有的思维模式强加给别人,尤其不要武断地推论事情必定会朝某个方向发展,这样只会让事情越来越糟糕。
动物界中许多现象都能说明这个道理:如爬行类和鸟类,鸟在孵卵期需要母亲在巢边守候,而哺乳类动物幼崽刚出生时最喜欢妈妈抱着摇晃,只有少数动物完全靠自己的天赋和努力成功地跨入独立行列。
因此,任何物种都有自己的优势,从而造就了生命奇迹般的多彩多姿。
这样看来,多态并非不好,关键是如何做到多态。
实际上,同一事物处于不同环境下便会产生千差万别的结果。
人们总爱以自己固有的观念去看待世间万物,试图找到它们的共性,殊不知这恰恰阻碍了事物的多样性和生命的精彩纷呈。
当今社会崇尚创新,每个人都在积极寻求发展空间,以期为社会贡献一份绵薄之力。
这无疑是值得称赞的。
但若总是囿于陈规陋习,死抱教条不放,恐怕难免落得事倍功半的尴尬局面。
正如王安石笔下的方仲永,虽然家资丰厚,却不愿学习文化知识,最终泯然众人矣。
【转】什么是多态,怎样实现多态C++中多态是怎样实现的?多态是⼀种不同的对象以单独的⽅式作⽤于相同消息的能⼒,这个概念是从⾃然语⾔中引进的。
例如,动词“关闭”应⽤到不同的事务上其意思是不同的。
关门,关闭银⾏账号或关闭⼀个程序的窗⼝都是不同的⾏为;其实际的意义取决于该动作所作⽤的对象。
⼤多数⾯向对象语⾔的多态特性都仅以虚拟函数的形式来实现,但C++除了⼀般的虚拟函数形式之外,还多了两种静态的(即编译时的)多态机制:1、操作符重载:例如,对整型和串对象应⽤ += 操作符时,每个对象都是以单独的⽅式各⾃进⾏解释。
显然,潜在的 += 实现在每种类型中是不同的。
但是从直观上看,我们可以预期结果是什么。
2、模板:例如,当接受到相同的消息时,整型vector对象和串vector对象对消息反映是不同的,我们以关闭⾏为为例:vector < int > vi; vector < string > names;string name("VC知识库");vi.push_back( 5 ); // 在 vector 尾部添加整型names.push_back (name); // 添加串和添加整型体现差别的潜在的操作静态的多态机制不会导致与虚拟函数相关的运⾏时开。
此外,操作符重载和模板两者是通⽤算法最基本的东西,在STL中体现得尤为突出。
那么接下来我们说说以虚函数形式多态:通常都有以重载、覆盖、隐藏来三中⽅式,三种⽅式的区别⼤家应该要很深⼊的了解,这⾥就不多说了。
许多开发⼈员往往将这种情况和C++的多态性搞混淆,下⾯我从两⽅⾯为⼤家解说:1、编译的⾓度C++编译器在编译的时候,要确定每个对象调⽤的函数的地址,这称为早期绑定(early binding)。
2、内存模型的⾓度为了确定对象调⽤的函数的地址,就要使⽤迟绑定(late binding)技术。
当编译器使⽤迟绑定时,就会在运⾏时再去确定对象的类型以及正确的调⽤函数。
面向对象的多态什么是多态在面向对象编程中,多态(Polymorphism)是一个重要的概念。
它指的是同一个方法可以根据不同的对象产生不同的行为。
换句话说,多态允许我们使用统一的接口来处理不同类型的对象。
多态是面向对象编程的三大特性之一,其余两个特性是封装和继承。
封装是指将数据和方法包装在一个对象中,继承是指一个类可以继承另一个类的属性和方法。
多态使得程序更加灵活,可扩展性更强。
生活中的多态示例为了更好地理解多态,我们可以通过生活中的一些例子来解释它。
1. 动物发声想象一下,你在一座动物园里散步。
你经过了一些动物的笼子,每个动物都在发出自己独特的声音。
狗在汪汪叫,猫在喵喵叫,鸟在唧唧鸣。
尽管它们发出的声音不同,但它们都是动物,都具有发声的能力。
在这个例子中,动物园可以被看作是一个类,而每个动物则是该类的实例。
类定义了动物的共同属性和方法,而每个实例则可以根据自己的特性来表现不同的行为。
这就是多态的体现。
2. 图形的面积计算假设你正在画一些图形,包括圆形、矩形和三角形。
你需要计算每个图形的面积。
不同的图形有不同的计算公式,但它们都有一个共同的方法——计算面积。
在这个例子中,每个图形可以被看作是一个类,而计算面积的方法则是这个类的一个公共方法。
每个图形类可以根据自己的特性实现不同的计算面积的方式。
当你调用计算面积的方法时,程序会根据具体的图形类型来执行相应的计算。
多态的实现方式在面向对象编程中,实现多态有两种常见的方式:继承和接口。
1. 继承实现多态继承是面向对象编程中的一个重要概念,它允许一个类继承另一个类的属性和方法。
通过继承,子类可以重写父类的方法,从而实现多态。
以动物为例,我们可以定义一个基类 Animal,它有一个方法叫做 makeSound()。
然后我们定义几个子类,如 Dog、Cat 和 Bird,它们分别重写了 makeSound() 方法来发出不同的声音。
class Animal {public void makeSound() {System.out.println("Animal makes sound");}}class Dog extends Animal {@Overridepublic void makeSound() {System.out.println("Dog barks");}}class Cat extends Animal {@Overridepublic void makeSound() {System.out.println("Cat meows");}}class Bird extends Animal {@Overridepublic void makeSound() {System.out.println("Bird chirps");}}public class Main {public static void main(String[] args) {Animal dog = new Dog();Animal cat = new Cat();Animal bird = new Bird();dog.makeSound(); // 输出:Dog barkscat.makeSound(); // 输出:Cat meowsbird.makeSound(); // 输出:Bird chirps}}在上面的例子中,我们定义了一个 Animal 类作为基类,然后定义了三个子类 Dog、Cat 和 Bird,它们都重写了 makeSound() 方法。
多态名词解释
多态是面向对象程序设计中的一个概念,指的是同一个方法在不同的对象上有不同的行为。
简单来说,多态允许我们将父类的引用指向子类的对象,从而调用子类中重写了父类方法的方法。
在多态中,同一个方法可以根据调用对象的不同而有不同的具体实现。
这样一来,我们就可以通过父类的引用调用不同子类中的同名方法,而且不同的子类对象会表现出不同的行为。
多态有以下几个核心概念和特点:
1. 继承:多态是建立在继承关系的基础上的,子类继承了父类的方法和属性。
2. 重写:子类可以重写父类的方法,即在子类中重新定义和实现与父类同名的方法。
3. 动态绑定:多态是在程序运行时实现的,根据实际的对象类型来决定调用哪个方法,而不是在编译时确定。
4. 父类引用:可以使用父类的引用变量来引用子类的对象,从而实现多态性。
多态的应用可以提高代码的灵活性和扩展性,使得程序在运行时更具有适应性。