2012-01-06 39 views
1

サブクラスが持つ親クラスに静的オブジェクトを作成することは可能ですか? 明確化:継承された静的オブジェクトの作成方法

abstract class DataPacket { 
    public static boolean loaded = false; 
    public abstract static boolean load();// Returns true if it loads. Returns false if already loaded 
} 

class DataPacket1 extends DataPacket { 
    public static boolean load() { 
     if (!loaded) { 
      // Load data 
      loaded = true; 
      return loaded; 
     } 
     return false; 
    } 
} 

class DataPacket2 extends DataPacket { 
    public static boolean load() { 
     if (!loaded) { 
      // Load data 
      loaded = true; 
      return loaded; 
     } 
     return false; 
    } 
} 

main() { 
    DataPacket1.load();// returns true 
    DataPacket1.load();// returns false 
    DataPacket2.load();// returns true 
} 

この同じような何かをすることは可能ですか?

+2

http://stackoverflow.com/questions/370962/why-cant-static-methods-be-abstract-in-java – digitaljoel

答えて

2

抽象的または仮想的な静的メソッドは意味がありませんが、どちらも必要ありません。 DataPacketから抽象load()メソッドを削除するだけで、コードは期待通りに機能します。

なぜ仮想静的メソッドを持つのは意味がありませんか?静的メソッドは常にオブジェクト参照ではなく、クラス参照によって呼び出されるためです。 fooが宣言された型の変数であるFooを書くことは可能ですが、fooが実際にSubclassOfFooのインスタンスを参照していても、実際にはFoo.staticMethod()を呼び出しています。

実際にオブジェクトの実際の型に基づいて静的メソッドを呼び出す必要がある場合(オブジェクトを参照する変数の宣言された型とは対照的に)、静的メソッドを呼び出す非静的メソッドを作成する必要があります。適切な静的メソッドを作成し、サブクラスでオーバーライドします。

3

スタティックメソッドはJavaでは抽象的でも仮想的でもありません(Javaがvtableを使用してディスパッチする方法を考えると意味があります)。あなたがすべきことは、インスタンスを作成してそれをシングルトンにすることです。

load()にアクセスする方法を考慮すると、多態性の動作は必要ありません。おそらくあなたの実際のケースはもっと複雑ですが、あなたのスニペットは多態性の必要性を示していません。

+0

明らかに、これは私の実際の使用ではありません。ほんの一例 –

0

静的メソッドはクラスに属し、個々のオブジェクトに属さないため継承できません。したがって、コードはコンパイルされません。

関連する問題