匿名 class 获取 Java 中 final 变量的浅拷贝还是深拷贝?
Does anonymous class get shallow or deep copy of final variables in Java?
我已阅读 enter link description here
并看到匿名 class 获取外部 class 变量的执行上下文的副本。没有我在哪里可以找到匿名 class 是否获得最终变量的浅拷贝或深拷贝。我尝试使用
使用一些 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".
所以看起来当我从外部 class 更改列表时它确实影响了匿名 class。那么我可以假设它总是得到一个浅拷贝吗?
... a local class has access to local variables.
(其中 "local class" 也适用于 "anonymous class")。
请注意,它说的是 变量,而不是 对象。所以没有进行深度复制。
您可以使用以下代码通过实验验证这一点:
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)
我已阅读 enter link description here
并看到匿名 class 获取外部 class 变量的执行上下文的副本。没有我在哪里可以找到匿名 class 是否获得最终变量的浅拷贝或深拷贝。我尝试使用 使用一些 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".
所以看起来当我从外部 class 更改列表时它确实影响了匿名 class。那么我可以假设它总是得到一个浅拷贝吗?
... a local class has access to local variables.
(其中 "local class" 也适用于 "anonymous class")。
请注意,它说的是 变量,而不是 对象。所以没有进行深度复制。
您可以使用以下代码通过实验验证这一点:
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)