为什么重载在Java中与继承一起工作?

Des*_*tor 1 c++ java inheritance

我们知道重载对C++中的派生类不起作用.但为什么这种行为在java中有所不同?意味着为什么重载适用于java中的派生类?请考虑以下Stroustrup博士的常见问题解答中的示例

#include <iostream>
using namespace std;
class Base
{
public:
    int f(int i)
    {
        cout << "f(int): ";
        return i+3;
    }
};
class Derived : public Base
{
public:
    double f(double d)
    {
        cout << "f(double): ";
        return d+3.3;
    }
};
int main()
{
    Derived* dp = new Derived;
    cout << dp->f(3) << '\n';
    cout << dp->f(3.3) << '\n';
    delete dp;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

该程序的输出是:

f(双):6.3

f(双):6.6

而不是假定的输出:

f(int):6

f(双):6.6

但如果我们在java中执行此程序,则输出会有所不同.

class Base
{
    public int f(int i)
    {
        System.out.print("f (int): ");
        return i+3;
    }
}
class Derived extends Base
{
    public double f(double i)
    {
        System.out.print("f (double) : ");
        return i + 3.3;
    }
}
class Test
{
    public static void main(String args[])
    {
        Derived obj = new Derived();
        System.out.println(obj.f(3));
        System.out.println(obj.f(3.3));
    }
}
Run Code Online (Sandbox Code Playgroud)

NPE*_*NPE 7

它的工作原理是因为Java语言规范在§8.4.9中明确允许它.重载:

如果一个类的两个方法(无论是在同一个类中声明,还是由一个类继承,或者一个是声明的,一个是继承的)都具有相同的名称,但签名不是覆盖等价的,那么方法名称就是超载.

另见§15.12.2.编译时间步骤2:确定方法签名.


mas*_*oud 7

您已经说过"我们知道重载对C++中的派生类不起作用".

这不是真的,也不是准确的句子.您可以在C++中跨基类和派生类重载.只需要将using父方法放入派生类中以取消隐藏该方法.

class Derived : public Base
{
public:

    using Base::f;
    ^^^^^^^^^^^^^^

    double f(double d) { ... }
};
Run Code Online (Sandbox Code Playgroud)

在派生类中的Java重载(同名)方法不会隐藏其父方法,您不需要从父方法显式地引入它.

  • **+ 1**用于添加实用解决方案和其他知识. (2认同)