# Java 多态示例

> 原文： [https://howtodoinjava.com/oops/what-is-polymorphism-in-java/](https://howtodoinjava.com/oops/what-is-polymorphism-in-java/)

简而言之，多态是一种能力，通过这种能力，我们**可以创建在不同程序环境下表现不同的函数或参考变量**。

**多态**与继承，抽象和封装一样，是面向对象编程的主要组成部分之一。

“子类型多态在面向对象编程的上下文中通常简称为多态，是一种创建具有多种形式的变量，函数或对象的能力。” – [维基百科](https://en.wikipedia.org/wiki/Polymorphism_in_object-oriented_programming)

> 推荐读物： [Java 抽象与封装](//howtodoinjava.com/object-oriented/encapsulation-in-java-and-its-relation-with-abstraction/ "Encapsulation in java and its relation with abstraction")。

## Java 中的多态

多态的一个例子是使用超类的引用变量引用子类的实例。 例如

```java
Object o = new Object(); //o can hold the reference of any subtype
Object o = new String();
Object o = new Integer();
```

在此，`String`是`Object`类别的子类别。 这是多态的基本*示例。*

在 Java 语言中，多态本质上被认为是两个版本。

1.  编译时多态（静态绑定或方法重载）
2.  运行时多态（动态绑定或方法覆盖）

## 编译时多态（静态绑定或方法重载）

由于含义是隐式的，因此它用于编写程序，以使**控制流由编译时间**本身决定。 使用方法重载实现。

在方法重载中，一个对象可以具有两个或更多个具有相同名称的方法，而它们的方法参数不同。 这些参数可能在两个基础上有所不同：

#### 参数类型

方法参数的类型可以不同。 例如`java.util.Math.max()`函数具有以下版本：

```java
public static double Math.max(double a, double b){..}
public static float Math.max(float a, float b){..}
public static int Math.max(int a, int b){..}
public static long Math.max(long a, long b){..}
```

实际调用的方法是根据传递给程序中函数的参数在编译时决定的。

#### 参数计数

接受不同数量参数的函数。 例如在员工管理应用程序中，工厂可以采用以下方法：

```java
EmployeeFactory.create(String firstName, String lastName){...}
EmployeeFactory.create(Integer id, String firstName, String lastName){...}
```

两种方法都具有相同的名称`create`，但是实际调用的方法将基于程序中传递的参数。

## 运行时多态（动态绑定或方法覆盖）

**运行时多态基本上被称为*方法覆盖*。** 方法覆盖是在程序中实现继承时获得的特性。

一个简单的例子可以来自现实世界，例如动物。 应用程序可以具有`Animal`类，以及其专门的子类，例如`Cat`和`Dog`。 这些子类将覆盖`Animal`类提供的默认行为及其某些特定行为。

```java
public class Animal {
	public void makeNoise()
	{
		System.out.println("Some sound");
	}
}

class Dog extends Animal{
	public void makeNoise()
	{
		System.out.println("Bark");
	}
}

class Cat extends Animal{
	public void makeNoise()
	{
		System.out.println("Meawoo");
	}
}

```

现在将调用哪个`makeNoise()`方法，具体取决于在运行时创建的实际实例的类型，例如

```java
public class Demo
{
	public static void main(String[] args) {
		Animal a1 = new Cat();
		a1.makeNoise(); //Prints Meowoo

		Animal a2 = new Dog();
		a2.makeNoise(); //Prints Bark
	}
}

```

在这里，重要的是要了解这些划分是特定于 java 的。 在软件工程的上下文中，还有其他形式的多态性也适用于不同的语言，但是对于 Java，主要考虑这些形式。

## 重要事项

1.  多态是创建具有多种形式的变量，函数或对象的能力。
2.  在 Java 中，多态分为两部分：方法重载和方法重载。
3.  有人可能会说方法重载不是多态。 那么，编译时“多态”一词是什么意思呢？
4.  还有另一个术语运算符重载，例如`+`运算符可用于添加两个整数以及连接两个子字符串。 好吧，这是 Java 中对运算符重载的唯一可用支持，并且您不能在 Java 中拥有自己的自定义定义的运算符重载。

学习愉快！