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

ここで追加するもう 1 つの点は次のとおりです。 1. 静的メソッドはクラス レベルに属します。したがって、派生クラスでメソッドをオーバーライドすることはできません。簡単に隠蔽と呼ばれます。:) 2. インスタンス メソッドはオブジェクトに属しているため、オブジェクトはオーバーライドされます。したがって、派生クラスでオーバーライドできます。

他のコメントの上に良い例があり、それを見てください..

よろしくプニス

于 2013-01-30T11:25:51.413 に答える
1

1つはバナナのようなもので、もう1つはリンゴのようなものです。

説明:

  • クラス構造の読み取り時に静的メソッドが作成されます
  • メソッドは、クラスのオブジェクトが作成されるときに作成されます。

例:

Foo.bar();

とは何か違う

new Foo().bar();

どちらが呼ばれていると思いますか?

Foo f = new Foo();
f.bar();
于 2013-01-30T10:57:28.973 に答える