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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 疯狂程序 中级黑马   /  2013-3-23 23:42  /  1620 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 疯狂程序 于 2013-3-24 20:20 编辑

都说面向对象 3大特点,封装,继承,多态,我就是不理解多态,能给我详细讲讲吗?最好做个恰当比喻,感激不尽!

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

5 个回复

倒序浏览
class 动物{
 eat(){"吃东西"}
}
猫和狗继承动物这个类,要覆盖eat方法进行各自不同的实现。
class cat extend 动物{
  eat(){"吃鱼"}
}
class dog extend 动物{
  eat(){"啃骨头"}
}
animal function (){
return  一个任意动物子类对象;
}
动物 animal = function (); animal.eat();你不管返回给我哪个动物,都会各自执行它独有的eat方法。简单说,你只管把子类给我,执行的eat方法是它们自己的。这是多态的好处。

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 黑马朱超 于 2013-3-24 00:50 编辑

多态就是父类有个动作,他们的子类都会是实现这个动作。但是实现的方式和对象不一样。
比如就拿中国人的中文来说吧。
class 中国人
{
        speakChinese()
         {说中文}
}
class 东北人 extends 中国人
{
       speakChinese()
        {东北口音}//俺们那旮旯
}
class 四川人 extends 中国人
{
       speakChinese()
        {四川口音}//干啥子嘛
}
class 广东人 extends 中国人
{
       speakChinese()
        {粤语}//我顶你个肺
}
class 上海人 extends 中国人
{
       speakChinese()
        {上海口音}//侬家就要啦
}
然后你建立对象的时候,直接 中国人 person1 = new 广东人();
class 中国人
{
        speakChinese()
         {粤语}
}
那么这个person1 就既有个性又有共性了。共性是继承的方法;个性是运用这个方法的方式和子类特有的方法。
父类的引用虽然接收了自己子类的对象。但是父类并不知道这个对象是哪个。虽然说person1说的是粤语,但他并不知道自己是广东人,他只知道自己是中国人。因此如果person1强制认为自己是上海人的话。上海人 p = (上海人)person1;编译会报错。因为person1说粤语,上海人听不懂.因此父类转成子类后,不一定能够调用子类的方法(因为子类选错了);
加强了扩展性

不知道这个比喻是否能够利于你理解






评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
封装:
定义类CLASS1、CLASS2...封装在同一个包PACKAGE1中
需要引用这些类时,只需要引用PACKAGE1下的所有类就可以,不需要一个一个列出。
继承:
定义类FATHER,FATHER中有方法FUNC1。
定义子类CLASS1继承FATHER,则子类可以继承FUNC1。
用处:当有N个类需要实现同样的内容时,可以将这些重复的内容写到父类中。
多态:
定义类中的方法,可以同时定义FUNC1()、FUNC1(String para1)和FUNC1(Float para1)
当传入参数数目或者类型不同时,会自动调用相应的方法。

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
如果说类可以比喻为人的话,那么类中的方法就可以比作人的动作。
多态就好比一个动作的很多种实现形式,比如吃饭这个动作,就有很多种形式,你可以吃中餐、西餐,
再比如睡觉,你可以躺在床上睡,也可以趴在桌子上睡。这些都是一个动作的多种表现形式,希望这样讲你可以听懂!

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
class 毕姥爷{
        void 讲课(){
                System.out.println("政治");
        }
        void 钓鱼(){
                System.out.println("钓鱼");
        }
}
class 毕老师  extends 毕姥爷{
        void 讲课(){
                System.out.println("JAVA");
        }
        void 看电影(){
                System.out.println("看电影");
        }
}
public class Test{
        public static void main(String[] args){
                毕姥爷 b=new 毕老师();
                b.讲课();
                b.钓鱼();
               
                毕老师 bi=(毕老师)b;
                bi.看电影();
        }
}
        这是毕老师教学视频中的案例,对于这句语句:毕姥爷 b=new 毕老师();是向上转型,也就相对于毕老师
化妆成毕姥爷(他父亲),这个时候毕姥爷的同事来找毕姥爷来讲课,此时,该同事就会把毕老师当成父亲,然后要求
毕姥爷去讲课,这个时候毕老师虽然化妆成他的父亲,但是他讲课的时候只会讲自己会的,那就是JAVA,此时我们称
之为覆盖操作,这就是多态中成员函数的特点。
        此时,如果想要使用毕老师特有的属性功能,那么就要向下转型:毕老师 bi=(毕老师)b;这就相当于毕老师
回家卸妆以后的情况了,卸妆以后,毕老师就可以调用自己的特有方法。
        总结:多态向上转型的作用:(1)不能访问子类中的特有方法。如:b不能调用看电影的方法(2)提高了扩展性
如:毕姥爷家的儿子都可以化妆成毕姥爷,便于扩展功能的使用。
       多态向下转型的作用:为了使用子类中的特有方法。如:bi可以调用看电影的方法

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

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