11

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

  1. 通过实例方法覆盖实例方法和
  2. 通过静态方法隐藏静态方法

我的问题是为什么 Java 不允许通过实例方法隐藏静态超类方法。这可以这样做:

class Base {
    static void foo () {}
}

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

我没有看到上述方法有任何特别的问题——它只是和静态的(允许的)隐藏一样“混乱/复杂”。

4

4 回答 4

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()?

于 2013-01-30T10:55:13.320 回答
5

简单的答案:那将是一团糟。

具体答案:在这种情况下该怎么称呼Derived.foo()Base.foo()不能被调用,因为它是隐藏的(根据你),Derived.foo()不能被调用,因为它不是静态的。

于 2013-01-30T10:58:45.977 回答
1

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

解释:

  • 读取类结构时创建静态方法
  • 方法是在创建类的对象时创建的。

例子:

Foo.bar();

是不同的东西

new Foo().bar();

猜猜叫哪一个?

Foo f = new Foo();
f.bar();
于 2013-01-30T10:57:28.973 回答
1

另一个要补充的是: 1. 静态方法属于类级别。所以你不能覆盖派生类中的方法。很简单,它被称为隐藏。:) 2.实例方法属于对象,所以对象被覆盖。所以我们可以在派生类中重写。

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

问候普尼斯

于 2013-01-30T11:25:51.413 回答