2

私はJavaの代替可能性について読んだので、への参照superはスーパークラスで合法であるのと同じ場所で合法です(スーパーが表示されないオブジェクトクラスのコードを除いて)。これをテストすると、次の例に示すように失敗するようです。thissuperthis

class OuterSuper {
  public int oneNumber() { return 5; }
  class Inners {}
  int i1 = OuterSuper.this.oneNumber();
  OuterSuper.Inners si1 = OuterSuper.this.new Inners();
}
class Outer extends OuterSuper {
  class Inner {
    int i1 = Outer.this.oneNumber();
    int i2 = Outer.super.oneNumber();
    OuterSuper.Inners si1 = Outer.this.new Inners();
    OuterSuper.Inners si2 = Outer.super.new Inners();
  }
}

コンパイラーは、メンバーsi2の最後の宣言でボークします。この例では、int i1とi2の宣言を記述できます。仕様にあるように、superに渡すものはすべて、スーパークラスでこれに置き換えることができます。インナークラスの場合、私は立ち往生しており、これを使用する必要があります。これはこれとは違うのですか?どちらの場合も「Outer.this」と「Outer.super」を書いています...

javac(Oracle 1.6のコマンドラインJDK)とNetBeansを使用していることを共有したいと思います。javacから得られるエラーは次のとおりです。

Exe.java:32: <identifier> expected
        OuterSuper.Inners si2 = Outer.super.new Inners();
                                            ^
Exe.java:32: invalid method declaration; return type required
        OuterSuper.Inners si2 = Outer.super.new Inners();
                                                ^
2 errors
4

3 に答える 3

1

だから、これが私の2セントです。super自分の基本クラスを参照するためにクラスでしか使用できないという印象を受けました。super内部クラスの関係を考えても、別のクラスを参照することは許可されていないと思いました。これは、クラス自体がメソッドのオーバーライドをバイパスできるクラス以外のクラスがないためです。

したがって、Java仕様によると:

現在のクラスがクラスTまたはT自体の内部クラスでない場合は、コンパイル時エラーになります。

これを考えると、コードはコンパイルする必要があります。

于 2012-11-28T14:27:53.583 に答える
0

おそらく、これらの2行Outerの代わりに使用する必要があります。OuterSuper

class Outer extends OuterSuper {
  class Inner {
    int i1 = Outer.this.oneNumber();
    int i2 = Outer.super.oneNumber();
    Outer.Inners si1 = Outer.this.new Inners();
    Outer.Inners si2 = Outer.super.new Inners();
  }
}
于 2012-11-28T16:02:53.063 に答える
0

クラス内のスーパーへの参照は、スーパークラス内のこれへの参照と同等です。

ステートメントは完全に正しくありません。super.x()は常に基本クラスのx()の実装を参照しますが、スーパークラスのthis.x()は、派生クラスのx()のオーバーライドを参照する場合があります(存在する場合)。

于 2012-11-28T20:54:55.033 に答える