Переменные экземпляра абстрактного экземпляра Java Access

У меня есть abstract class с переменной, как следует:

public abstract class MyAbstractClass {

    int myVariable = 1;

    protected abstract void FunctionThatUsesMyVariable();
}

Затем, когда я иду, чтобы создать экземпляр моего class через следующий код, myVariable не видно

MyAbstractClass myClass = new MyAbstractClass() {

    @Override
    protected void FunctionThatUsesMyVariable() {
        // TODO Auto-generated method stub
    }
}; 

Что я делаю не так и как мне достичь того, чего я пытаюсь достичь?

4 ответа

Решение

Вы декларируете myVariable как имеющие доступ к пакету, и ваши 2 класса находятся в разных пакетах. Таким образом, переменная не видна наследующим классам. Вы можете объявить это с protected доступ, чтобы быть видимым или положить 2 класса в одном пакете.

public abstract class MyAbstractClass {

    protected int myVariable = 1;

    protected abstract void FunctionThatUsesMyVariable();
}

Кажется, работает на меня:

public class Test {
  public static abstract class MyAbstractClass {
    int myVariable = 1;
    protected abstract void FunctionThatUsesMyVariable();
  }

  public void test() {
    MyAbstractClass myClass = new MyAbstractClass() {
      @Override
      protected void FunctionThatUsesMyVariable() {
        myVariable = 2;
      }
    };
  }

  public static void main(String args[]) {
    new Test().test();
  }
}

Я подозреваю, что вы объявляете два класса в разных пакетах. Если это то, что вы хотите, то вы должны сделать переменную protected (или же public если вы должны). В качестве альтернативы - очевидно, - положить их в одной упаковке.

Объявите вашу переменную как защищенную. Это package-private по умолчанию.

Поскольку вы все еще создаете подкласс / расширяете абстрактный класс, и если вы не сделаете его защищенным, поле не наследуется.

Другие вопросы по тегам