Получает ли анонимный класс поверхностную или полную копию окончательных переменных в Java?

Я прочитал введите описание ссылки здесь

и увидите, что анонимный класс получает копии контекста исполнения переменных внешнего класса. Нет, где я могу найти, если анонимный класс получает поверхностную копию или полную копию окончательных переменных. Я попытался сделать тест с использованием некоторого кода Android, но это может быть любая платформа Java. Я пытался проверить это:

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    TextView tv = (TextView)findViewById(R.id.tv);

    final List<String> jason = new ArrayList<>();
    jason.add("my first string");
    tv.setOnClickListener(new View.OnClickListener(){


        @Override
        public void onClick(View v) {
            Log.v("mytag",jason.get(0));
        }
    });
    jason.clear();
    jason.add("my second string");

}

}

и вывод в журналах, когда я нажимаю на текст "my second string".

так что кажется, что когда я изменяю список из внешнего класса, это действительно влияет на анонимный класс. Так я могу предположить, что это всегда получает поверхностную копию тогда?

1 ответ

Решение

Из учебника по Java:

... локальный класс имеет доступ к локальным переменным.

(где "локальный класс" также относится к "анонимному классу").

Обратите внимание, что он говорит переменные, а не объекты. Так что глубокого копирования не происходит.


Вы можете проверить это экспериментально с помощью следующего кода:

final ArrayList<Integer> list = new ArrayList<>();
list.add(5);

new Runnable() { public void run() { list.add(6); } }.run();

System.out.println(list);   // [5, 6] (would be [5] if had been deep-copied)

( Живая демоверсия)

Другие вопросы по тегам