从抽象类inheritance静态变量

我有六个类,它们都扩展了相同的抽象类。 抽象类有一个静态变量,指向一些JNI代码,我只想在每个类的实例化时加载一次。

根据我的理解,这导致实例化这个静态变量的一个实例,但我想要的是每个扩展类都有自己的变量的静态实例,该实例对于给定的子类是唯一的。 我想在我的抽象类中编写一些代码来修改和/或释放抽象类。 是否有可能同时做这两件事?

因此,作为一个例子,我可以编写一个带有变量foo的抽象类栏和一个打印foo内容的printFoo方法。 然后我按顺序实例化fooBar1,fooBar2和fooBar3,每个扩展bar类并将foo初始化为静态块中的不同值。 如果我调用foobar1.printFoo我想打印由fooBar1构造函数初始化的foo的静态值。

这可以在java中完成吗?

您可以对其进行近似,但是每个子类都需要单独的静态变量,以阻止子类覆盖其他每个值。 最简单的方法是通过getter getFoo 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"; } } 

我有一个类似的问题。 看起来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(); } }