实施例
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'
}
}
答案 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
名称访问Parent
中Child 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)