Java 多态性有什么用?(爪哇)

Java 多态性有什么用?(爪哇),java,polymorphism,Java,Polymorphism,可能重复: 我目前正在学习Java中的多态性,我无法理解它是如何有用的。我经常看到有人说,如果你想做一个圆或正方形,那么你就要做一个名为“shape”的超类,这样你就可以调用单独的圆和正方形类,但为什么不创建单独的对象呢?如果你的圆和正方形有一个render()方法,那么有人可以实现如下对象渲染器: class Renderer { Canvas c; public Renderer(Canvas c) { this.c = c; } pub

可能重复:


我目前正在学习Java中的多态性,我无法理解它是如何有用的。我经常看到有人说,如果你想做一个圆或正方形,那么你就要做一个名为“shape”的超类,这样你就可以调用单独的圆和正方形类,但为什么不创建单独的对象呢?

如果你的圆和正方形有一个render()方法,那么有人可以实现如下对象渲染器:

class Renderer {
    Canvas c;

    public Renderer(Canvas c) {
        this.c = c;
    }

    public void draw(Shape shape) {
        shape.render(c);
    }
}
因此,渲染器可以在任何画布(或画布的子类)上绘制,也可以在您提供的任何形状上绘制

不同的是,如果没有多态性,您必须编写如下内容:

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

那么你可能会想,如果我有不同类型的画布呢?纸帆布、木帆布、布帆布等。。。渲染器和形状仍然可以使用抽象
画布
与该对象交互,而不知道实现细节以及它们可能被绘制到的画布的所有可能类型。

在生物学中,多态性是生物体或物种可以具有许多不同形式或阶段的能力。在面向对象编程中。编程也有同样的概念,一个对象可以以多种形式存在

假设您有这个Employee类

public class Employee{
   public int computeSalary(){
       //How would you compute the salary of an average employee
    }
}
接下来是一个名为BasePlusCommission Employee的子类

 public class BasePlusCommissionEmployee extends Employee{
          public int computeSalary(){
               //Commision employee salary computation + Base Employee salary computation
            }
}
你有一位委员雇员

 public class CommissionEmployee extends Employee{
              public int computeSalary(){
                   //Commision employee salary computation
                }
    }
现在,我们想以多态的方式处理这个函数的计算。我们能做到

public void computeEmployeeSalary(Employee emp){
     emp.computeSalary();
}
此方法将接收任何类型的Employee对象(这意味着我们可以传递Employee对象的子类)。一旦您传递了它,它将计算传递的employee(参数),并调用它的computeSalary()

即使您传递了BasePlusCommission员工或CommissionEmployee,它也会根据其实现计算其工资,这要归功于动态方法查找

另一个更清楚的解释。您可以创建一组或一组员工

Employee[] employees = { new BasePlusComissionEmployee(), new CommissionEmployee,new Employee()};
你想让这些对象计算他们的薪水。您可以像这样多态地处理它们的计算

for(int i = 0; i < employees.length;i++){
    employees[i].computeSalary();
}
for(int i=0;i

请注意,即使数组声明是Employee,它们的
computeSalary()
实现也会根据
computeSalary()的每个类实现而有所不同 

这已经被问了很多次了,请考虑使用搜索。就像我说的,我不理解其他答案。其他答案会让你困惑吗?如果你不告诉我们,我们怎么知道该说什么?如果你拒绝澄清你的问题,怎样才能避免重复之前已经说过的话?我知道lua,但随着我进入这个话题,我不明白,因为有其他方法可以做完全相同的事情,但人们说这是非常重要的。在生物学中,多态性是一个有机体或物种的能力,可以有许多不同的形式或阶段。在面向对象编程中。编程也有同样的概念,一个有多种形式的反对。好吧,这是有道理的。但每个形状的单独方法必须在单独的类中。那么为什么不创建一个包含所有方法的类,然后调用该类中的每个方法呢?@nPwn-自己试试吧。。。看看会发生什么。你能保持封装吗?当您决定实现(比如)一个
pentage
类时,需要更改多少类?