我有六个类,它们都扩展了相同的抽象类。抽象类有一个静态变量,指向一些JNI代码,我只想在每个类的实例化时加载一次。
据我所知,这导致这个静态变量的一个实例被实例化,但我想要的是每个扩展类都有自己的变量静态实例,这个实例对于给定的子类是唯一的。我想在我的抽象类中编写一些代码来修改和/或释放抽象类。是否有可能同时做这两件事?
因此,作为一个例子,我可以编写一个带有变量foo的抽象类栏和一个打印foo内容的printFoo方法。然后我按顺序实例化fooBar1,fooBar2和fooBar3,每个扩展bar类并将foo初始化为静态块中的不同值。如果我调用foobar1.printFoo
我想打印由fooBar1构造函数初始化的foo的静态值。
这可以在java中完成吗?
答案 0 :(得分:6)
您可以近似它,但是每个子类需要单独的静态变量,以阻止子类覆盖其他每个值。最简单的方法是通过getter getFoo
对其进行抽象,以便每个子类从正确的位置获取foo。
像这样的东西
abstract class Bar
{
// you don't have to have this in the base class
// - you could leave out the variable and make
// getFoo() abstract.
static private String foo;
String getFoo() {
return foo;
}
public void printFoo() {
System.out.print(getFoo());
}
}
class Foo1 extends Bar
{
static final String foo1;
public String getFoo() {
return foo1; // return our foo1 value
}
public Foo1() {
foo1 = "myfoo1";
}
}
class Foo2 extends Foo1
{
static final String foo2;
public String getFoo() {
return foo2; // return our foo2 value
}
public Foo2() {
foo2 = "myfoo2";
}
}
答案 1 :(得分:1)
我有类似的问题。看起来Java无法隔离静态成员(属性)。我最后添加了一个抽象方法而不是属性:
public abstract class Abs {
public void printX() {
System.out.println("For " + this.getClass() + " x=" + getX());
}
protected abstract Integer getX();
}
public class A extends Abs {
protected static Integer x = 1;
@Override
protected Integer getX() {
return x;
}
}
public class B extends Abs {
protected static Integer x = 2;
@Override
protected Integer getX() {
return x;
}
}
public class test {
public static void main(String args[]) {
Abs a = new A();
a.printX();
Abs b = new B();
b.printX();
Abs c = new A();
a.printX();
b.printX();
c.printX();
}
}