为什么Java不允许通过实例方法隐藏静态方法?

时间:2013-01-30 10:51:14

标签: java inheritance

http://docs.oracle.com/javase/tutorial/java/IandI/override.html所示,Java确实允许

  1. 通过实例方法和
  2. 覆盖实例方法
  3. 通过静态方法隐藏静态方法
  4. 我的问题是为什么Java不允许通过实例方法隐藏静态超类方法。这可以这样做:

    class Base {
        static void foo () {}
    }
    
    class Derived extends Base {
        void foo () {}
        void access () {
            foo ();
            Base.foo ();
        }
    }
    

    我没有看到上述方法有任何特殊问题 - 它只是作为“混乱/复杂”,因为(允许)隐藏静态已经存在。

4 个答案:

答案 0 :(得分:12)

我怀疑这是为了避免与处理基类混淆。事实上,我想设计师没有看到这应该表现的明显方式。

class Base {
    static void foo () {}
}

class Derived extends Base {
    void foo () {} // say this compiled
}

Base b = new Derived()
b.foo(); // should the static or the virtual method be called?

b.foo()应该调用Base.foo()还是应该调用Derived.foo()?

答案 1 :(得分:5)

简单回答:那将是一团糟。

具体答案:在这种情况下要调用什么Derived.foo()Base.foo()无法被调用,因为它被隐藏(按照您的身份),Derived.foo()无法被调用,因为它不是静态的。

答案 2 :(得分:1)

因为,一个像香蕉,另一个是苹果。

阐释:

  • 在阅读“类结构”
  • 时创建静态方法
  • 创建类的对象时创建方法。

示例:

Foo.bar();

不同
new Foo().bar();

猜猜哪一个被叫?

Foo f = new Foo();
f.bar();

答案 3 :(得分:1)

此处添加的另一个是: 1.静态方法属于类级别。所以你不能覆盖派生类中的方法。    就像它的隐藏一样简单。 :) 2.实例方法属于对象,因此对象被覆盖。所以我们可以在派生类中重写。

以上其他评论给出了一个很好的例子来看看..

此致 Punith