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