黑马程序员技术交流社区

标题: 多态到底是什么???? [打印本页]

作者: 没壳的蜗牛    时间: 2014-5-25 13:49
标题: 多态到底是什么????
本帖最后由 没壳的蜗牛 于 2014-5-26 10:28 编辑

多态是什么东东,真的很难理解啊!:'(谁能具体说说啊!
作者: 风的尾巴    时间: 2014-5-25 13:58
多态==晚绑定。

不要把函数重载理解为多态。

因为多态是一种运行期的行为,不是编译期的行为。

多态:父类型的引用可以指向子类型的对象。

比如 Parent p = new Child();

当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;

如果有,再去调用子类的该同名方法。

如果想要调用子类中有而父类中没有的方法,需要进行强制类型转换,如上面的例子中,将p转换为子类Child类型的引用。

因为当用父类的引用指向子类的对象,用父类引用调用方法时,找不到父类中不存在的方法。这时候需要进行向下的类型转换,将父类引用转换为子类引用。     
作者: woshihq    时间: 2014-5-25 15:38
多态你可以理解成物质的多种形态,比如人,有男人,女人,食物有鱼类,青菜类等等,你用的时候记住子类能够自动的转换成父类类型,而父类则需强转为子类类型
作者: xp8812    时间: 2014-5-25 16:23
2楼很有道理
作者: ↘ふ紫铯幽夢    时间: 2014-5-25 16:23
多态可以理解为 一个事物,多种表现形态。

比如一个老师(好比java中一个类,一个描述老师的类),在学生面前他以老师的形态存在,
而在他孩子面前以父亲的形式存在,在他妻子面前则以老公的形式存在。。
也就是说在java中可以用父类类型的引用指向子类类型
  例如:   Object obj=new String("a");
     obj为父类类型引用,用obj指向了子类对象String。
  而不用多态时,都这样写。
               String s=new String("a");
  即用本类类型引用指向本类类型实例。
   


作者: yinxjfly    时间: 2014-5-25 17:55
事物的多种表现形态,再看一遍多台的视频肯定就明白了!

作者: TS__likewise    时间: 2014-5-25 19:06
简单来说,多态是具有表现多种形态的能力的特征,就像是橡皮泥,有可以捏成很多形状的能力。在OO中是指,语言具有根据对象的类型以不同方式处理之,特别是重载方法和继承类这种形式,的能力。多态被认为是面向对象语言的必备特性。多态实际上就是泛型。
泛型就是指我们不为特定的类型进行专门编码,而采用对不同类型进行通用编码的方式,无论是数据结果还是算法。
作者: 大bao    时间: 2014-5-25 19:15
引用别人的解析,详情见论文。个人觉得这样理解起来比较好:假设有一个“小提琴演奏者”类,有一个“钢琴演奏者”类,还有一个“萨克斯演奏者”类。它们都是弹奏乐器的,都继承自“乐器演奏者”类。“乐器演奏者”类有个方法叫做“演奏”。3 种不同的子类有不同的“演奏”方法实现(拉、弹、吹)。
那么指挥家如果要指挥一个交响乐,有两个办法:
(1) 分别是“小提琴拉起来”、“钢琴弹起来”、“萨克斯吹起来”。
(2) 只需要说一句“乐器们都演奏起来”。显然第一种方法是很笨拙的。因为指挥家不需要知道每种乐器演奏者具体怎么样去演奏乐器(是吹还是弹还是拉),只需要指挥就可以了。因此应当采用第二种做法。

Java中多态性之解析.pdf

132.89 KB, 下载次数: 1369


作者: 黑马粉、峥    时间: 2014-5-25 22:36
多态的概述:某一类事物的多种存在的多种形态。
其实我们生活中有很多地方也是用到多态的,比如生活的角色扮演,是儿子的话,看到爸爸应该叫爸爸,是学生看到老师,应该叫老师,我们在身份时时刻刻在进行不断的变化,这就是多态。

作者: \(^o^)/    时间: 2014-5-26 01:26
多肽简单的说就是一种事物多种表现形态,比如说你看见一个女,你可以叫她小姐,女孩,美女等都可以,就是你妈可以叫你是孩子,你爷爷可以叫你是孙子,你同学可以叫你是某某同学等。
作者: 27ZJQ    时间: 2014-5-30 23:41
大bao 发表于 2014-5-25 19:15
引用别人的解析,详情见论文。个人觉得这样理解起来比较好:假设有一个“小提琴演奏者”类,有一个“钢琴演 ...

这个解释好!
作者: 北极£莜蓝    时间: 2014-5-30 23:46
父类型的引用可以指向子类型的对象
作者: yang1352546    时间: 2014-5-31 00:13
好处:可以无限的扩展子类
  
  A. 父类或者接口指向自己的子类对象
     Fu f = new Zi();  
  B. 调用方法的时候,运行的是子类重写后的方法
  C. 调用成员变量的时候,运行的是父类的成员变量
  D. 在多态中,只能调用子类父类共有方法,不能调用子类的特有方法!!多态的弊端
  E. 调用子类特有方法,必须进行类型的强制转换,将提升为父类类型的子类对象,转回子类的类型,手动!!
  F. 保证程序的安全性,避免发生类型转换异常ClassCastException,采用instancof运算符,进行健壮性判断
