Получает ли анонимный класс поверхностную или полную копию окончательных переменных в 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)