从抽象类继承静态变量

14
我有半打类都继承同一个抽象类。这个抽象类有一个指向某些JNI代码的静态变量,我只想在每个类实例化时加载一次。我理解这会导致该静态变量仅实例化一次,但我希望每个继承类都有自己的静态变量实例,对于给定的子类是唯一的。我想在我的抽象类中编写一些修改和/或释放该抽象类的代码。是否可能同时进行这两件事?
因此,如示例所示,我可以编写具有变量foo和printFoo方法的抽象类bar,然后按顺序实例化fooBar1、fooBar2和fooBar3,它们每个都扩展了bar类,并在静态块中将foo初始化为不同的值。如果我调用foobar1.printFoo,我希望打印由fooBar1构造函数初始化的静态值foo。
这在Java中能做到吗?

请在你的第一段落中关闭括号,那让我疯了! - HXCaine
一个指向某些代码的静态变量。你能详细解释一下吗?在Java中如何指向代码? - mdma
我正在使用jocl,这是OpenCL GPU代码的JNI包装器。为了告诉GPU要做什么,必须创建一个CL_program,它指向要运行的代码,并从此生成一个cl_kernel,表示GPU将使用的已编译内核。程序和内核变量是我静态拥有的,因为即时编译GPU代码需要太长时间。但是我想,在其他事情之间,抽象类中有一个释放方法,可用于释放代码。 - drew
2个回答

7
你可以近似实现它,但是你需要为每个子类单独设置静态变量,以防止子类覆盖其他子类的值。最简单的方法是通过一个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";
   }
}

2

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

    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接