Наследование статической переменной из абстрактного класса - PullRequest
13 голосов
/ 14 апреля 2011

У меня полдюжины классов, которые расширяют один и тот же абстрактный класс. У абстрактного класса есть статическая переменная, указывающая на некоторый код JNI, который я хочу загрузить только один раз за создание экземпляров классов.

Исходя из того, что я понимаю, это приводит к тому, что создается экземпляр только одного экземпляра этой статической переменной, но я хочу, чтобы у каждого из расширяющихся классов был свой собственный статический экземпляр переменной, уникальный для данного дочернего класса. Я хочу написать некоторый код в моем абстрактном классе, который изменяет и / или освобождает абстрактный класс. Можно ли сделать обе эти вещи одновременно?

Так что в качестве примера я могу написать абстрактную строку классов с переменной foo и методом printFoo, который печатает содержимое foo. Затем я создаю экземпляры в порядке fooBar1, fooBar2 и fooBar3, каждый из которых расширяет класс bar и инициализирует foo различными значениями в статических блоках. Если я вызываю foobar1.printFoo, я хочу вывести статическое значение foo, инициализированное конструктором fooBar1.

Можно ли это сделать в Java?

Ответы [ 2 ]

6 голосов
/ 14 апреля 2011

Вы можете приблизить его, но вам понадобятся отдельные статические переменные для каждого подкласса, чтобы подклассы не перезаписывали значения друг друга.Проще всего абстрагироваться через геттер 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 голос
/ 13 марта 2012

У меня похожая проблема. Похоже, 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();

    }
}
...