Java中支持多态的方法重载
Posted
技术标签:
【中文标题】Java中支持多态的方法重载【英文标题】:Method Overloading supporting Polymorphism in Java 【发布时间】:2014-11-08 16:19:45 【问题描述】:方法重载支持多态性,因为它是 Java 实现单接口、多方法范式的一种方式。
为了理解如何,我考虑了以下几点。在不支持方法重载的语言中, 每个方法都必须有一个唯一的名称。但是,我经常会想从本质上实现 不同类型的数据使用相同的方法。考虑绝对值函数。在语言中 不支持重载的,这个函数通常有3个或更多版本,每个都有 一个稍微不同的名字。例如在 C 中,函数 abs() 返回一个绝对值 整数,labs()返回长整数的绝对值,fabs()返回绝对值 的浮点值。由于 C 不支持重载,因此每个函数都必须有自己的 自己的名字,即使所有 3 个函数基本上做同样的事情。这使得情况 从概念上讲,比实际情况更复杂。虽然每个函数的底层概念 是一样的,我会记住3个名字。这种情况在 Java 中不会发生,因为每个 绝对值方法可以使用相同的名称。事实上,Java 的标准类库包括一个 绝对值方法,称为 abs()。这个方法被 Java 的 Math 类重载来处理所有 数字类型。 Java 根据参数类型确定调用哪个版本的 abs()。
没有规定重载方法必须相互关联。然而从一个 从文体上看,方法重载隐含着一种关系。因此,虽然我可以使用 重载无关方法的同名,我想我不应该。例如,我可以使用 命名 sqr 来创建返回整数平方和浮点数平方根的方法 点值。但这两种操作是根本不同的。在中应用方法重载 这种方式违背了它的初衷。
那么在实践中,我应该只重载密切相关的操作吗?除此以外还有其他使用重载方法的理由吗?
【问题讨论】:
您应该在需要时重载(即,当它会增加代码的维护者/读者的清晰度时)。 所以我需要更多地考虑方法名称,而不是业务逻辑:D 重载用于对不同类别的数据进行相同类型的处理 在您的示例中,您建议将方法名称sqr
用于平方根和平方根。这不是重载的有效应用程序,尽管在语法上它可以工作
@CocoNess:我没有建议过。
【参考方案1】:
据我所知,方法重载通常仅用于为方法提供合理的默认参数,以简化 API。当您或其他用户可能不需要您的程序/库提供的所有灵活性时,它可能具有一些优势。
正如您自己指出的,另一个有效的用途是 Java 中的原始数据类型。
void doThis()
doThis(true);
void doThis(boolean firstArg)
doThis(firstArg, 1);
void doThis(int secondArg)
doThis(true, secondArg);
// actual logic using several parameters
void doThis(boolean firstArg, int secondArg)
if (firstArg)
System.out.println(secondArg+1);
else
System.out.println(secondArg-1);
当然,这是一个无意义的示例,但是当您的方法需要 PrintStream 时,它会变得更加明显。您可以在重载方法中提供 System.out
作为默认值,但您的逻辑应该在可以提供任何 PrintStream 的方法中。对完全不同的用途或输出使用相同的方法名称是一个很大的禁忌,它很可能会激怒任何使用您的代码的人(包括 Future You:http://xkcd.com/1421/)。
【讨论】:
以上是关于Java中支持多态的方法重载的主要内容,如果未能解决你的问题,请参考以下文章