2011-12-11 16 views
18

私は同じ抽象クラスを拡張する2つのクラスを持っています。どちらも同じ定数が必要ですが、値は異なります。これどうやってするの?私がしたいことを示すためのコード例です。Javaでの定数のオーバーライド

abstract class A { 
    public static int CONST; 
} 

public class B extends A { 
    public static int CONST = 1; 
} 

public class C extends A { 
    public static int CONST = 2; 
} 

public static void main(String[] args){ 
    A a = new B(); 
    System.out.println(a.CONST); // should print 1 
} 

CONSTがクラスAで初期化されていないため、上記のコードはコンパイルされません。どうすれば動作させることができますか? CONSTの値は、Bのすべてのインスタンスで1、Cのすべてのインスタンスで2、Aのすべてのインスタンスで1または2でなければなりません。これには静的変数を使用する方法はありますか?

答えて

21

これはできません。

ただし、これを行うことができます:

abstract class A { 
    public abstract int getConst(); 
} 

public class B extends A { 
    @Override 
    public int getConst() { return 1; } 
} 

public class C extends A { 
    @Override 
    public int getConst() { return 2; } 
} 

public static void main(String[] args){ 
    A a = new B(); 
    System.out.println(a.getConst()); 
} 
+0

ありがとうございました!値がBのインスタンスごとに異なるわけではないので、私は静的を使用することができます。 – Fractaly

+0

@Fractaly:しかし、彼らはAのインスタンスから別のインスタンスに変わります。 –

+1

はAで抽象的であるgetConst()をしてはいけませんか? – Fractaly

5

定数は変数の値がある場合、それはもはや一定ではありません。静的なフィールドとメソッドは多相ではありません。パブリックメソッドを使用して、必要な処理を行う必要があります。

関連する問題