匿名类在Java中获得最终变量的浅拷贝还是深拷贝?
我读过 并查看匿名类获取外部类变量的执行上下文的副本。不,我在哪里可以找到匿名类是否获取最终变量的浅副本或深副本。我尝试使用 使用一些android代码,但它可以是任何java平台。我尝试测试:匿名类在Java中获得最终变量的浅拷贝还是深拷贝?,java,deep-copy,anonymous-class,shallow-copy,Java,Deep Copy,Anonymous Class,Shallow Copy,我读过 并查看匿名类获取外部类变量的执行上下文的副本。不,我在哪里可以找到匿名类是否获取最终变量的浅副本或深副本。我尝试使用 使用一些android代码,但它可以是任何java平台。我尝试测试: public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceSt
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");
}
public类MainActivity扩展了AppCompatActivity{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tv=(TextView)findViewById(R.id.tv);
最终列表jason=newarraylist();
add(“我的第一个字符串”);
tv.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
Log.v(“mytag”,jason.get(0));
}
});
jason.clear();
add(“我的第二个字符串”);
}
}
当我单击文本时,日志中的输出是“我的第二个字符串”。
因此,当我从外部类更改列表时,它确实影响了匿名类。那么,我可以假设它总是得到一个浅拷贝吗?来自:
…局部类可以访问局部变量
(其中“本地类”也适用于“匿名类”)
请注意,它表示的是变量,而不是对象,因此没有进行深度复制
您可以使用以下代码进行实验验证:
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)
final ArrayList list=new ArrayList();
增加(5);
新建Runnable(){public void run(){list.add(6);}}}.run();
System.out.println(列表);//[5,6](如果是深度复制,则为[5])
()来自:
…局部类可以访问局部变量
(其中“本地类”也适用于“匿名类”)
请注意,它表示的是变量,而不是对象,因此没有进行深度复制
您可以使用以下代码进行实验验证:
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)
final ArrayList list=new ArrayList();
增加(5);
新建Runnable(){public void run(){list.add(6);}}}.run();
System.out.println(列表);//[5,6](如果是深度复制,则为[5])
()它获取变量的副本,而不是引用的对象变量引用。我不清楚,是否有人可以使用我的示例发布一个示例。您对变量和对象之间的区别感到满意吗?@KevinKrumwiede-这里指的是局部变量,而不是成员变量。虽然从语义上看它没有副本,但这可能是实现的工作方式(和是OP引用的post所使用的语言)。它获取变量的副本,而不是引用的对象的副本变量引用。我不清楚,是否有人可以使用我的示例发布一个示例。您对变量和对象之间的区别感到满意吗?@KevinKrumwiede-这里指的是局部变量,而不是成员变量。虽然从语义上看它没有副本,但这可能是实现的工作方式(并且是OP所指的帖子所使用的语言)。