首页 > 解决方案 > 重载具有不同访问修饰符、返回类型和参数的方法是否仍被视为重载?

问题描述

这可能只是语义,可能是一个愚蠢的问题,但我很好奇以下是否会被认为是重载:

public String name = "name";

public void printName() {
    System.out.println(name);
}

protected String printName(String extra) {
    System.out.println(name + extra);
    return name + extra;
}

我读过的所有内容都说必须更改参数才能发生重载,并且只要参数不同,更改访问修饰符和返回类型就不会导致编译错误,但我不知道后者是否仍将被视为超载。

标签: javaoopoverloading

解决方案


如有疑问,JLS 将提供帮助

如果一个类的两个方法(无论是在同一个类中声明,还是都由一个类继承,或者一个声明一个继承)具有相同的名称但签名不是覆盖等效的,则该方法名称被称为超载。

因此,这不是“更改参数”,而是不是 override-equivalent。要找出那是什么,请转到另一章,上面写着:

如果 m1 是 m2 的子签名或 m2 是 m1 的子签名,则两个方法签名 m1 和 m2 是覆盖等效的。

同一章解释了什么是子签名

方法 m1 的签名是方法 m2 签名的子签名,如果:

  • m2 与 m1 具有相同的签名,或

  • m1 的签名与 m2 签名的擦除(第 4.6 节)相同。

您如何解释上述方法是留给您的练习。


推荐阅读