g    非静态的成员方法,编译看左边,运行看右边
        其他情况,编译运行全看左边

作者: 不一样的颜色    时间: 2014-6-15 01:15
多态是面向对象的重要特性,简单点说:“一个接口,多种实现”,就是同一种事物表现出的多种形态。
作者: 黄宝宝    时间: 2014-6-15 02:25
路过,来看看..
作者: 江峰渔火    时间: 2014-6-15 08:17
多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。多态有两种表现形式:重载和覆盖,重载(overload),是发生在同一类中。与什么父类子类、继承毫无关系。  覆盖(override),是发生在子类中!也就是说必须有继承的情况下才有覆盖发生。
作者: 不去会死    时间: 2014-6-15 08:50
我是来凑热热闹闹的,你这样问可不好,如果非要给个建议,就是回家好好看毕老师的视频
作者: 掌柜的--刘饮    时间: 2014-6-19 00:32
2楼解释,漂亮啊
作者: 钟翠翠    时间: 2014-6-20 23:53
学习了。。。。
作者: 李亚西    时间: 2014-6-21 06:02
现在我也看到多态,确实有点难以理解
作者: rekirt    时间: 2014-6-21 07:17
重载就算多态的一个表现,
作者: 906822773    时间: 2014-6-22 08:50
多态有编译时多态 和运行时多态。 第一个是通过方法重载实现;第二个是通过方法覆盖实现(子类覆盖父类方法)。第二种就是动态绑定,使用父类引用指向子类对象,再调用某一父类中的方法时,不同子类会表现出不同结果。
作者: 钟翠翠    时间: 2014-7-15 09:13
风的尾巴 发表于 2014-5-25 13:58
多态==晚绑定。

不要把函数重载理解为多态。

总结的简单易懂,赞一个!

作者: 韩天雷    时间: 2014-7-15 10:27
学习!~~~~~~~~~
作者: 账号差点被盗    时间: 2014-7-24 22:36
一个事物在不同环境下所表现出的不同状态,就叫多态啊,比如:狗属于宠物也属于动物还属于生物
作者: niushicha    时间: 2014-7-27 12:54
简单的说,就是一个对象可以是自己本身的类型,也可以是父类类型,说白了,就这么简单,就是一个对象有两种表现形式,或者说两种状态。但是要使用多态,必须有前提,就是:1 要继承,实现(必须有关系),2 要有覆盖。
作者: GYSWL    时间: 2014-8-9 17:02
嗯,是有点费解
作者: Moriarty    时间: 2014-8-14 15:47
多态就是一个子类对象以父类的对象还是以子类的对象的身份出现。
作者: 毛富强    时间: 2014-8-21 12:29
理解  有点难 啊
作者: GYSWL    时间: 2014-8-21 19:10

2楼解释,漂亮啊 学习了。。。。
作者: 棕榈e人    时间: 2014-8-22 21:39
继承了父类的子类,和实现了接口的实现类,才存在多态。猫是动物中的一种,狗也是动物中的一种,他们都是动物的子类,都具有动物的公有属性和方法,动物可以是猫或狗,但动物没有猫狗的特有属性和方法,也就是说动物类可以引用猫、狗类,但不能用其特有方法
作者: yjiang_09    时间: 2014-8-24 23:10
1,一定要有继承
2.一定要有重写
3,父类引用指向子类对象
作者: 杜工    时间: 2014-9-2 07:52
通俗的说,同样是人,做同样的事情,有不同的行为方式、步骤。同样的命令,不同的人执行起来有差异。
作者: Nerro    时间: 2014-12-4 22:19
多态是将不同子类的对象赋给父类类型的变量,这样做是为了提高代码的扩展性和可维护性.

想实现多态需要有三个前提:
1:要有继承或者实现关系。
2:要有方法的重写/实现。
3:要有父类引用或者父接口引用指向子类对象。

在以上前提为基础下,多态在使用时有以下特点:
成员变量和成员方法在编译时是以左边即父类为主,
运行时成员变量还是以左边为主.成员方法以右边即子类为主.
因为方法存在重写,而变量没有.


而当父类要调用子类中特有方法时,必须对父类类型变量进行向下转型成子类类型变量才能使用子类特有方法.


作者: d7142947    时间: 2014-12-14 23:05
学习了.....
作者: 祁祯祥    时间: 2014-12-23 23:02
很受益啊
作者: 王者之风西昆仑    时间: 2014-12-24 22:52
风的尾巴 发表于 2014-5-25 13:58
多态==晚绑定。

不要把函数重载理解为多态。

