![](/img/trans.png)
[英]Does overriding a static variable defined from a sub-class influence the value of said variable in parent class?
[英]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 class
中Parent
類中定義的static
變量。
工作環境 :-
您可以在每個subclasses
為queue
定義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;
}
}
靜態變量與繼承時的對象變量不同。 例如:您有一個帶有靜態變量和對象變量的超類。 當您擴展該類時,您可以覆蓋對象變量,並且該變量對於該類而言是唯一的,但是對於靜態變量而言則不同。 在擴展超類的所有類中,靜態變量都相同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.