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

Polymorphism - correct understood? (JAVA)

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

接口:

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 方法是从接口继承的,并且这两个类(而不是对象)确定输出的确切内容,因此输出取决于您创建和运行该方法的对象。对不起,如果我问的问题可能很简单,这个例子可能甚至不是那么好,但我希望它能说明我的想法。提前致谢!

这很接近。多态性的要点是你可以引用一个接口或 superclass,它并不关心对象真正是哪个具体 class(JimmyDavid)是。

如果你要使用

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

那么这就证明了多态性。变量jd只关心是Languagetalk()的具体实现在后面调用

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());
}

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