为什么返回类型的同名方法应该在子类Java中相同?

时间:2016-03-12 11:23:40

标签: java

我的背景是C ++。我知道什么是重载,什么是压倒一切。 我想问一下,如果我不想从父级覆盖该方法,并希望使用不同的返回类型和相同的名称创建自己的方法,为什么java不允许我这样做?

示例:

class X{
    public void k(){

    }
}
public class Y extends X{
    public int k(){
        return 0;
    }
}

为什么java不在这里应用隐藏概念?平均等级Y应该隐藏X的方法。背后的原因是什么?

C ++应用隐藏概念。

#include <iostream>
class A{
    public:
        void k(){
            std::cout << "k from A";
        }
};
class B:public A{
    public:
        int k(){
            std::cout << "k from B";
            return 0;
        }
};
int main(){
    B obj;
    obj.k();

    return 0;
}

1 个答案:

答案 0 :(得分:3)

因为Java中的所有方法都是&#34;虚拟&#34; (即它们表现出亚型多态性)。在覆盖虚拟成员函数时,C ++也不允许冲突的返回类型。

struct Base {
    virtual void f() {}
};

struct Derived : Base {
    int f() override { return 0; }
};

编译器输出:

8 : error: conflicting return type specified for 'virtual int Derived::f()'
int f() { return 0; }
^
3 : error: overriding 'virtual void Base::f()'
virtual void f() {}
^

请注意,不允许只有冲突的返回类型。只要它们兼容,就允许使用不同的返回类型。例如,在C ++中:

struct Base {
    virtual Base* f() { return nullptr; }
};

struct Derived : Base {
    Derived* f() override { return nullptr; }
};

在Java中:

class Base {
    Base f() { return null; }
}

class Derived extends Base {
    @Override
    Derived f() { return null; }
}