多态

面向对象三大特征之多态

匆匆过客 提交于 2019-11-29 08:56:19
先来一波解释:多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。 估计有人看完都不想学了,那么我用自己的理解来写 多态的前提是继承,为什么这么说呢 举个例子,猫和狗都是动物的分类之一,都具有相同的属性和行为,但是在这基础上想想,猫和狗的行为还是有点区别的,比如说猫和狗都会叫发声,但是他们发出的声音不一样,他们睡觉的姿势,吃饭的习惯不一样,特长也不一样 在java类中,子类实现父类方法叫做重写,那么在重写父类方法后子类自己实现的操作就是多态、代码如下 //父类animal public class animal { String color;//颜色属性 public animal() {//构造函数 super(); // TODO Auto-generated constructor stub } public String getColor() {

java多态

时光毁灭记忆、已成空白 提交于 2019-11-29 08:51:19
多态的定义 Java的引用变量有两种类型:一个是编译时期的类型,一个是运行时类型。编译时类型由声明该变量时使用的类型决定,运行时的类型由实际付给该变量的对象决定。如果编译时类型和运行时的类型不一致,就可以出现所谓的多态。简单的说就是同一个对象(事物),在不同时刻体现出来的不同状态。 多态的前提 A:要有继承关系。 B:要有方法重写。 C:要有父类引用指向子类对象。 多态中的成员访问特点 A:成员变量 编译看左边,运行看左边。 B:构造方法 创建子类对象的时候,访问父类的构造方法,对父类的数据进行初始化。 C:成员方法 编译看左边,运行看右边。 D:静态方法 编译看左边,运行看左边。 (静态和类相关,算不上重写,所以,访问还是左边的) 多态的好处   提高了代码的维护性(继承保证)   提高了代码的扩展性(由多态保证) 来源: https://www.cnblogs.com/renxixao/p/11495269.html

php面向对象--继承、多态

