簡體   English   中英

OOP:如果在Parent中定義了,每個子類都會得到自己的靜態變量嗎?

[英]OOP : Does each child class get its own static variable if defined in Parent?

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'
  }
}
  • 每個擴展類都會獲得自己的靜態隊列嗎?
  • 如果沒有,我如何確保在父級中定義了靜態變量的通用功能,但是每個類都有自己的靜態變量(因此有一個靜態隊列)

不,所有類將共享一個隊列。 一種實現方法是在每個子類中都有一個單獨的靜態隊列,並添加另一個受保護的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'
  }
}

每個擴展類都會獲得自己的靜態隊列嗎?

  • 不,靜態變量綁定到您在其中定義它的特定類。 如果要為每個子類使用不同的靜態變量,則需要顯式定義它們。

我如何確保在父級中定義了靜態變量的通用功能,但是每個類都有自己的靜態變量

  • 由於第一種情況中所述的原因,這是不可能的。 不同的類不共享靜態變量。 而是同一類的不同實例共享它們。

但是,您可以使用Parent Class名稱訪問Child classParent類中定義的static變量。

工作環境 :-

您可以在每個subclassesqueue定義getters & setters (non-static) ,也可以為每個subclasses不同的static queue 現在,每次調用子類的方法(通過多態性)時,它將僅返回該類中定義的static queue

不,靜態變量屬於您在其中定義的實體,即使它們是抽象類或接口也是如此。

我真的很想挑戰您為什么要提出的設計,但是如果您確實希望每個子類都有自己的(靜態)隊列,則可以執行以下操作:

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;
 } 
}

靜態變量與繼承時的對象變量不同。 例如:您有一個帶有靜態變量和對象變量的超類。 當您擴展該類時,您可以覆蓋對象變量,並且該變量對於該類而言是唯一的,但是對於靜態變量而言則不同。 在擴展超類的所有類中,靜態變量都相同。

  • 每個擴展類都會獲得自己的靜態隊列嗎? 不,他們可以訪問與A中相同的隊列q。因此B和C都可以訪問q,但是q的唯一實例在A中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM