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中支持多态的方法重载的主要内容,如果未能解决你的问题,请参考以下文章

重载和重写有啥区别

Java之方法重写方法重载多态

Java 方法重载和多态

JAVA基础之重载,覆盖/重写,多态

Java中的多态

java多态的2种表现形式 方法重载和方法覆盖