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

时间:2014-08-10 17:13:03

标签: java c++ 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;
}

该程序的输出是:

  

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));
    }
}

2 个答案:

答案 0 :(得分:7)

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

  

如果一个类的两个方法(无论是在同一个类中声明,还是由一个类继承,或一个声明的和一个继承的)具有相同的名称,但签名不是覆盖 - 相当于,然后方法名称被称为重载

另见§15.12.2. Compile-Time Step 2: Determine Method Signature

答案 1 :(得分:7)

  

您已经说过&#34;我们知道重载不适用于派生   C ++中的类&#34;

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

class Derived : public Base
{
public:

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

    double f(double d) { ... }
};

派生类中的Java重载(同名)方法并不隐藏其父方法,并且您不需要从父方法中明确地引入它。