2016-03-12 59 views
0

我的背景是C++。我知道什么是重载,什么是重载。 我想问一下,如果我不想从父类重写方法,并想使用不同的返回类型和同名方法创建自己的方法,为什么java不允许我这样做?为什么返回类型的相同命名方法应该在子类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; 
} 
+0

为什么你要吗?例如,你失去了创建虚拟功能的可能性。 – Lasoloz

+0

@Lasoloz为什么Java不允许改变返回类型。我知道如果我在C++中声明函数virual,那么我需要是相同的返回类型(但为什么?)为什么返回类型应该是相同的问题? – UnKnown

回答

3

因为Java中的所有方法都是“虚拟的”(即它们表现出亚型多态性)。重写虚拟成员函数时,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; } 
} 
+0

你能给我任何关于java的例子,它可能导致问题吗? – UnKnown

+0

@UnKnown隐藏通常被认为是不好的做法,因为可能会让期望调用基类函数的类的用户感到困惑。但是,我意识到我的回答是错误的。我用正确的理由更新了它! –

+0

约瑟夫我已经了解C++。但是关于Java的是什么?为什么java不允许? – UnKnown

相关问题