Question

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?

Was it helpful?

Solution

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();
}

OTHER TIPS

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.

Because you're still subclassing/extending the abstract class and unless you make it protected, the field isn't inherited.

Declare your variable as protected. It's package-private by default.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top