父类 obj = new 子类();我现在知道,这属于多态,编译的时候obj是父类,执行的时候obj是子类。但是,我只是记住了概念而已,我怎么体会不到,实际的意思是什么呢?

解决方案 »

  1.   

    多态最主要是指成员方法/函数可以重载,如父类中的draw方法,在子类中可以重新实现,接口相同但实现不同。
    Shape为一个类,而其子类可能有Arc, Circle, Rectangle, Triangle,它们的draw方法实现不一。而一个Shape对象数组shapes中有各个类的实例,当你调用shapes[i].draw时有可能是画方框,有可能是画圆。这就是多态性。另外一个可能的多态性是指,方法名相同但参数不一样,如 draw( String )是画一个字符串,但draw( Date )是指画一个日期了。
    很笼统的说,多态应该相对C一类的非OO的语言讲有很大的优点。例如,一个学校要存储学生的资料,但是由专科,本科,硕士,博士组成的学生总体的资料的存放就会有区别。比方说,用C的数组存放,那么不同学位的学生就只能存放在不同的数组里面,而且操作只能分别实现。但是OO里面使用多态,完全给你一个统一的数组叫StudentArray,那么只要是学生类型,你都可以存放,因为他们共性被提取,而个性的实现不同,这就方便了管理。
    其实,我开始也觉得,函数的实现没有少花一点功夫,但是不要忘记,用户不晓得我们的东西,你给他说:“如果学生给你档案,那你就扔到橱子里面吧!”但是如果你给他说,1 2楼是学士的,3楼硕士,4楼博士,学士的用牛皮纸袋子,硕士用塑料袋子,博士的不要封装,那么他会感到很复杂,或者知道你的操作机制,从中破坏……总之,这是一个笼统的问题,得笼统解释。具体好处,你要慢慢感受!
      

  2.   

    Thinking in java 第七章多态应该还比较详细~~
      

  3.   

    借光:路过的各位,帮忙看看这几个帖子,看怎么解决;)谢谢啦!关于客户端页面从数据库中读取大量图片的问题
    http://community.csdn.net/Expert/TopicView3.asp?id=4816106乱码还原问题!
    http://community.csdn.net/Expert/TopicView3.asp?id=4813786关于javabean反射代理的问题
    http://community.csdn.net/Expert/TopicView3.asp?id=4813935
      

  4.   

    谢谢 ruanruoshi(软若石)的回答。可是你的答案不是我要的。父类 obj = new 子类();
    如果,父类中有aa()的方法,而子类中没有,那么编译通过,根本没有实际意义!
      

  5.   

    父类 obj = new 子类();
    如果,父类中有aa()的方法,而子类中没有,那么编译通过,根本没有实际意义!
    =====怎么说?
      

  6.   

    大家不要把我的问题想得太高深,我是java新手可能理解问题的方向有问题。
    --------------------------------
    父类 obj = new 子类();
    如果,父类中有aa()的方法,而子类中没有,那么编译通过,根本没有实际意义!因为运行的时候,obj是子类的对象,而子类中没有aa()方法,运行肯定出错了。如果,子类中有aa()方法的话,实现了对父类的重载也好,覆盖也好。那么直接就写    子类 obj = new 子类();  多好为什么写 父类 obj = new 子类();??
      

  7.   

    父类 obj = new 子类();
    只会调用父类有的方法,如果子类有定义,则覆盖父类的方法。
    父类没有的方法是没法实现的。
    也就是说
    父类 obj = new 子类();把子类当中有而父类没有的方法过滤掉了
      

  8.   

    我想,就是为了制造“同一个类同一个方法,不一个功能”的效果,至于为什么要制造这种效果,俺才疏学浅
    to 楼上,aa方法可以继承的,只要不是private
      

  9.   

    可以改善代码的组织结构和可读性,利于封装和扩展。
    如:有父类A,子类A1,A2,A3,A4都重写了execute()方法;
    A a = null;
    switch(flag)
    {
      case 1:
        a=new A1();
        break;
      case 2:
        a=new A2();
        break;
      case 3:
        a=new A3();
        break;
      case 4:
        a=new A4();
        break;
    }
    if(a!=null)
    {
      a.execute();
    }
    再演变为一堆设计模式...
      

  10.   

    似乎,这个问题,不大好回答。可能是java代码写的不够多,还是自己理解慢慢消化好了。谢谢各位的回贴。