我读过许多关于堆栈溢出的关于多态性的问题。这个问题是一个构造我的想法的问题,因为我已经阅读和研究了很多,以至于我有很多想法。我需要评论和批评我的想法多态。我将使用Java来演示我的想法。
多态性是指在谈论某个实体时具有不同形式的特征。可以通过以下方式实现这一目标:
override
某些方法的行为。例如:
类System.out.println(“我正在使用形状对象绘图”);}类矩形扩展形状{ void (){ //此方法是覆盖System.out.println(“我使用矩形对象绘图”);}}在这里实现多态性的方法是,如果在运行时将draw()
与Rectangle
的实例一起使用,则将调用Rectangle
类中的draw()
实现。
由于矩形是形状,多态是这样一个事实,即draw()
采取了不同的形式,这取决于调用它的上下文。这也被称为遗传多态性。
在Java中,操作符重载的一个例子是+操作符,根据操作数的不同,+执行特定的功能。如果+被应用于字符串,则将它们连接起来。如果它被应用于整数,它会进行算术加法。
现在,方法重载是否也是实现多态性的一种方法?在我对多态的理解中,我错过了什么?
发布于 2015-07-06 02:08:21
多态性一词的意思是“多种形式”。
您给出的两个示例是绝对有效的多态示例:
由于后期绑定,将调用的实际方法是在运行时决定的。
实际上,这两个示例非常相似,它们都是子类型的示例,这是您在Java中实现多态性的方式。
注意,在Java中需要子类型,因为Java是一种静态类型语言。在Smalltalk这样的动态类型化语言中,即使对象的类不属于同一个类层次结构,拥有不同的“绘制”方法实现也足够了。
现在,关于方法重载:确实,如果您定义了接收不同参数类型的方法的多个版本,那么该方法也会有“多个表单”。
不同的是,在这种情况下,--在编译时中决定调用哪种方法。这就是为什么很多人将方法重载称为静态多态。
然而,由于它是静态的,并且基本上可以通过为方法指定不同的名称并根据使用的类型决定调用哪一个来实现相同的事情,许多人还会说方法重载实际上不是多态。
我认为这基本上取决于您想要使用的“多态性”的定义,但我希望上面的解释有助于澄清差异。
发布于 2015-07-06 00:52:19
我认为您正在与java中发生的其他事情混淆。在其他编程语言(如C++ )中,操作符重载是一种多态形式,但是在java中,操作符重载是in和booleans (也是String)和扩展基本java.lang.Object的所有其他语言之间的区别。语言设计人员决定不让操作符重载类,因为它可能非常混乱。因此,在Java中没有有效的操作符多态性,因为除了toString()方法之外,您不能定义自己的运算符或覆盖其他操作符,但在我看来,这确实是一个接口。我认为您不能说+(用于字符串)运算符在java中是操作符重载的一个例子,即使使用字符串,它也是正在调用的toString()方法,在我看来,这并不是真正的操作符重载,因为运算符只有在应用有关执行操作顺序的规则时才有这个术语。如果您只有一个操作符,那么将字符串连接在一起的+就没有应用到计算顺序的规则,因此它是一个语法问题。您有用于+、-和浮动的运算符,但是不能重载它们,所以这不是多态。
发布于 2015-07-06 00:38:42
多态性的行为方式与您已经解释过的一样,但并不是实现覆盖先前定义的方法的新方法的实际操作。多态更多的是一个抽象的概念。一般而言:
多态是指对象具有多种形式的能力。OOP中最常见的多态性用法发生在父类引用用于引用子类对象时。
更多信息也可以找到这里。
https://stackoverflow.com/questions/31236388
复制相似问题