黑马程序员技术交流社区

标题: 关于多态 [打印本页]

作者: Hello_world_    时间: 2013-7-29 08:48
标题: 关于多态
本帖最后由 杨兴庭 于 2013-7-30 22:34 编辑

多态是一个运行期的行为 而不是一个编译器的行为   这句话怎么讲?

作者: 李政    时间: 2013-7-29 09:07
我的理解比较简单,程序的功能总要在运行期才能体现出现,多态也一样,在运行期的时候,父类才能引用子类对象的方法,而编译的时候是体现不出来的,呵呵..
作者: Hello_world_    时间: 2013-7-29 09:27
李政 发表于 2013-7-29 09:07
我的理解比较简单,程序的功能总要在运行期才能体现出现,多态也一样,在运行期的时候,父类才能引用子类对 ...

:L 和没说一样,这我也知道,还是谢谢

作者: 王希军    时间: 2013-7-29 09:36
编译时的多态,是指参数列表的不同, 来区分不同的函数, 在编译后, 就自动变成两个不同的函数名. 在运行时谈不上多态
运行时多态:用到的是后期绑定的技术, 在程序运行前不知道,会调用那个方法, 而到运行时, 通过运算程序,动态的算出被调用的地址. 动态调用在继承的时候,方法名 参数列表完全相同时才出现运行时多态!
作者: zhouchao    时间: 2013-7-29 09:37

多态(polymorphism)
       一个对象变量可以指向多种实际类型的现象。
多态分两种:
① 编译时多态:编译时动态重载; Ainmal ainmal = new Dog();
②运行时多态:指一个对象可以具有多个类型。 ainmal.sleep();
对象是客观的,人对对象的认识是主观的。
例:
Animal a=new Dog();查看格式名称;(编译时看左边,运行时看右边)
Dog d=(Dog)a。声明父类来引用子类。(强制转换)
(思考上面的格式)
运行时多态的三原则:(应用时为覆盖)
1、 对象不变;(改变的是主观认识)
2、 对于对象的调用只能限于编译时类型的方法,如调用运行时类型方法报错。
在上面的例子中:Animal a=new Dog();对象a的编译时类型为Animal,运行时类型为dog。
注意:编译时类型一定要为运行时类型的父类(或者同类型)。
对于语句:Dog d=(Dog)a。将d强制声明为a类型,此时d为Dog(),此时d就可以调用运行时类型。注意:a和d指向同一对象。属性看父类,方法看子类.
3、 在程序的运行时,动态类型判定。运行时调用运行时类型,即它调用覆盖后的方法。
作者: jialihong    时间: 2013-7-29 09:56
多态的思想:对于一个类,把它称之为基类,在其中只定义函数名,返回值,而没有函数体。它可以是抽象类,也可以是接口。
有许多类实现这个接口(或者继承这个抽象类)。
在调用的时候,用父类引用指向子类对象的方法。然后,调用对象的方法,编译器就会自动根据这个对象实际属于哪个实现类,来调出这个类对于接口或者抽象类的具体实现。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2