原文: https://beginnersbook.com/2013/03/polymorphism-in-java/

多态是 OOP 特征之一,它允许我们以不同的方式执行单个动作。例如,假设我们有一个Animal类,它有一个方法sound()。由于这是一个泛型类,所以我们不能给它一个实现,如:RoarMeowOink等。我们不得不给出一个通用的消息。

  1. public class Animal{
  2. ...
  3. public void sound(){
  4. System.out.println("Animal is making a sound");
  5. }
  6. }

现在假设我们动物类的两个子类:HorseCat扩展(参见继承Animal类。我们可以提供相同的方法实现,如下所示:

  1. public class Horse extends Animal{
  2. ...
  3. @Override
  4. public void sound(){
  5. System.out.println("Neigh");
  6. }
  7. }

  1. public class Cat extends Animal{
  2. ...
  3. @Override
  4. public void sound(){
  5. System.out.println("Meow");
  6. }
  7. }

正如您所看到的那样,尽管我们对所有子类sound()都有共同的操作,但是有不同的方法来执行相同的操作。这是多态的完美示例(允许我们以不同方式执行单个操作的功能)。仅调用泛型sound()方法没有任何意义,因为每个Animal都有不同的声音。因此,我们可以说该方法执行的操作基于对象的类型。

什么是编程中的多态?

多态是一种方法根据它所作用的对象做不同事物的能力。换句话说,多态允许您定义一个接口并具有多个实现。正如我们在上面的例子中看到的那样,我们已经定义了方法sound()并且在不同的 2 个子类中具有它的多个实现。
将在运行时确定将调用哪个sound()方法,因此我们上面给出的示例是运行时多态示例

多态的类型和方法重载&覆盖在单独的教程中。你可以在这里引用它们:

  1. Java 中的方法重载 - 这是编译时间(或静态多态)的一个例子
  2. Java 中的方法覆盖 - 这是运行时间(或动态多态)的一个例子
  3. 多态的类型 - 运行时和编译时间 - 这是我们的下一个教程,我们详细介绍了多态的类型。在推荐这个主题之前,我会建议你通过方法重载和覆盖。

让我们写下它的完整代码:

例 1:Java 中的多态

运行时多态示例:

Animal.java

  1. public class Animal{
  2. public void sound(){
  3. System.out.println("Animal is making a sound");
  4. }
  5. }

Horse.java

  1. class Horse extends Animal{
  2. @Override
  3. public void sound(){
  4. System.out.println("Neigh");
  5. }
  6. public static void main(String args[]){
  7. Animal obj = new Horse();
  8. obj.sound();
  9. }
  10. }

输出:

  1. Neigh

Cat.java

  1. public class Cat extends Animal{
  2. @Override
  3. public void sound(){
  4. System.out.println("Meow");
  5. }
  6. public static void main(String args[]){
  7. Animal obj = new Cat();
  8. obj.sound();
  9. }
  10. }

输出:

  1. Meow

例 2:编译时多态

方法重载另一方面是编译时多态示例。

  1. class Overload
  2. {
  3. void demo (int a)
  4. {
  5. System.out.println ("a: " + a);
  6. }
  7. void demo (int a, int b)
  8. {
  9. System.out.println ("a and b: " + a + "," + b);
  10. }
  11. double demo(double a) {
  12. System.out.println("double a: " + a);
  13. return a*a;
  14. }
  15. }
  16. class MethodOverloading
  17. {
  18. public static void main (String args [])
  19. {
  20. Overload Obj = new Overload();
  21. double result;
  22. Obj .demo(10);
  23. Obj .demo(10, 20);
  24. result = Obj .demo(5.5);
  25. System.out.println("O/P : " + result);
  26. }
  27. }

这里方法demo()重载 3 次:第一种方法有 1 个int参数,第二种方法有 2 个int参数,第三种方法有double参数。要调用哪个方法取决于调用方法时传递的参数。这发生在编译时而不是运行时,因此这种类型的多态称为编译时多态。

输出:

  1. a: 10
  2. a and b: 10,20
  3. double a: 5.5
  4. O/P : 30.25