Почему мой внутренний класс НЕТ статической переменной? - PullRequest
2 голосов
/ 23 марта 2010

Раньше у меня была проблема, когда внутренний анонимный класс не видел поля «внешнего» класса.Мне нужно было сделать окончательную переменную, чтобы сделать ее видимой для внутреннего класса.Теперь у меня противоположная ситуация.Во "внешнем" классе "ClientListener" я использую внутренний класс "Thread" и класс "Thread", у меня есть метод "run", и он действительно видит "earPort" из "внешнего" класса!Почему?

import java.io.IOException;
import java.net.*;
import java.io.BufferedReader;
import java.io.InputStreamReader;

public class ClientsListener {

    private int earPort;

    // Constructor.
    public ClientsListener(int earPort) {
        this.earPort = earPort;
    }

    public void starListening() {

        Thread inputStreamsGenerator = new Thread() {
            public void run() {
                System.out.println(earPort);
                try {
                    System.out.println(earPort);
                    ServerSocket listeningSocket = new ServerSocket(earPort);
                    Socket serverSideSocket = listeningSocket.accept();
                    BufferedReader in = new BufferedReader(new InputStreamReader(serverSideSocket.getInputStream()));
                } catch (IOException e) {
                    System.out.println("");
                }
            }
        };
        inputStreamsGenerator.start();      
    }

}

Ответы [ 2 ]

12 голосов
/ 23 марта 2010

Анонимные внутренние классы имеют доступ к статическим и переменным экземпляра.Если вы также хотите иметь доступ к локальным переменным, объявите их как окончательные.Вот как это работает:)

1 голос
/ 23 марта 2010

Ваш анонимный внутренний класс имеет доступ к атрибутам содержащего объекта.Все внутренние классы, которые не объявлены static, имеют неявный метод доступа.

Если вы хотите предотвратить это, вы можете объявить статический внутренний класс и создать экземпляр этого:

...