多态性 - 正确理解? (JAVA)

时间:2015-01-07 22:01:46

标签: java polymorphism

我一直在阅读有关多态的内容,并想问一下,如果这是多态性的正确例子:

接口:

public interface Language {
  public void talk();
}

继承它的两个不同的类:

public class Jimmy implements Language{
  public void talk(){
    System.out.println("Jimmy talks English");
  }
}

public class David implements Language{
  public void talk(){
    System.out.println("David talks Spanish");
  }
}

要运行的类:

public class RunProgram(){
  public static void main(String [] args){
    Jimmy j = new Jimmy();
    David d = new David();
    j.talk();
    d.talk();
  }
}

输出应为:

吉米说英语 大卫说西班牙语

这个想法是talk方法继承自接口,并且两个类(而不是对象)确定输出的确切含义,因此输出取决于您创建的对象并运行方法。对不起,如果我问一些可能很容易的事情,这个例子甚至可能不那么好,但我希望它可以说明我的想法。提前谢谢!

2 个答案:

答案 0 :(得分:4)

Jimmy j = new Jimmy();
David d = new David();
j.talk();
d.talk();

不,上述代码中没有涉及多态性。删除界面Language,代码甚至不会注意到。

在行动中演示多态的方法必须将接口作为变量的静态类型:

Language j = new Jimmy(), d = new David();
j.talk();
d.talk();

然而,当您涉及针对接口类型编写的方法时,会出现一个真正展示多态性作为有用语言特性的示例:

public void printTheTalk(String name, Language lang) {
   System.out.println(name + " says " + lang.talk());
}

现在您可以看到该方法如何不知道对象的具体类型是否存在,但它可以与它们一起使用。

答案 1 :(得分:1)

这很接近。多态的要点是你可以引用一个接口或超类,它不关心对象的具体类(JimmyDavid)。

如果您要使用

Language j = new Jimmy();
Language d = new David();

然后这证明了多态性。变量jd只关心它们是Language,但talk()的具体实现稍后会被调用。