Reputation: 7037
I have an abstract class
with a variable like follows:
public abstract class MyAbstractClass {
int myVariable = 1;
protected abstract void FunctionThatUsesMyVariable();
}
Then when I go to instantiate my class
through the following code, myVariable
cannot be seen:
MyAbstractClass myClass = new MyAbstractClass() {
@Override
protected void FunctionThatUsesMyVariable() {
// TODO Auto-generated method stub
}
};
What am I doing wrong and how can I achieve what I am trying to achieve?
Upvotes: 2
Views: 12250
Reputation: 15230
You are declaring myVariable
as having package access and your 2 classes reside in different packages. Thus the variable is not visible to inheriting classes. You can declare it with protected
access to be visible or put the 2 classes in the same package.
public abstract class MyAbstractClass {
protected int myVariable = 1;
protected abstract void FunctionThatUsesMyVariable();
}
Upvotes: 7
Reputation: 2317
Declare your variable as protected. It's package-private
by default.
Upvotes: 1
Reputation: 65803
Seems to work for me:
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();
}
}
I suspect you are declaring the two classes in different packages. If that is what you want then you should make the variable protected
(or public
if you must). Alternatively - obviously - put them in the same package.
Upvotes: 2
Reputation: 1283
Because you're still subclassing/extending the abstract class and unless you make it protected, the field isn't inherited.
Upvotes: 1