13

私はJava言語を話しています。

変数「this」をクラス内で使用すると、そのクラスの現在のインスタンスが参照されます。つまり、静的メソッド内で「this」を使用することはできません。

ただし、クラス内で使用される場合、「スーパー」は、スーパークラスのインスタンスではなく、そのクラスのスーパークラスを参照します。これは、静的メソッド内で「スーパー」を使用できることを意味するはずです。しかし、それはできないことがわかりました。

考えられる説明は、「スーパー」はスーパークラスのインスタンスも指すと言うことですが、なぜそれが必要なのかわかりません...

4

5 に答える 5

13

いいえ、superインスタンスを参照します -this現在のオブジェクトを参照するのと同じインスタンスです。これは、現在のクラスでオーバーライドまたは非表示になっているスーパークラスで定義されたメソッドとフィールドを参照する方法にすぎません。

于 2013-01-01T18:00:27.047 に答える
13

superキーワードに関する JLS のセクションは次のとおりです。

http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.11.2

フォームsuper.Identifierは現在のオブジェクトの Identifier という名前のフィールドを参照しますが、現在のオブジェクトは現在のクラスのスーパークラスのインスタンスとして表示されます。

この形式T.super.Identifierは、T に対応する字句的に囲んでいるインスタンスの Identifier という名前のフィールドを参照しますが、そのインスタンスは T のスーパークラスのインスタンスとして表示されます。

どちらの場合も、インスタンス オブジェクトが必要であることは明らかです。


また、クラスは静的メソッドをオーバーライドできず、非表示にするだけであるため、静的コンテキストはインスタンス コンテキストとは多少異なります。

于 2013-01-01T18:00:53.620 に答える
10

super静的コンテキストで使用できないのと同じ理由で、静的コンテキストから使用することはできませんthis。どちらの場合も、単語はインスタンスを指します。

静的コンテキストでは、常にスーパークラスの名前を明示的に使用できます。

class Sub extends Base {
    static void func() {
        Base.func();
        . . .
    }
}
于 2013-01-01T18:00:35.070 に答える