章
目
录
Java 中的多态性是指创建在不同编程上下文中表现不同的成员函数或字段的能力。它与继承、抽象和封装一样,是面向对象编程的主要特性之一。
1. 什么是多态性?
多态性允许一个类在不同的上下文中表现出不同的行为。我们可以将多态性与一个接口具有多个实现联系起来。虽然接口定义的约定保持不变,但每个类对约定的实现不同,从而展现出不同的行为。这就是多态性行为。
例如,多态性还可以指的是子类的实例,具有超类的引用变量。
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. 编译时多态性
由于含义是隐式的,在编译时多态性中,控制流是在编译时本身决定的。它是通过方法重载来实现的。
在方法重载中,一个对象可以有两个或多个同名的方法,但方法参数不同,例如:
- 参数个数不同
- 方法参数类型不同
例如,在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
类及其专门的子类,例如Cat
和Dog
。这些子类将覆盖类提供的默认行为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()
方法时,调用的方法取决于运行时创建的实际实例的类型。
Animal cat = new Cat();
cat.makeNoise(); //Prints Meowoo
Animal dog = new Dog();
dog.makeNoise(); //Prints Bark
三、结论
- 多态性是创建具有多种形式的变量、函数或对象的能力。
- 在java中,多态分为方法重载和方法重写。
- 还有另一个术语叫作操作符重载(operator overloading)。例如,“+”操作符可以用于添加两个整数,也可以用于连接两个子字符串。在 Java 中,这是唯一可用的操作符重载支持,而且你无法在 Java 中定义自己的自定义操作符重载。
文章目录 前言 第1章 Java语言基础 第2章 流程控制语句 第3章 面向对象编程 第4章 Java 字符 […]