方法重载Java中的支持多态性

时间:2014-09-15 07:39:29

标签: java polymorphism overloading

方法重载支持多态,因为它是Java实现单接口,多种方法范例的一种方式。

要了解如何,我考虑以下内容。在不支持方法重载的语言中,     每个方法都必须给出一个唯一的名称。但是,我经常要实施基本上     对于不同类型的数据使用相同的方法。考虑绝对值函数。在语言中     那些不支持重载的,通常有3个或更多版本的这个函数,每个都有     一个略有不同的名字。例如,在C中,函数abs()返回an的绝对值     integer,labs()返回长整数的绝对值,fabs()返回绝对值     一个浮点值。由于C不支持重载,因此每个函数都必须具有它     自己的名字,即使所有3个功能基本上都是一样的。这就是情况     从概念上讲,它比实际上更复杂。虽然是每个功能的基本概念     是一样的,我要记住3个名字。这种情况在Java中不会发生,因为每个     绝对值方法可以使用相同的名称。实际上,Java的标准类库包括一个     绝对值方法,称为abs()。 Java的Math类重载了这个方法来处理所有     数字类型。 Java根据参数类型确定调用哪个版本的abs()。

没有规则说明重载方法必须彼此相关。但是从一个     从风格上看,方法重载意味着一种关系。因此,虽然我可以使用     同名的过载不相关的方法,我想我不应该。例如,我可以使用     name sqr创建返回整数的平方和浮点的平方根的方法     点值。但这两项行动根本不同。应用方法重载     这种方式正在打败它的最初目的。

所以在实践中,我应该只过载密切相关的操作吗?除此之外还有其他任何使用重载方法的原因吗?

1 个答案:

答案 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/)。