Java 多态示例

Java 多态示例

原文: https://howtodoinjava.com/oops/what-is-polymorphism-in-java/

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

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

“子类型多态在面向对象编程的上下文中通常简称为多态,是一种创建具有多种形式的变量,函数或对象的能力。” – 维基百科

推荐读物: Java 抽象与封装

Java 中的多态

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

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

在此,StringObject类别的子类别。 这是多态的基本示例。

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

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

编译时多态(静态绑定或方法重载)

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

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

参数类型

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

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){..}

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

参数计数

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

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

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

运行时多态(动态绑定或方法覆盖)

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

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

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()方法,具体取决于在运行时创建的实际实例的类型,例如

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 中拥有自己的自定义定义的运算符重载。

学习愉快!