0

入れ子になったクラスが囲んでいるクラスの静的メンバーと名前を共有している場合、囲んでいるクラスから入れ子になったクラスの静的メンバーにアクセスする方法はありますか? 例えば:

package a;

class a {
    static Object b;

    static class b {

        static Object foo;
    }

    static Object needAccessToFoo;

    static {
        // can I access foo?
    }

} 

クラスb( member ではなく) は、 (または)bを介して Type として使用されている場合にアクセスできます。そして、ネストされたクラスのインスタンスを使用して次のようにアクセスできます。a[b.]b.afoob

static {
    [a.][a.]b bar = new b();
    needAccessToFoo = bar.foo;
}

ただし、bネストされたクラスであり、インナー クラスではないため、 (によって参照されるオブジェクト)fooのインスタンスを介さずに静的に参照する適切な方法があるかどうか疑問に思う人がいます。言うまでもなく、オブジェクトを介して静的メンバーにアクセスすることは、一般的に悪い習慣として受け入れられています。bbar

4

2 に答える 2

1

この問題は隠蔽として知られています。JLS の状態

単純な名前は、変数、型、またはパッケージの名前として解釈される可能性があるコンテキストで発生する可能性があります。このような状況では、§6.5 の規則は、変数が型より優先して選択され、型がパッケージより優先して選択されることを指定します。したがって、可視型またはパッケージ宣言を単純な名前で参照できない場合があります。そのような宣言は隠されていると言います。

にアクセスできなくなりますfoo

初期化ブロックのコンテキストではstatic、 という名前のものが 2 つありますb。上記の規則により、競合する名前を使用する場合は常に変数が選択されます。変数を囲んでいる型で修飾しても、変数はその参照を介してアクセスできるa.bため、何も変更されません。static

于 2013-11-04T22:59:43.610 に答える
0

はい、すべてが静的でaあり、ブロックの範囲内にあるため、次のstaticことができます。

static { Object foo2 = a.foo; // can I access foo? }

ただし、名前の衝突を防ぐために、外部クラスの名前を変更する必要があります。それ以外の場合、コンパイラはどのようaに参照しているのかを知ることができますか?

于 2013-11-04T22:53:24.757 に答える