方法重载支持多态,因为它是Java实现单接口,多种方法范例的一种方式。
要了解如何,我考虑以下内容。在不支持方法重载的语言中, 每个方法都必须给出一个唯一的名称。但是,我经常要实施基本上 对于不同类型的数据使用相同的方法。考虑绝对值函数。在语言中 那些不支持重载的,通常有3个或更多版本的这个函数,每个都有 一个略有不同的名字。例如,在C中,函数abs()返回an的绝对值 integer,labs()返回长整数的绝对值,fabs()返回绝对值 一个浮点值。由于C不支持重载,因此每个函数都必须具有它 自己的名字,即使所有3个功能基本上都是一样的。这就是情况 从概念上讲,它比实际上更复杂。虽然是每个功能的基本概念 是一样的,我要记住3个名字。这种情况在Java中不会发生,因为每个 绝对值方法可以使用相同的名称。实际上,Java的标准类库包括一个 绝对值方法,称为abs()。 Java的Math类重载了这个方法来处理所有 数字类型。 Java根据参数类型确定调用哪个版本的abs()。
没有规则说明重载方法必须彼此相关。但是从一个 从风格上看,方法重载意味着一种关系。因此,虽然我可以使用 同名的过载不相关的方法,我想我不应该。例如,我可以使用 name sqr创建返回整数的平方和浮点的平方根的方法 点值。但这两项行动根本不同。应用方法重载 这种方式正在打败它的最初目的。
所以在实践中,我应该只过载密切相关的操作吗?除此之外还有其他任何使用重载方法的原因吗?
答案 0 :(得分:0)
据我所知,方法重载通常仅用于为方法提供合理的默认参数,以简化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/)。