Класс анонимного потока не может получить доступ к нестатическим переменным экземпляра - PullRequest
0 голосов
/ 03 мая 2018

Я пытаюсь получить доступ к переменной экземпляра внутри анонимного класса Thread. Я получаю ошибку здесь, говоря, чтобы сделать это статическим. Суть в том, что если я могу получить доступ к ключевому слову this в анонимном классе, который рассматривает его как своего текущего держателя объекта, то почему он не может получить доступ к переменным экземпляра нестатическим способом.

public class AnonymousThreadDemo {
    int num;

    public AnonymousThreadDemo(int num) {
        this.num = num;
    }

    public static void main(String[] args) {
        Thread thread = new Thread() {
            @Override
            public void run() {
                System.out.println("Anonymous " + num); // Why cant we access num instance variable
                System.out.println("Anonymous " + this); // This can be accessed in a nonstatic way
            }
        };
        thread.start();
    }
}

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

num не является статичным, что означает, что он будет следовать за статическим главным в памяти. Следовательно, когда main попытается указать num, она не будет доступна в памяти, т.е. Это все еще не будет объявлено.

0 голосов
/ 03 мая 2018

num - это поле non static, оно принадлежит конкретному экземпляру. Вы не можете ссылаться на него в static main напрямую, потому что метод static может быть вызван без создания экземпляра.

this фактически ссылается на thread, это локальная переменная, при выполнении run должен быть создан thread.

Если вы попробуете ссылку AnonymousThreadDemo.this в main, вы получите тот же результат:

public static void main(String[] args) {
    Thread thread = new Thread() {

        @Override
        public void run() {
            System.out.println("Anonymous " + AnonymousThreadDemo.this); // compile error
        }
    };
    thread.start();
}

Это нормально, вы можете ссылаться на локальную переменную в локальном классе:

public static void main(String[] args) {
    int num = 0;

    Thread thread = new Thread() {
        @Override
        public void run() {
            System.out.println("Anonymous " + num);
        }
    };
    thread.start();
}

Это нормально, вы можете ссылаться на нестатическое поле локального класса в его методе:

public static void main(String[] args) {
    Thread thread = new Thread() {
        int num = 0;

        @Override
        public void run() {
            System.out.println("Anonymous " + num);
        }
    };
    thread.start();
}

Проверьте это для более.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...