0

外部クラスのフィールドを変更する適切な方法は何ですか?内部静的クラスから変更しようとするとvalueArtifactエラーが発生します。タイプのオブジェクトを含む配列リストを反復処理する必要がありますArtifactArtifactそれぞれ(コインかゴブレットか)の値を表示できます。

 public class Artifact {
        public int value = 0;

        public static class  Goblet extends Artifact{
            value = 5; // Syntax error on token "value", VariableDeclaratorId expected after this token
        }
        public static class Coin extends Artifact{
            value = 10;
        }

    }
4

3 に答える 3

5

value = xxx;メソッドまたはブロックの外部にステートメントを含めることはできません。

これはうまくいくでしょう:

public class Artifact {

    public static void main(String[] args) {
        Artifact goblet = new Goblet();
        Artifact coin = new Coin();

        System.out.println(goblet.value); //prints 5
        System.out.println(coin.value); //prints 10
    }

    public int value = 0;

    public static class Goblet extends Artifact {

        {value  = 5;}
    }

    public static class Coin extends Artifact {

        {value  = 10;}
    }
}
于 2012-05-29T14:06:36.713 に答える
1

まず、これらの静的クラスは囲まれていません-静的です。

第二に、囲まれたクラスは必要ありません。通常のトップレベルのクラスが必要です。

Artifact第三に、使用する値が渡されるコンストラクターが必要です。

これを試してください-3つの別々のクラス:

public abstract class Artifact {
    public final int value;

    protected Artifact(int value) {
        this.value = value;
    }
}

public class Goblet extends Artifact {
    public Goblet() {
        super(5);
    }
}

public class Coin extends Artifact {
    public Coin() {
        super(10);
    }
}

Artifact abstract直接作成できず、値を渡すサブクラスを作成する必要があるため、作成することを選択しました。コンストラクターはprotectedそれを強化するだけです(サブクラスのみがそれを表示できます)。

于 2012-05-29T14:16:44.553 に答える
0
public class Artifact {
public int value = 0;

public static class Goblet extends Artifact {

    public Goblet() {
        super();
        value = 5;
    }

    public void modifyOuterClassfield(int someValue) {
        value = 100 + someValue;
    }
}

public static class Coin extends Artifact {

    public Coin() {
        super();
        value = 10;

    }   

    public void modifyOuterClassfield(int someValue) {
        value = 100 + someValue;
    }

}

public int getValue() {
    return value;
}

public void setValue(int value) {
    this.value = value;
}

    public static void main(String[] args) {
    Artifact a = new Coin();
    Artifact b = new Goblet();
    Coin c = new Coin();
    Artifact d = new Artifact();

    System.out.println(a.getValue());
    System.out.println(b.value);
    System.out.println(c.getValue());
    System.out.println(d.getValue());

    a.value = 101;
    b.value = 202;
    c.setValue(303);
    d.setValue(404);

    System.out.println(a.getValue());
    System.out.println(b.value);
    System.out.println(c.value);
    System.out.println(d.getValue());
}

}

出力:

10

5

10

0

101

202

303

404

静的クラスは静的変数と同じではありません。したがって、インスタンスの初期化は、コンパイラが文句を言わないのでうまくいきますが、匿名の内部クラスは匿名の内部クラスを持つことができないため、内部クラスが匿名の内部クラスでない限り、他の方法で変数を初期化できるため、全体像ではありませんコンストラクタ。

外部クラスのフィールドは、フィールドがプライベートとして宣言されていない限り、常に内部クラス内に表示されます。


http://www.javaworld.com/javaqa/1999-08/01-qa-static2.html

http://www.artima.com/designtechniques/initializationP.html

于 2012-05-29T14:15:21.393 に答える