3
class Host {
    int x=2;

    class Helper {
        int x = 7;
    }

    public static void main(String[] args){
        Host ho = new Host();
        Helper he = ho.new Helper();
        System.out.println(ho.x);
        System.out.println(he.x);

    }
}

だからここで私は期待される出力を得ています

2
7

hoここで、たとえば、からにアクセスxしたい、と尋ねたいと思いましたhe

2つまり、ヘルパーオブジェクトを介して私を印刷する何かがここに欲しいhe:

System.out.println(???);

入れ子になったクラスの概念を明確にしたいだけです。heHelper オブジェクトは Host オブジェクトに一種の「バインド」されているため、これは可能であると思いますhoheなしではできませんのでho。Helper クラス内から実行できSystem.out.println(Host.this.x);、機能します。メインの内部からそれを行う方法がわかりません。

4

4 に答える 4

1

昔は、古いバージョンのJavaでは、this$0の代わりに外部インスタンスにアクセスする方法として使用していましたHost.this。仕様は変更されましたが、フィールドはリフレクションを通じて引き続き使用できます。

Field this$0 = he.getClass().getDeclaredField("this$0");
Host host = (Host) this$0.get(he);
System.out.println(host.x);

他の方法はわかりません(またはメソッドHostを追加するためにクラスを変更することは別として)。getXgetHost

さて、なぜこのアクセスは反射なしで利用できないのですか?私は2つの考えられる理由を見ることができます:

  • 彼らは忘れました
  • インスタンスの外部からのこのアクセスは、カプセル化を破ります
于 2012-12-04T10:05:54.547 に答える
1

他の回答ですでに指摘されているように、できません。その理由は、 JLS #15.8.3thisで定義されている方法にあります。

キーワード this は、インスタンス メソッド、インスタンス初期化子、またはコンストラクターの本体、またはクラスのインスタンス変数の初期化子でのみ使用できます。それ以外の場所にある場合は、コンパイル時エラーが発生します。

thisまた、 ( JLS #15.8.4を参照) でのみ囲んでいるインスタンスにアクセスできるため、内部クラス内でのみ実行できます。

C.this現在のクラスがクラス C または C 自体の内部クラスでない場合、[呼び出す] はコンパイル時エラーです。

于 2012-12-04T10:24:04.997 に答える
0

基本的な Java の概念、ホスト クラスは内部クラス変数にアクセスできますxが、その逆は不可能です。@Nikita Beloglazovが言っているようにできます。ただし、変数を直接使用することはできません

于 2012-12-04T09:59:32.467 に答える
0

外部クラスを返す内部クラスでメソッドを作成できます。

class Helper {
    int x = 7;

    public Host outer() {
        return Host.this;
    }
}

// In main;
System.out.println(he.outer().x);

x内部へのアクセスに似てHelper いますが、より一般的です。

于 2012-12-04T10:05:17.033 に答える