2

abstract class A
{
  protected static Queue<String> q = new ArrayList<String>();

  abstract void myAbstractMethod();

  public doConcreteThings()
  {
     //busy code utilizing a 'q'
     q.add("something");
     myAbstractMethod();
     //busy code
  }

}

class B extends A
{

  public void myAbstractMethdo()
  {
     //creates concrete implementation using 'q'
  }
}

class C extends A
{

  public void myAbstractMethdo()
  {
     //creates concrete implementation using 'q'
  }
}
  • 各拡張クラスは独自の静的キューを取得しますか?
  • そうでない場合、静的変数の共通機能が親で定義されているが、各クラスが独自の静的変数(したがって静的キュー)を取得していることを確認するにはどうすればよいですか?
4

5 に答える 5

3

いいえ、すべてのクラスで共有される1つのキューがあります。これを行う1つの方法は、各サブクラスに個別の静的キューを作成し、getQueue()このキューを返す別の保護されたメソッドを追加することです。このようにして、各サブクラスは独自のキューを持つことができます。

getQueue()これは非静的メソッドですが、静的変数参照を返すことに注意してください。これにより、サブクラスに実装できますが、その動作は静的メソッドのように「効果的に」なります(へのアクセスは必要ありませんthis)。

abstract class A
{
  protected abstract Queue<String> getQueue();
  public abstract void myAbstractMethod();

  public doConcreteThings()
  {
     //busy code utilizing a 'q'
     getQueue().add("something");
     myAbstractMethod();
     //busy code
  }
}

class B extends A
{
  private static Queue<String> q = new ArrayList<String>();
  protected Queue<String> getQueue() { return q; }

  public void myAbstractMethod()
  {
     //creates concrete implementation using 'q'
  }
}

class C extends A
{
  private static Queue<String> q = new ArrayList<String>();
  protected Queue<String> getQueue() { return q; }

  public void myAbstractMethod()
  {
     //creates concrete implementation using 'q'
  }
}
于 2012-10-22T13:46:07.907 に答える
2

各拡張クラスは独自の静的キューを取得しますか?

  • いいえ、静的変数は、それを定義する特定のクラスにバインドされています。子クラスごとに異なる静的変数が必要な場合は、それらを明示的に定義する必要があります。

静的変数の共通機能が親で定義されているが、各クラスが独自の静的変数を取得していることを確認するにはどうすればよいですか?

  • 最初のケースで述べた理由のように、それは不可能です。異なるクラスは静的変数を共有しません。同じクラスのかなり異なるインスタンスがそれらを共有します。

ただし、クラスでstatic定義されている変数に名前を付けてアクセスできます。ParentChild classParent Class

回避策:-

あなたはあなたのそれぞれであなたのgetters & setters (non-static)ために定義することができます、そしてまたそれらのそれぞれのために異なっていることができます。これで、サブクラスのメソッドが(ポリモーフィズムを介して)呼び出されるたびに、そのクラスで定義されたもののみが返されます。queuesubclassesstatic queuestatic queue

于 2012-10-22T13:44:07.203 に答える
0

いいえ、静的変数は、抽象クラスまたはインターフェースであっても、定義したエンティティに属します。

提案しているデザインが必要な理由に挑戦したいのですが、各サブクラスに独自の(静的)キューが必要な場合は、次のようにすることができます。

abstract class A
{
  abstract Queue getQueue();

  abstract void myAbstractMethod();

  public doConcreteThings()
  {
     //busy code utilizing a 'q'
     getQueue().add("something");
     myAbstractMethod();
     //busy code
  }    
}

class B extends A
{
protected static Queue<String> q = new ArrayList<String>();

  public void myAbstractMethdo()
  {
     //creates concrete implementation using 'q'
  }
  public Queue getQueue() {
    return queue;
  } 
}

class C extends A
{
protected static Queue<String> q = new LinkedListList<String>();

  public void myAbstractMethdo()
  {
     //creates concrete implementation using 'q'
  }

public Queue getQueue() {
    return queue;
 } 
}
于 2012-10-22T13:45:11.383 に答える
0

静的変数は、継承に関してはオブジェクト変数とは異なります。例:静的変数とオブジェクト変数を持つスーパークラスがあります。そのクラスを拡張すると、オブジェクト変数をオーバーライドでき、そのクラスに固有になりますが、これは静的変数の場合と同じではありません。静的変数は、スーパークラスを拡張するすべてのクラスで同じになります。

于 2012-10-22T13:47:51.117 に答える
0
  • 各拡張クラスは独自の静的キューを取得しますか?いいえ、Aにある同じキューqにアクセスできます。したがって、BとCは両方ともqにアクセスできますが、qの唯一のインスタンスはAにあります。
于 2012-10-22T14:05:40.373 に答える