Подтвердить что ты не робот

Наследование статической переменной из абстрактного класса

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

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

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

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

4b9b3361

Ответ 1

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

    }
}