OOP:如果在Parent中定义,每个子类是否都有自己的静态变量?

时间:2012-10-22 13:41:52

标签: java oop

实施例

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'
  }
}
  • 每个扩展类都会获得自己的静态队列吗?
  • 如果没有,我如何确保在父类中定义静态变量的常用功能,但每个类都有自己的静态变量(因此是静态队列)

5 个答案:

答案 0 :(得分:3)

不,所有类都会共享一个队列。一种方法是在每个子类中使用单独的静态队列,并添加另一个返回此队列的受保护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'
  }
}

答案 1 :(得分:2)

  

每个扩展类都会获得自己的静态队列吗?

  • 不,静态变量绑定到您所在的特定类 定义它。如果你想为每个人提供不同的静态变量 在子类中,您需要明确定义它们。
  

如何确保静态变量的常用功能   在父级中定义,但每个类都有自己的静态变量

  • 由于第一种情况所述的原因,这是不可能的。不同的类不共享静态变量。相同类的相同不同实例共享它们。

但是,您可以使用static名称访问ParentChild class课程中定义的Parent Class个变量。

WorkAround : -

您可以为每个getters & setters (non-static)中的queue定义subclasses,并为每个static queue定义static queue。现在,每次调用子类的方法(通过多态)时,它将仅返回该类中定义的{{1}}。

答案 2 :(得分: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;
 } 
}

答案 3 :(得分:0)

当涉及继承时,静态变量不像对象变量。例如:您有一个带有静态变量和对象变量的超类。扩展该类时,您可以覆盖该对象变量,并且该类对于该类是唯一的,但对于静态变量,这是不同的。静态变量在扩展超类的所有类中都是相同的。

答案 4 :(得分:0)

  • 每个扩展类都会获得自己的静态队列吗? 不,他们可以访问A中的相同队列q。因此B和C都可以访问q,但q的唯一实例是A。