£可爱£侵袭症+ 提交于 2019-11-29 08:27:09
面向对象的第二大特征:继承 继承:将所有子类的公共属性和方法,提取出来放到父类中,然后在继承下来,即重复代码只需写一遍。 为什么要使用继承? 继承可以让我们摆脱重复代码,让功能得以拓展。 父类中有构造方法,实现继承: <?php /** * 汽车类 */ class Car { public $wheel; //汽车轮子 function __construct($wheel) { $this->wheel = $wheel; } public function run() { echo '能跑'; } public function stop() { echo '能刹车'; } } /** * 卡车类,继承了汽车类 */ class Truck extends Car { public $load; //载货量 } /** * 公交车类,继承汽车类 */ class Bus extends Car { public $peples; //载客量 public function say(){ echo '报站'; } } $t = new Truck(12);//传递参数 printf("卡车有%d个轮子",$t->wheel); echo '<br>'; $b = new Bus(6);//传递参数 printf("公交车有%d个轮子",$t->wheel);

C++实现多态的原理

感情迁移 提交于 2019-11-29 06:48:46
C++的多态是面向对象编程的核心,那么C++的多态是怎么来实现的?今天我们就来探讨一下。 我们先来看下面程序和它的运行结果 #include using namespace std; class Father { public: void fun() { cout << “I am father!” << endl; } }; class Son:public Father { public: void fun() { cout << “I am son!” << endl; } }; int main() { Son son; Father *Pfather= &son; Pfather->fun(); system(“pause”); return 0; } 我相信很多人可能会误将它和C++的多态搞混,认为Son的对象son应该调用Son的成员函数,但事实却不是如此,这是为什么呢? 答:从编译器的角度看: C++编译器在编译时,会确定每个对象调用函数(非虚函数)的地址,这叫做早期绑定(也叫做静态绑定)。 当我们定义了派生类的对象,并取它的地址赋值给基类的指针,这时编译器会自动为派生类对象进行类型转换,将派生类对象转换为基类对象,站在内存的角度来看,访问的就是基类的成员。这是因为派生类的对象的对象模型如下: 基类的成员属于派生类成员的一部分,那么父类和子类的成员变量如何初始化呢

JavaScript 高级

╄→尐↘猪︶ㄣ 提交于 2019-11-29 06:42:53
JS最初的目的:解决用户与服务器之间的交互问题 js: 是一门脚本语言。不用编译,直接执行 是一门解释性语言。遇到一行就执行一行。 是弱类型语言。 定义变量都用var 是基于对象语言。没有面向对象的三大特性:继承 封装 多态,但是可以模拟面对对象的思想(继承 封装 多态) 是动态驱动。1. 执行到某一行代码时,才知道变量存储的是什么,知道对象的属性方法,变量的作用等等。 2.对象什么也没有,通过.点语法,就可以给对象添加属性和方法 来源: https://blog.csdn.net/weixin_40980087/article/details/99707642

多态.总结

送分小仙女□ 提交于 2019-11-29 06:02:43
对象的多种形态 1.引用多态 父类的引用可以指向本类的对象 父类的引用可以指向子类的对象 2.方法多态 创建本类对象时,调用的方法为本类方法 创建子类对象时,调用的方法为子类重写的方法或者继承的方法 抽象类 1、语法定义: 抽象类前使用abstract关键字修饰,则该类为抽象类。 2、应用场景: 在某些情况下,某个父类只知道其子类应该包含怎样的方法,但无法准确知道这些子类如何实现这些方法。 从多个具有相同特征的类中抽象出一个抽象类,以这个抽象类作为子类的模板,从而避免了子类设计的随意性。 抽象类实现接口可以不实现接口方法。抽象类继承其他类,其他类必须有明确(非私有)的构造方法。 3.抽象方法没有方法体以分号结束. 来源: oschina 链接: https://my.oschina.net/u/4258973/blog/3134669

多态

江枫思渺然 提交于 2019-11-29 05:01:40
package oop; /* Animal a = new Dog(); * 对象a具有两种类型 * 编译类型: 声明对象变量的类型, Animal, 表示把对象看成什么类型 * 运行类型: 对象的真实类型, Dog, 运行类型-->对象的真实类型 * 注: 编译类型必须是运行类型的父类或相同类型 * 当编译类型和运行类型不同的时候, 就产生了多态 * * 所谓多态: 对象具有多种形态, 对象可以存在不同的形式 * Animal a = null; * a = new Dog(); // 此时a表示Dog类型的形态 * a = new Cat(); // 此时a表示Cat类型的多态 * 多态的前提: 可以是继承关系(类和类), 也可以是实现关系(接口和实现类) * 多态的特点: 把子类对象赋给父类变量, 在运行时期会表现出具体的子类特征 * 多态的作用: 把不同的子类对象都当做父类类型来看待, 可以屏蔽不同子类对象之间的实现差异 * 从而写出通用的代码达到通用编程, 以适应不断变化的需求 */ // 普通动物 class Animal { public void eat() { System.out.println("吃普通的食物"); } } // 狗 class Dog extends Animal { public void eat() { // 对父类方法的覆盖

JAVA多态实现

大兔子大兔子 提交于 2019-11-29 03:35:52
多态实现: 多态:一个函数名根据对象不同对应不同实现 1) 静多态(编译期多态/静态绑定)->函数重载 重载的条件:在一个类中,函数名相同,参数列表不同 2) 动多态(运行期多态/动态绑定) 发生动态绑定的条件: 1.继承 2.重写 3.向上造型(基类的引用 引用的是派生类) Animal a =new Cat();//Cat满足是一个Animal的(注* 向下造型:Cat c=new Animal();) 多态的实现原理: People p=new Student(); p.eat(); 应用Student 来源: CSDN 作者: ZZZZZR23333 链接: https://blog.csdn.net/ZZZZZR23333/article/details/103235328

多态中的虚析构函数

只愿长相守 提交于 2019-11-29 00:17:38
为什么析构函数要声明成virtual呢? 因为,如果delete一个基类的指针时, 如果它指向的是一个子类的对象,那么析构函数不为虚就会导致无法调用子类析构函数,从而导致资源泄露。 如果一个类要被使用成 多态 的,那么这个 virtual是必须 的。比如: #include <iostream> using namespace std; class Animal { char* ap; public: Animal() { ap = new char; std::cout << "Animal ctor" << std::endl; } virtual void foo() { std::cout << "Animal::foo" << std::endl; } virtual ~Animal() { std::cout << "Animal dtor" << std::endl; delete ap; } }; class Dog : public Animal { char* dp; public: Dog() { dp = new char; std::cout << "Dog ctor" << std::endl; } virtual void foo() { std::cout << "Dog::foo" << std::endl; } virtual ~Dog() {

函数重载、多态与型变

蓝咒 提交于 2019-11-28 22:24:05
一、问题描述 视图类需要填充数据: view.loadData(data:Date); 视图是个继承体系; 视图数据的元素个不相同。 期望: 1、数据填充调用统一的接口; 2、传入的数据不经过类型转换可以直接获取数据中的具体元素。 解决方案: 参数协变; 结果: 参数协变 的函数被认为是函数重写; 二、函数重载的型变; 函数重载只支持参量的逆变和返回值的协变 三、结论 问题描述不可解。 四、接口与基类 在重载中不能替换为具体的类; 缺省只能使用公用功能。 使用具体功能需要经过类型转换。 来源: https://www.cnblogs.com/feng9exe/p/11430339.html