Java静态变量和继承

时间:2016-02-20 20:49:54

标签: java inheritance

我有一个基类,我定义了一个静态变量。从this post我知道扩展基类的每个类都将具有类变量(静态变量)的相同副本。有没有办法让每个扩展类都拥有它自己的#34;类变量的副本"?我尝试声明基类摘要但没有运气。

public abstract class BaseBlah{
    private static int number_of_threads;

} 

public class Blah1 extends BaseBlah{

}
public class Blah2 extends BaseBlah{

}

我的情况比示例稍微复杂一些,因为我希望每个扩展类抽象一个在其专用线程池中执行的常见任务类型,在这种情况下是类变量。

2 个答案:

答案 0 :(得分:7)

如果你给它一份该字段的副本,那么每个类都有它自己的副本,但不是自动的。

public abstract class BaseBlah{
    private static int number_of_threads;

} 

public class Blah1 extends BaseBlah{
    private static int number_of_threads;

}
public class Blah2 extends BaseBlah{
    private static int number_of_threads;

}

所有课程都有自己的number_of_threads

副本

注意:如果字段不是私有字段而不是继承字段,则称为hiding。 `

答案 1 :(得分:0)

使用基类中的HashMap,这是一种半hacky方式:

public abstract class BaseBlah{
    private static HashMap<Class<? extends BaseBlah>, Integer> numThreadsMap = new HashMap<>();

    protected int getNumThreads() {
         Integer i = numThreadsMap.get(getClass());
         return i != null ? i : 0;
    }

    protected void setNumThreads(int n) {
        numThreadsMap.put(getClass(), n);
    }
}

这样做的好处是,对于BaseBlah的未来实施类,没有什么可记住的。每当您创建一个新的扩展类时,它将“自动”为该类创建一个新的“静态”变量。

缺点是,为了使用这种方法,您必须从非静态上下文(即使用实例)访问它。它将表现为静态变量,但您不能将其视为静态变量。 static和类扩展不喜欢彼此(正如这个例子所证明的那样),所以完全整合两者总是很混乱。