可能的重复:
什么是多态性?
我目前正在学习 Java 中的多态性,但我无法理解它有什么用处。我一直看到人们说如果你想制作一个圆形或方形,那么你会创建一个名为“shape”的超类,这样你就可以调用单独的圆形和方形类,但为什么不创建单独的对象呢?
可能的重复:
什么是多态性?
我目前正在学习 Java 中的多态性,但我无法理解它有什么用处。我一直看到人们说如果你想制作一个圆形或方形,那么你会创建一个名为“shape”的超类,这样你就可以调用单独的圆形和方形类,但为什么不创建单独的对象呢?
如果你的圆形和方形有一个方法render(),那么有人可以像这样实现一个对象渲染器:
class Renderer {
Canvas c;
public Renderer(Canvas c) {
this.c = c;
}
public void draw(Shape shape) {
shape.render(c);
}
}
因此渲染器可以在任何 Canvas(或 Canvas 的子类)、您可以提供的任何 Shape 上绘制。
不同的是-没有多态性-您必须编写如下内容:
class Renderer {
Canvas c;
public Renderer(Canvas c) {
this.c = c;
}
public void draw(Circle circle) {
circle.render(c);
}
public void draw(Square square) {
square.render(c);
}
public void draw(Triangle square) {
triangle.render(c);
}
// and so on...
}
然后你可能会想,如果我有不同类型的画布怎么办?PaperCanvas、WoodCanvas、ClothCanvas 等等……渲染器和 Shapes 仍然可以使用抽象Canvas
来与该对象进行交互,而无需了解实现细节以及它们可能被绘制到的所有可能的 Canvas 类型。
在生物学中,多态性是生物体或物种可以具有许多不同形式或阶段的能力。在面向对象编程中。编程也有同样的概念,一个对象可以以多种形式存在。
假设您有这个 Employee 类。
public class Employee{
public int computeSalary(){
//How would you compute the salary of an average employee
}
}
接下来是您有一个名为 BasePlusComission Employee 的子类
public class BasePlusCommissionEmployee extends Employee{
public int computeSalary(){
//Commision employee salary computation + Base Employee salary computation
}
}
你有这个 CommissionEmployee
public class CommissionEmployee extends Employee{
public int computeSalary(){
//Commision employee salary computation
}
}
现在,我们要多态地处理这个雇员的计算。我们可以做的
public void computeEmployeeSalary(Employee emp){
emp.computeSalary();
}
此方法将接收任何类型的 Employee 对象(这意味着我们可以传递 Employee 对象的子类)。一旦你通过了它,它将计算传递的员工(参数),并且它的 computeSalary() 将被调用,
即使您传递了 BasePlusCommission Employee 或 CommissionEmployee,它也会根据其实现计算其薪水,这要归功于 Dynamic 方法查找。
另一个更清晰的解释。您可以创建一组或一组员工。
Employee[] employees = { new BasePlusComissionEmployee(), new CommissionEmployee,new Employee()};
你想让这些对象计算他们的薪水。你可以像这样多态地处理他们的计算
for(int i = 0; i < employees.length;i++){
employees[i].computeSalary();
}
请注意,即使数组声明是 Employee,它们的computeSalary()
实现也会根据computeSalary();
员工数组的每个对象的每个类实现而有所不同