我正在看这个video,并在2.52时间给出了一个例子。它说Shape
可以是Interface
或抽象类,还有其他2个类,即Triangle
和Circle
。 Shape
正在进行方法绘制。
现在说:
Shape shape=new Triangle();
shape.draw();
Shape shape=new Circle();
shape.draw();
并声称它是多态性。
但据我所知,多态性可以在方法重载或方法覆盖中完成,如article中所述。
有人可以告诉一下,视频中给出的例子真的是多态吗?提前感谢任何帮助。
答案 0 :(得分:0)
有几种方法可以在Java中编写多态结构。多态性只是“创建变量,函数或具有多种形式的对象的能力。”
它是多态的,因为方法draw(),显然在父类Shape中,也被多个子类重写:Triangle和Circle。因此draw()有多种形式:圆形和三角形。
请参阅http://howtodoinjava.com/2013/07/15/what-is-polymorphism-in-java/
答案 1 :(得分:0)
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();
要回答你的问题,是的,提供给你的例子确实是多态性。
答案 2 :(得分:0)
三角形和圆形都是从Shape类继承的。 Shape类可以保存子类的对象。所以多态性就在那里。你可以说Triangle t = new Triangle();和圆圈c =新圆圈();
但是这里你有超类持有子类对象Shape s = new Circle();多态 - 具有多种形式,
答案 3 :(得分:0)
多态性意味着一个对象可以采用多种形式。你可以说 形状a =新的三角形()因为三角形IS-A形状(三角形扩展形状)。你也可以说Shape a = new Circle()因为一个圆形是一个形状(圆形扩展形状)。在示例的第一行中,JVM将从Triangle类调用draw()方法。在第二行中,它将使用Shape引用调用Circle类中定义的draw()方法!
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");
}
}
答案 4 :(得分:0)
一开始不要太技术化,试着从意义上理解。 OOP中多态的含义是对象表现不同的能力。现在让我们想一想方法重载如何表示多态
方法重载是多态的
在OOP方法中表示一种行为,在java中使用方法重载技术你可以创建一个方法,它具有相同的名称但不同的参数列表,现在让我们开始思考..同名意味着 - &gt ;相同的行为,但我们知道即使名称是相似的行为不完全相同..简单的单词多态
示例:您现在在人类课程中使用eat方法创建另一个具有不同参数列表的eat方法,根据您调用预期行为更改的方法。
方法覆盖是多态性
那么方法覆盖是多态的?让我们尝试解决这个问题。 在方法覆盖中,您覆盖在超类中定义的方法。
ex:human有一个eat方法,现在你创建一个SuperHuman类,它是人类的一个子类,然后覆盖eat方法
所以我们知道SuperHuman也有吃但不同的能力,但现在不像重载这里我们有一个展示多态性的问题。为什么因为如果你创建了一个人类实例,那么就有一种方法,所以没有多态行为。就像你创建一个SuperHuman实例一样,那么有一个方法和一个预期的行为,所以没有多态性。所以这就是我们演示的方式
Human a = new Human();
a.eat();
Human b = new SuperHuman();
b.eat();
我们不能简单地通过仅查看左侧来说明哪个方法输出哪个,因为“a”和“b”都是人类类型,因此编译器无法确定a.eat的输出是什么( )和b.eat()直到代码实际运行,因此它是多态的。