Java教程23—Java中多态 编译时多态 运行时多态

Java的多态

多态性是面向对象程序设计功能之一,允许我们以不同的方式执行单个操作。
例如,假设我们有一个Animal有方法的类sound()。
因为这是一个通用的类,所以我们不能给它一个实现,如:Roar,Meow,Oink等。
我们不得不给出一个通用的消息。

public class Animal{
   ...
    public void sound(){
        System.out.println("Animal is making a sound");
    }
}

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

public class Horse extends Animal{
...
    @Override
    public void sound(){
        System.out.println("Neigh");
    }
}

以及

public class Cat extends Animal{
...
    @Override
    public void sound(){
        System.out.println("Meow");
    }
}

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


什么是编程中的多态?

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

方法重载和覆盖在前面的的教程中介绍过:

  • 用方法重载 -这是编译时(或静态多态性)的例子
  • 方法覆盖 -这是运行时间(或动态的多态性)的例子

多态的类型- 运行时多态和编译时多态

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

运行时多态性示例

//Animal.java
public class Animal{
    public void sound(){
        System.out.println("Animal is making a sound");
    }
}

//Horse.java
class Horse extends Animal{
    @Override
    public void sound(){
        System.out.println("Neigh");
    }
    public static void main(String args[]){
        Animal obj = new Horse();
        obj.sound();
    }
}

Output:
        Neigh

例2:编译时多态性
方法重载是另一种编译时多态性的例子。

class Overload
{
    void demo (int a)
    {
        System.out.println ("a: " + a);
    }
    void demo (int a, int b)
    {
        System.out.println ("a and b: " + a + "," + b);
    }
    double demo(double a) {
        System.out.println("double a: " + a);
        return a*a;
    }
}

class MethodOverloading
{
    public static void main (String args [])
    {
        Overload Obj = new Overload();
        double result;
        Obj .demo(10);
        Obj .demo(10, 20);
        result = Obj .demo(5.5);
        System.out.println("O/P : " + result);
    }
}

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


原文地址:

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

猜你喜欢

转载自blog.csdn.net/y396397735/article/details/82559955