讲的非常到位清晰,赞一个
作者: 王者之风西昆仑    时间: 2014-12-24 22:54
大bao 发表于 2014-5-25 19:15
引用别人的解析,详情见论文。个人觉得这样理解起来比较好:假设有一个“小提琴演奏者”类,有一个“钢琴演 ...

这样形象的解释还是第一次见,非常不错
作者: c91764000    时间: 2014-12-24 23:29
看了各位的讲解之后对多态有了更加清晰的理解了!
作者: dimost    时间: 2014-12-25 23:03
讲的很好 很不错 值得学习
作者: pj1988    时间: 2015-1-17 13:44
多态必须满足3个条件:
1:要有继承关系
2:要有方法重写
3:父类引用指向子类对象(这个比较难理解,多看哈视频)
作者: jiandonn    时间: 2015-3-25 07:48
支持支持支持支持!!!
作者: 杨大萌    时间: 2015-3-26 08:58
就是编译期间和运行期间参阅的方法不同,编译期间参考的是父类方法,运行期间参考的是子类方法。
作者: 张红兴    时间: 2015-3-27 00:05
奋斗中!
作者: l落落落叶    时间: 2015-3-27 16:21
二楼占一个,很不错啊
作者: 习惯沉淀    时间: 2015-3-28 20:20
简单一句话:父类引用指向子类对象。
作者: 12300123    时间: 2015-4-5 21:35
汗,还以为有什么牛叉见解
作者: 小小ye    时间: 2015-4-15 19:32
我的理解多态就是水蒸气和冰都能称呼为水
作者: 陈文超    时间: 2015-4-23 22:13
受教了,学到了
作者: 安日成    时间: 2015-4-29 00:24
多态不管你理解为迟绑定也好,还是多种形态也好,个人理解的就是:1.我可以用子类实例化并且使用子类覆写的方法;2.当作为函数参数的时候可以用父类/接口来当任意子类的形参
作者: wqw    时间: 2015-6-13 23:03
66666666666666666666666
作者: 18734903493    时间: 2015-7-29 23:40
多态可以理解为,事物存在的多种体现心态
eg:
      猫 X = new 猫();
      动物  X  = new  猫();
多态的体现:父类的引用指向了子类对象,也可以接受子类对象。
多态的提前:类与类之间要有继承或实现的关系,存在覆盖。
多态的好处:大大提高了扩展性
多态的弊端:只能使用父类的引用访问父类的成员

作者: TYT    时间: 2015-8-11 22:43
大bao 发表于 2014-5-25 19:15
引用别人的解析,详情见论文。个人觉得这样理解起来比较好:假设有一个“小提琴演奏者”类,有一个“钢琴演 ...

比较深刻!
作者: 横创    时间: 2015-8-18 22:18
长智商了
作者: 黄古槟    时间: 2015-9-5 11:05
在不同时刻表现不同状态的叫多态吧
作者: 球球_    时间: 2015-9-10 16:44
我也正蒙着,希望可以找到答案
作者: 灵韵依存    时间: 2015-11-21 13:49
很抽象的理论  
作者: 灵韵依存    时间: 2015-11-22 22:11
同求容易理解的答案中
作者: innovator    时间: 2016-5-30 15:27
大bao 发表于 2014-5-25 19:15
引用别人的解析,详情见论文。个人觉得这样理解起来比较好:假设有一个“小提琴演奏者”类,有一个“钢琴演 ...

生动形象的例子。
作者: l844717553    时间: 2016-8-7 07:55
构成多态必须满足下面3个条件
1.有继承关系
2.有方法重写
3.有父类引用指向子类对象
作者: l844717553    时间: 2016-8-7 08:04
其实多态顾名思义就是多种形态,比如说一个动物类他包含狗类、猫类、鼠类等等各种形态,这就是多态的一方面理解。其实我觉得,理解一个概念我们不只要知道他们是什么意思,更得知道他在平时java开发或者android开发中有什么用,在实际工作中有什么用,知道他的作用后,我们才能更主动地去学习并记住它,我晚上会回复一些多态应用的一些小程序
作者: 薛陇滨    时间: 2016-8-30 21:49
多态等于明天学习,明天认真听,明天认真记,明天认真练,明天必须掌握!!!
作者: 薛陇滨    时间: 2016-8-30 21:53
我今天触碰到多态了??
class N {
}
class M extends N {
}
class T {
    public static void main(String[] args){
           N x = new M();
    }
}
作者: 薛陇滨    时间: 2016-8-30 21:55
薛陇滨 发表于 2016-8-30 21:53
我今天触碰到多态了??
class N {
}

我今天编译了,没出现错误,
作者: zhangfengg    时间: 2016-9-7 22:21
大bao 发表于 2014-5-25 19:15
引用别人的解析,详情见论文。个人觉得这样理解起来比较好:假设有一个“小提琴演奏者”类,有一个“钢琴演 ...

这个举例好,赞一个
作者: zhulinfeng    时间: 2016-10-25 17:52
学习是吗是多态




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