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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 文硕 中级黑马   /  2012-7-3 21:53  /  3408 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

面向对象编程的多态性我看书也一直不太理解,谁能生动形象的解释下,谢谢。

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

11 个回复

倒序浏览
举个例子:
     就拿人当父类,中国人、美国人做子类;
  人都能吃饭,人都能说话;
  你试想一下把中国人和美国人放到一个人的集合中,然后循环掉吃饭和说话的方法;
   结果就是:中国人使用筷子吃饭,讲的是中文

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
断了接上
     美国人使用刀叉吃饭,讲的是英文;
  但掉方法时都是调的同一个方法,但结果却不一样
  说明多态是一种方法,不同实现;
回复 使用道具 举报
1,通过继承,一个类可以用作多种类型:可以用作它自己的类型、任何基类型,或者在实现接口时用作任何接口类型;
2,当派生类从基类继承时,它会获得基类的所有方法、字段、属性和事件。
3,同一个操作对于不同的操作对象,可以有不同的解释,并产生不同的执行结果;
4,多态类通过派生类覆盖基类中的虚函数型方法实现。

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
面向对象编程的多态性我看书也一直不太理解,谁能生动形象的解释下,谢谢。

相信你已经理解了封装和继承。其实多态的概念发展出来,是以封装和继承为基础的(其实我觉得抽象也应该算是面向对象的大特征之一,要封装,抽象是必须的)

简单的理解一下多态,比如:
     人这个类,封装了很多人类共有的特性,
     教师是人的子类,继承了人的属性与行为,当然教师有自己的特征行为,比如教书授课;
     学生是人的子类,继承了人的属性与行为,当然学生有自己的特征行为,比如学习做作业;
   
     现在,当我们需要去描述教师与学生各自的行为的时候, 我们可以分开来说"教师在授课",  "学生做作业",  但如果我们要站在抽象的角度,  也就是从教师与学生的父类"人"的角度, 来同时描述他们各自的行为时,我们怎么描述?"人在授课"?"人在做作业"?这是不是怪怪的很不合适?不合适的问题就在于, 对于行为主体,我们使用了抽象层次的东东"人",而对于行为本身, 我们却使用了具体的东东"授课"与"教书". 怎么解决呢? 那就需要解决抽象与具体的矛盾问题.
既然是站在抽象在角度来描述,那我们把行为抽象一下,不就能同时描述了吗?比如"人在做事"(教师授课与学生做作业都可以说成人在做事),这样就解决了抽象层次与具体层次之间的矛盾.

到了这一步, 我们可以把两个描述: "教师在做事", "学生在做事" 两者统一为"人在做事",
然后, 我们可以在"教师"的"做事"行为中去调用教师自己的特征行为"授课",
在"学生"的"做事"行为中去调用学生自己的特征行为"做作业",
所以,当调用"人"去"做事"的时候,如果这个人是教师,那他所做的事实际上就是"教书",
如果这个人是学生,那他所做的事实际上就是"做作业".
也就是说在这里"人"是多态的, 在不同的形态时,特征行为是不一样的, 这里的"人", 同时有两种形态,一种是教师形态,一种是学生形态,所对应的特征行为分别是"授课"与"做作业".

完成上述的描述过程, 其实就是多态机制的体现.

多态, 就是站在抽象的层面上去实施一个统一的行为,到个体(具体)的层面上时, 这个统一的行为会因为个体(具体)的形态特征而实施自己的特征行为.

多态比起封装与继承来说要复杂很多, 上面的描述很简单, 不用去死抠多态两个字,
其实只要明白:
能站在抽象的角度去描述一件事,
而针对这件抽象的事, 对于每个个体(具体)又能找到其自身的行为去执行, 这就是多态.

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
其实类似于方法的重载,你可以让方法名都相同,但是传入参数的个数、参数的类型和是否返回、返回的类型不同。
编译器就是根据参数的个数、参数的类型和返回值的类型来确定调用哪个方法。
这个也一样,你可以在不同的类中使用相同的方法名,或者在同一个类中使用相同的方法名,但是传入参数的个数、参数的类型和是否返回、返回的类型还是不同,如果一模一样不就打架了,编译器也会混乱的。

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
多态就是子类继承父类的方法,在运行时,根据不同的子类调用与父类相同的方法名,编译器动态决定调用基类的方法还是子类的方法

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
相同的函数名在动态运行时根据需要完成不同的功能
回复 使用道具 举报
就是对一个方法重写了,意思就是说这个方法有多个形态,可以完成不同的功能,例如,say()方法,中国人说中文就是中文say()方法,老外说英文就是英文say(),这就是多态

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
多态,就是把某个基本类型的变量(类实例)赋予其派生类型的变量,然后通过强制类型转化把基类的变量转化为派生类型的变量,然后调用派生类的方法。

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
面向对象程序设计中多态性是一个重要概念。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。可以把一组对象放到一个数组中,然 后调用它们的方法,在这种场合下,多态性作用就体现出来了,这些对象不必是相同类型的对象。当然,如果它们都继承自某个类,你可以把这些派生类,都放到一 个数组中。如果这些对象都有同名方法,就可以调用每个对象的同名方法。
同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是多态性。

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
用一句话来概括就是:子类的对象可以出现在父类的对象出现的任何地方。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马