A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Hello_world_ 中级黑马   /  2013-7-29 08:48  /  1354 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨兴庭 于 2013-7-30 22:34 编辑

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

评分

参与人数 1黑马币 +3 收起 理由
杨兴庭 + 3

查看全部评分

5 个回复

正序浏览
多态的思想:对于一个类,把它称之为基类,在其中只定义函数名,返回值,而没有函数体。它可以是抽象类,也可以是接口。
有许多类实现这个接口(或者继承这个抽象类)。
在调用的时候,用父类引用指向子类对象的方法。然后,调用对象的方法,编译器就会自动根据这个对象实际属于哪个实现类,来调出这个类对于接口或者抽象类的具体实现。

评分

参与人数 1黑马币 +3 收起 理由
杨兴庭 + 3

查看全部评分

回复 使用道具 举报

多态(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、 在程序的运行时,动态类型判定。运行时调用运行时类型,即它调用覆盖后的方法。

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
编译时的多态,是指参数列表的不同, 来区分不同的函数, 在编译后, 就自动变成两个不同的函数名. 在运行时谈不上多态
运行时多态:用到的是后期绑定的技术, 在程序运行前不知道,会调用那个方法, 而到运行时, 通过运算程序,动态的算出被调用的地址. 动态调用在继承的时候,方法名 参数列表完全相同时才出现运行时多态!

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
李政 发表于 2013-7-29 09:07
我的理解比较简单,程序的功能总要在运行期才能体现出现,多态也一样,在运行期的时候,父类才能引用子类对 ...

:L 和没说一样,这我也知道,还是谢谢
回复 使用道具 举报
我的理解比较简单,程序的功能总要在运行期才能体现出现,多态也一样,在运行期的时候,父类才能引用子类对象的方法,而编译的时候是体现不出来的,呵呵..
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马