我一直以来对多态的理解是在一个类里面,几个方法名相同,但参数不同,或者返回值不同,如
class ClassName{
void method1(int i){
Systme.out.println(i);
}
void method2(String s){
Systme.out.println(s);
}
String method3(String d){
return d;
}
}
然后这几个方法就体现了多态性,
然后如
List a=new ArrayList();
和List b=new LinkList();
这也体现了多态性,
  
然今天请教一位同事,他跟我说
上面的并不能全部正确正确的理解应该是
//假如有动物这样一个对象,也可以说类吧,姑且叫class Animal {
    void jump() {
        System.out.println("Animal is jump");
    }
// 然后有具体的猪、狗继承动物这个类,也就是class Pig extends Animal {
    void jump() {
        System.out.println("pig is jump");
    }
}class Dog extends Animal {
    void jump() {
        System.out.println("dog is jump");
    }
}
public class PP {
    public static void main(String args[]) {
        Animal p=new Pig();
        p.jump();
      Animal d=new Dog();
     d.jump;  //这样理解才叫多态,是这样的吗???望高手解惑
    }
}

解决方案 »

  1.   

    去看thinking in java它里面的多态是讲的最好的!
      

  2.   

    overload
    override找本书看看估计比大家几句话讲的清楚
      

  3.   

    看thinking in java也觉得好难理解的,,,,,
      

  4.   

    导演要拍戏,需要一只会  jump 的,于是你不管 阿猫阿狗,会 jump 就送过去就行了, 同样是 jump 但是 阿猫和阿狗的会有所不同,苏格兰牧羊犬可能与普通狗又不同,导演写剧本时不需要考虑这么多,只找共性叫抽象, 开拍了要实际的会 Jump 的, 这就叫多态 。
    楼主那 以前一直以来的  看法是错误的,你最开始说的是  重载 overload , 而且 overload 返回值不能作为 参考,
      

  5.   

    多态(polymorphism)是一个很动听的词.你可以想像一下, 一开始我们设计好类的继承关系, 然后我从最顶端的一个类发出一个命令, 下面的子类就会有各自不同的表现, 一个五彩缤纷的世界, 好美妙啊~~~~~~~~
      

  6.   

    多态你可以从字面来理解,就是一个对象有多种形态,也就是一个动物有多种的表现形式,其中,狗,猪,猫,等都是它的表现形式,这就是多态,还比如说一个相同函数名的函数提供了几种参数列表也可以说体现了不同的表现形式,也是多态.eg:public void f();和public void f(int a);
      

  7.   

    回复人: kingfish(八百里秦川@龙城异客) ( ) 信誉:115  2005-08-18 22:20:00  得分: 0  
     
     
       overload
    override找本书看看估计比大家几句话讲的清楚
      
     ++++++++++++++
    这是正解建议
    好好去看看thing in java
      

  8.   

    多态你可以从字面来理解,就是一个对象有多种形态,也就是一个动物有多种的表现形式,其中,狗,猪,猫,等都是它的表现形式,这就是多态,还比如说一个相同函数名的函数提供了几种参数列表也可以说体现了不同的表现形式,也是多态.eg:public void f();和public void f(int a);
      

  9.   

    其实Java中的多态并不完整,面向对象中的多态包括参数多态、包含多态、过载多态和强制多态,但是我看到的资料并没有对这几种多态做出具体的解释,我从字面中的理解是JAVA中的overload(重载)既参数多态,而override(重写)既过载多态,目前我所理解到的JAVA中的多态只包含overload和override楼主对多态的理解——在一个类里面,几个方法名相同,但参数不同,或者返回值不同,准确的说应该是overload,但是楼主写的例子不对,method1,method2,method3都是方法名,要体现它们的多态性则它们应该是一个名字,像这样:
    class ClassName{
      void method(int i){
        System.out.println(i);
      }
      void method(String s){
        System.out.println(s);
      }
      String method(String d){
        return d;
      }
    }
    但是这里面还是有一个问题,void method(String s)方法和String method(String d)方法恐怕也不能这么放在一起,因为你已经定义过了method(String s)这个方法,而编译器会认为method(String d)是重复定义method(String s)方法而楼主的同事的理解,应该是override至于List a=new ArrayList();
    和List b=new LinkList();
    这个准确的讲应该叫做向下转型,《thinking in java》把向下转型也放在了多态的那一章
      

  10.   

    overload多态,是函数名相同但参数的个数不同或参数的数据类型不同,但如果几个函数方法名相同且参数个数与类型也相同只是返回值不同这种情况不是多态.
      

  11.   

    hehe,自己慢慢体会,我原来也不清楚,现在不也应用自如了!这是面向对象最重要的概念了!
      

  12.   

    overload 
    override多态是不同类(当然有继承关系)之间相同的方法重载是同一个类中的同名方法(参数不同)
      

  13.   

    多态可以理解为当父类的句柄指向子类的时候,如果要调用父类和子类都有的方法时,在java中调用的是子类的方法,因为在java中用的是动态邦定,而在c++ is  not the  same,if you want to get the same result ,you should add "virtue" before the method .(there is something wrong with my keybord)
      

  14.   

    多态不是一个孤立的概念,要是没有继承,没有运行期绑定也就不能实现多态.
    简单说来,就一爸爸有两个孩子继承了他会跳舞的能力,一个跳现代舞,一个跳民族舞.
    而爸爸跳舞的方法叫DANCE(),两个孩子继承DANCE()这个方法,他们跳舞也叫DANCE(),
    然后别人用爸爸的原形实例化了两个孩子对象,然后叫这两个对象做DANCE()这个方法,而这两个对象一个会跳现代舞,一个会跳民族舞,这个就是多态吧.
      

  15.   

    这种说法在c++里体现的明显些,因为java不能多重继承
      

  16.   

    to jk88811(文哥) :重载也是一种多态!多态有四种类型。overload ,override是其中两种,java只实现了这两种多态
      

  17.   

    humanity(很健忘了) 说得不错
      

  18.   

    你同事说的是正确的动态要作的是对父类方法overwrite就是重写或者是覆盖。
    你所说的动态其实是overload即重载
      

  19.   

    多态可以理解为当父类的句柄指向子类的时候,如果要调用父类和子类都有的方法时,在java中调用的是子类的方法,因为在java中用的是动态邦定,而在c++ is  not the  same,if you want to get the same result ,you should add "virtue" before the method .(there is something wrong with my keybord)
      

  20.   

    多态在只有一个类的时候是体现不出来的,它只有在至少两个类而且它们之前存在继承关系时才会发生。
    如:
    class A{
        public void f(){ System.out.println("class A");};
    };class B extends A{
        public void f(){ System.out.println("class B");};
    };class C extends A{
        public void f(){ System.out.println("class C");};
    };public class D
    {
        public static void f(A obj)
        {
             obj.f();
         }
        public static void main(String args[])
        {
            A a = null;
            f(new A());
            f(new B());
            f(new C());
        }
    }看一下打印结果你就知道了。
    D中的f()参数类型是A,但是它同时可以接收B类和C类的对象,因为他们同时也是A类的(继承自A),就像男人和女人都是人一样,人就是A,男人女人分别是B和C。这里f()会根据对象不同自动选择执行哪一个类的f()方法。
    实际上这是一种动态绑定。通常我们写的程序都是静态绑定的,就像C,在编译时调用哪一个方法已经确定了,而动态绑定是在程序执行时才确定的。
      

  21.   

    首先你开始理解的多态是错误,你那些是“重载”这个概念的理解,但是你却把它带到“多态”的头上,而且“重载”是没有根据“返回值不同”可以区分的,就是说float f() 和int f()这两个方法不是重载,而且编译器不能区分。你同事的理解是正确的,一个父类对象的引用可以指向它本身的类和它的子类。而且知道程序运行时才知道具体指向的是那个类的对象,然后具体化这个对象。
      

  22.   

    可分为继承多态 和实现多态 我理解的也不是很深 继承多态是子类的对象赋值给其父类,实现多态的实现类的对象赋值给其接口吧。
      public class Persion{
         public void eat(){
         
         }
      }  public class Student extends Persion{
         public void doSomething(){
            Persion p = new Student();// 这里就是个继承多态了吧
            p.eat();
         }
      }