4

フィールドが 2 つの Java クラスの間で隠されているとはどういう意味なのか、結果の出力に関してコードを実行するときはどういう意味なのか疑問に思っていました。

を持つ抽象クラスとprotected static boolean field = false、同じ名前のブールフィールドを持つサブクラスがありますが、静的ではなく、に設定されていtrueます。

このコードがある場合:

Superclass d = new subclass();

スーパークラスのブール値フィールドとサブクラスのブール値フィールドの値は? サブクラス フィールドはfalse上記の代入後も維持されますか?

4

3 に答える 3

10
  • Java 言語仕様

    クラスが特定の名前のフィールドを宣言する場合、そのフィールドの宣言は、スーパークラスおよびクラスのスーパーインターフェースで同じ名前を持つフィールドのすべてのアクセス可能な宣言を隠すと言われます。

    非表示のフィールドにアクセスするには、それが の場合は修飾名を使用するか、キーワードまたはスーパークラス型へのキャストをstatic含むフィールド アクセス式を使用します。super

    http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.htmlで詳細を参照してください。

  • サンプルコード

    class A {
        static int field;
    }
    class B extends A {
        int field;
        void doSomething() {
            System.out.println(super.field); // From A
            System.out.println(field); // From B
        }
    }
    class Main {
        public static void main(String[] args) {
            B b = new B();
            System.out.println(b.field); // From B
            System.out.println(((A) b).field); // From A
            System.out.println(A.field); // From A
        }
    }
    
于 2012-05-08T15:26:39.317 に答える
6

staticメンバーがオーバーライドされることはありません (もちろん、非静的メンバーによってオーバーライドされることもありません)。また、次のようにアクセスするClassName.member必要があるため、非表示にすることを心配する必要もありません。

あなたの場合、次のSuperclassようにフィールドにアクセスしますSuperclass.field。そして、Subclassこのようなインスタンスのフィールド: subclass.field. ただし、上記のような変数にSubclassインスタンスがある場合Superclass、このコード:d.fieldで定義された静的フィールドにアクセスします。Superclassこれはfalseあなたの場合になります。

しかし、これはインスタンスの値を変更しませんSubclass。「間違った」メンバーにアクセスするだけです! これは、インスタンスを変数にd戻して再度読み取ることで確認できます。Subclassfield

于 2012-05-08T15:22:00.020 に答える
1

スーパークラスのブール値フィールドとサブクラスのブール値フィールドの値は?

fieldスーパークラスの variableの値はfalse のままfieldになり、サブクラスの variable の値は true のままになります。

上記の割り当ての後、サブクラス フィールドは FALSE のままですか?

いいえ。Java で静的変数をオーバーライドすることはできません。基本的に起こることは、サブクラスの定義がスーパークラスで宣言された変数を隠すことです。

良い例と説明については、SO Questionを参照してください。

また、自分で試してみて、何が起こるかを確認することをお勧めします。

于 2012-05-08T15:32:14.960 に答える