💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
# 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 中拥有自己的自定义定义的运算符重载。 学习愉快!