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

Spe*_*utz 2 java oop overloading

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

public String name = "name";

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

protected String printName(String extra) {
    System.out.println(name + extra);
    return name + extra;
}
Run Code Online (Sandbox Code Playgroud)

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

Eug*_*ene 5

如有疑问,JLS 将提供帮助

\n
\n

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

\n
\n

所以这不是“改变参数”,而是关于不覆盖等价。要了解那是什么,请转到另一章,其中说:

\n
\n

两个方法签名 m1 和 m2 是覆盖等效的,当且仅当 m1 是 m2 的子签名或 m2 是 m1 的子签名。

\n
\n

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

\n
\n

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

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

    \n
  • \n
  • m1 的签名与 m2 签名的擦除(\xc2\xa74.6)相同。

    \n
  • \n
\n

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

\n