Java 中的多态性

IT 文章2年前 (2023)发布 小编
0 0 0

Java 中的多态性是指创建在不同编程上下文中表现不同的成员函数或字段的能力。它与继承抽象和封装一样,是面向对象编程的主要特性之一。

1. 什么是多态性?

多态性允许一个类在不同的上下文中表现出不同的行为。我们可以将多态性与一个接口具有多个实现联系起来。虽然接口定义的约定保持不变,但每个类对约定的实现不同,从而展现出不同的行为。这就是多态性行为。

例如,多态性还可以指的是子类的实例,具有超类的引用变量。

ad

程序员导航

优网导航旗下整合全网优质开发资源,一站式IT编程学习与工具大全网站

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

Object o = new String();
Object o = new Integer();

这里,String和Integer类是Object类的子类。

2. 多态性的类型

在Java语言中,多态本质上被认为有两种形式:

  • 编译时多态(静态绑定或方法重载)
  • 运行时多态性(动态绑定或方法重写)

这里,重要的是要了解这些划分是特定于 java 的。在软件工程的背景下,还有其他形式的多态性也适用于不同的语言,但对于java来说,主要考虑这两种。

2.1. 编译时多态性

由于含义是隐式的,在编译时多态性中,控制流是在编译时本身决定的。它是通过方法重载来实现的。

ad

AI 工具导航

优网导航旗下AI工具导航,精选全球千款优质 AI 工具集

在方法重载中,一个对象可以有两个或多个同名的方法,但方法参数不同,例如:

  • 参数个数不同
  • 方法参数类型不同

例如,在Calculator类中,我们可以有多个具有不同参数类型的方法:

public class Calculator {

  public Integer sum(Integer a, Integer b) {
    return a + b;
  }

  public Float sum(Float a, Float b) {
    return a + b;
  }

  public Double sum(Double a, Double b) {
    return a + b;
  }
}

通过上面的类定义,当我们在程序中调用sum()方法时,编译器根据参数类型仅在编译时决定调用哪个方法,并生成相应的字节码。这称为编译时多态性。

Calculator calc = new Calculator();

Integer sum1 = calc.sum(1 ,2);
Float sum2 = calc.sum(1f ,2f);
Double sum3 = calc.sum(1d ,2d);

2.2. 运行时多态性

当我们将一个类扩展到子类时,运行时多态性本质上是指方法重写。在运行时多态中,调用哪个方法是由运行时根据子类的实际实例决定的。

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

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()方法时,调用的方法取决于运行时创建的实际实例的类型。

ad

免费在线工具导航

优网导航旗下整合全网优质免费、免注册的在线工具导航大全

Animal cat = new Cat();
cat.makeNoise(); //Prints Meowoo

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

三、结论

  • 多态性是创建具有多种形式的变量、函数或对象的能力。
  • 在java中,多态分为方法重载和方法重写。
  • 还有另一个术语叫作操作符重载(operator overloading)。例如,“+”操作符可以用于添加两个整数,也可以用于连接两个子字符串。在 Java 中,这是唯一可用的操作符重载支持,而且你无法在 Java 中定义自己的自定义操作符重载。

[course ids=7934]

© 版权声明

相关文章

暂无评论

暂无评论...