多态性(Polymorphism)
是指具备许多不同形态或者能够承担多种形式的状态。因此,一个形状可以采用多种不同的形式,比如三角形或圆形。这些形式将会共享一些属性,而且在编码和使用时也是如此。举个更形象的例子,一个人可以拥有男性和女性两种形式。
public abstract class Person {
private String name;
private int age;
//additional code - functionalities that children classes share
}
public class Male extends Person {
//fields and functionalities that males only have
}
public class Female extends Person {
//fields and functionalities that females only have
}
然后,您可以通过动态绑定创建所需的性别:
Person male = new Male();
Person female = new Female();
多态意味着一个对象可以具有多种形式。你可以说 Shape a = new Triangle(),因为三角形是一种形状(Triangle扩展了Shape)。你也可以说 Shape a = new Circle(),因为圆是一种形状(Circle扩展了Shape)。在你的示例的第一行中,JVM将从Triangle类调用draw()方法。在第二行中,它将调用在Circle类中定义的draw()方法,同时使用Shape引用!
abstract class Shape {
public abstract void draw();
}
class Triangle extends Shape {
@Override
public void draw() {
System.out.println("Triangle");
}
}
class Circle extends Shape {
@Override
public void draw() {
System.out.println("Circle draw");
}
}
在Java中编写多态结构的方法有几种。多态性简单来说就是“创建一个变量、函数或对象,使其具有多种形式的能力。”
它之所以是多态的,是因为父类Shape中的方法draw()被多个子类Triangle和Circle重写了。因此,draw()有不止一种形式:即圆形和三角形形式。
请参阅http://howtodoinjava.com/2013/07/15/what-is-polymorphism-in-java/。
三角形和圆形都是从Shape类继承而来的。Shape类可以持有子类的对象,因此多态性存在。你可以这样说:Triangle t = new Triangle(); 和 Circle c = new Circle();
但是在这里,你有一个超类持有子类对象Shape s = new Circle(); 多态性-具有多种形式。
一开始不要过于技术化,尝试从意义上理解。在面向对象编程中,多态的含义是对象具有不同的行为能力。现在让我们思考一下方法重载如何表示多态。
方法重载就是多态
在面向对象编程中,方法代表一种行为。使用Java中的方法重载技术,您可以创建一个具有相同名称但参数列表不同的方法,现在让我们开始思考...相同的名称意味着-->相同的行为,但我们知道即使名称相似,行为也不完全相同...简单来说就是多态。
例如:您在人类中有一个吃饭的方法,现在您创建了另一个带有不同参数列表的吃饭方法,根据调用哪个方法,期望的行为会发生变化。
方法覆盖就是多态
那么方法覆盖如何表示多态?让我们试着弄清楚这一点。在方法覆盖中,您覆盖了在超类中定义的方法。
例如:人类有一个吃饭的方法,现在您创建了一个超级人类类,它是人类的子类,然后覆盖了吃饭方法。
所以我们知道超人也有吃的能力,但是不同于过载,但现在我们面临一个展示多态性的问题。为什么呢?因为如果你创建一个人类实例,那么就只有一个方法,所以没有多态行为。同样,如果你创建一个超人实例,那么也只有一个方法和一个预期行为,所以也没有多态性。这就是我们如何演示多态性的方式。
Human a = new Human();
a.eat();
Human b = new SuperHuman();
b.eat();
我们不能仅仅通过观察左侧就说出哪个方法会产生哪个输出,因为“a”和“b”都是Human类型,所以编译器无法确定a.eat()和b.eat()的输出结果,直到代码实际运行,因此它是多态的。
Shape
是超类。 - Shahar