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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 风悠悠 中级黑马   /  2013-10-1 01:16  /  1500 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 风悠悠 于 2013-10-1 01:23 编辑

使用多态,到底有什么好处? Animal a = new Cat();
主要是问下,什么情况下要使用多态?

评分

参与人数 1技术分 +1 收起 理由
黄兴旺 + 1

查看全部评分

8 个回复

倒序浏览
多态的条件?(父类引用指向子类对象、要有继承或实现、要有重写)
再问个问题:人吃饭,你看到的是左手还是右手?

感觉我挺脑残的这个问题,我也就是想提醒你,多态就是一类事物的多种体现的形态。
这么说会不会很难懂?
很多老师都讲过这个例子:猫和狗,那么你觉得他们的共同点是什么?
对,都是动物,动物是猫和狗具体事物中抽取出来的父类型,
具体一点,动物都会吃东西吧?这是一个只要是动物都会有的行为(也就是方法),那么,不同的动物有不同的吃法,这个没争议吧?譬如猫吃鱼,狗啃骨头,这两种都是吃这个行为的细化。

那么这就是多态。

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
java 的多态性:发送消息给某个对象,让该对象自行决定响应何种行为。
实现多态必须具备3个条件:
1 继承
2 子类重写父类的方法
3 父类的对象指向子类的引用

当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。
1. 如果a是类A的一个引用,那么,a可以指向类A的一个实例,或者说指向类A的一个子类。

2. 如果a是接口A的一个引用,那么,a必须指向实现了接口A的一个类的实例。
详细说明:
Manager extends Employee之后:
-------------------------------------------------
(一)
Employee e = new Manager();
此为多态:父类引用指向子类对象。

-------------------------------------------------
(二)
void methodA(Employee e){

}
main方法中,可以使用 “对象.methodA(new Manager());”来调用这个方法
参数多态!

-------------------------------------------------
(三)
Employee[] e = new Employee[10];
e[0] = new Manager();
这是多态特性!

-------------------------------------------------
(四)jdk1.5中
Employee doSomething(){
return new Manager();
}
返回值多态!

-------------------------------------------------
(五)
如果Employee和Manager中有如下代码:
class Employee {
public String name="张三";
public void m1(){
System.out.println("Employee::m1()");
}
}
class Manager extends Employee {
public String name="李四";
public void m1(){
System.out.println("Manager::m1()");
}
}
再使用如下代码时:
Employee e = new Manager();
System.out.println(e.name);
e.m1();
//结果会打印出“张三”和“Manager::m1()”。
这是多态中的动态绑定:JVM会自动找到对象e是由Manager类实例化而来的,所以有‘覆盖’时调用Manager中的方法;而属性则不会被动态绑定,所以一定是Employee 中的(e的数据类型被声明为Employee了)。


关于Java多态性实现机制和多态中的相关注意问题以及其他的例子,您可以参见我的博客中对这个问题的资源汇总,我也是刚学不久,一起学习啊,呵呵,祝顺。
http://blog.csdn.net/hfsnail86/article/details/12214499



评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 hanfei2511 于 2013-10-1 06:34 编辑

加一句啊,方法重载不叫多态。
回复 使用道具 举报
  我来最简单的 你最明白,~多态三个条件 有继承 有重写 父类引用指向子类对象 ,  在以后的 框架 里面 你会觉得大大的好,~      一个接口  可以有多个实现啊,。~  比如  person p  =  new  man ;
    你现在用P写呢N多的操作, 如果你以后想改p里面的方法是不是很麻烦  这时候  person p  =  new    woman;  改改着一句 下面全部不用动

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
多态的好处是提高类的可扩展性和维护性,当你做一个比较大的项目时,可以使用多态,为以后的维护工作提供更多的便利,节约更多的时间
回复 使用道具 举报
凝聚 中级黑马 2013-10-1 21:41:43
7#
把不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。   赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。也就是说,父亲的行为像儿子,而不是儿子的行为像父亲。   举个例子:从一个基类中派生,响应一个虚命令,产生不同的结果。   比如从某个基类继承出多个对象,其基类有一个虚方法Tdoit,然后其子类也有这个方法,但行为不同,然后这些子对象中的任何一个可以赋给其基类的对象,这样其基类的对象就可以执行不同的操作了。实际上你是在通过其基类来访问其子对象的,你要做的就是一个赋值操作。   使用继承性的结果就是可以创建一个类的家族,在认识这个类的家族时,就是把导出类的对象当作基类的的对象,这种认识又叫作upcasting。这样认识的重要性在于:我们可以只针对基类写出一段程序,但它可以适应于这个类的家族,因为编译器会自动就找出合适的对象来执行操作。这种现象又称为多态性。而实现多态性的手段又叫称动态绑定(dynamic binding)。   简单的说,建立一个父类的变量,它的内容可以是这个父类的,也可以是它的子类的,当子类拥有和父类同样的函数,当使用这个变量调用这个函数的时候,定义这个变量的类(也就是父类)里的同名函数将被调用,当在父类里的这个函数前加virtual关键字,那么子类的同名函数将被调用。

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
16.        多态(多种形态)
实现条件:
a.        必须父子关系   (继承或者实现)
b.        必须有父类引用指向子类的实例
c.      有重写
至于作用
比如汽车A,汽车B,汽车C,你都定义一个类去描述它,显然,他们之间有汽车共同的定义是重复的,那么他们三个共同继承汽车类
1用多态的话,减少了代码的冗余,同时汽车类被A,B,C三个子类使用,那么代码的复用程度高了而且,可扩充性大, 并且灵活性这时增加一个汽车D 增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。并且简化了代码,共同性只要有多态就解决了也可以有自己的特点。

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
16.        多态(多种形态)
实现条件:
a.        必须父子关系   (继承或者实现)
b.        必须有父类引用指向子类的实例
c.      有重写
至于作用
比如汽车A,汽车B,汽车C,你都定义一个类去描述它,显然,他们之间有汽车共同的定义是重复的,那么他们三个共同继承汽车类
1用多态的话,减少了代码的冗余,同时汽车类被A,B,C三个子类使用,那么代码的复用程度高了而且,可扩充性大, 并且灵活性这时增加一个汽车D 增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。并且简化了代码,共同性只要有多态就解决了也可以有自己的特点。

评分

参与人数 1黑马币 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马