1

フォームの変数を持つ抽象クラスがある場合

protected static final int blah;
protected static final int blah2;

そして、この抽象クラスを拡張する2つのクラスがあり、これらの変数をコンストラクターの定数ファイルから「static final int」値に設定すると、互いの値が上書きされますか? もし私がそのようなことをしたいのなら、あなたは私に何をすすめますか?

たとえば、私が持っている場合

impl1 クラス:

public impl1 extends absClass{
    public impl1(){
        this.blah = CONSTANTS.impl1_blah;
        this.blah2 = CONSTANTS.impl1_blah2;
    }
}

impl2 クラス:

public impl2 extends absClass{
    public impl2(){
        this.blah = CONSTANTS.impl2_blah;
        this.blah2 = CONSTANTS.impl2_blah2;
    }
}

これは許されますか?そうでない場合は、どうすればよいですか?

4

6 に答える 6

3
this.blah = CONSTANTS.impl2_blah;
this.blah2 = CONSTANTS.impl2_blah;

これは許可されましたか?

変数はとして宣言されているため、これ許可されていません。それらは、クラスの初期化中に、宣言または静的初期化ブロックのいずれかで初期化する必要があります。blahfinal

さらに、これらの変数はstaticであるため、を使用してそれらにアクセスすることはできません。変数はインスタンスではなくクラスthisに属します。

そうでない場合は、どうすればよいですか?

スーパークラスで非最終変数を使用するか、サブクラスで特定の定数を使用します。

于 2012-09-24T17:59:45.340 に答える
1

その抽象クラスを拡張するクラスがそれらの変数に独自の値を与えることになっている場合は、代わりにいくつかの保護された抽象メソッドを検討する必要があります。

于 2012-09-24T18:09:48.473 に答える
0

static final変数は、変数を宣言するクラスが初期化されるときに初期化する必要があります。これは、クラス(またはサブクラス)のインスタンスが作成される前です。blahコードは、との何らかの初期化なしではコンパイルされません—blah2初期化式:

protected static final int blah = 42;
protected static final int blah2 = 1;

または静的初期化ブロック内:

protected static final int blah;
protected static final int blah2;
static {
    blah = 42;
    blah2 = 1;
}

どちらの場合でも、サブクラスは何blahを言うのかわからずblah2、割り当てられます。

サンプルコードから、インスタンスごとに変化する定数が必要なようです。それらが静的であることは意味がありません。あなたはこのようなことをすることができます:

public AbsClass {
    protected final int blah;
    protected final int blah2;
    protected AbsClass(int blah, int blah2) {
        this.blah = blah;
        this.blah2 = blah2;
    }
    . . .
}

public class Impl1 extends AbsClass {
    public Impl1() {
        super(CONSTANTS.impl1_blah, CONSTANTS.impl1_blah2);
    }
}

public class Impl2 extends AbsClass {
    public Impl1() {
        super(CONSTANTS.impl2_blah, CONSTANTS.impl2_blah2);
    }
}
于 2012-09-24T18:00:28.057 に答える
0

static変数はオーバーライドできません。それらは、それらを定義したクラスに関連付けられます。

于 2012-09-24T17:57:01.380 に答える
0

まず第一に、これは final+static であり、OOP とは何の関係もありません。それらを static にしない場合、OOP について話すのは理にかなっています。それらをプライベートとして実行せず、ゲッター/セッターを使用してアクセスすると、カプセル化が壊れています。

そして、あなたはそれを最終的なものにしています。つまり、一度だけ初期化できます。最終属性の値を変更しようとすると、例外が発生します。

于 2012-09-24T19:44:32.223 に答える
0

Java のポリモーフィズムは属性では機能しません。代わりに、保護された抽象 getMethods() を使用してください。

于 2012-09-24T18:23:39.120 に答える