2016-03-06 24 views
1

我“读过enter link description here匿名类在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".

所以看来,当我从外部类改变列表确实影响了匿名类。那么我可以假设它总是会得到一个浅拷贝呢?

+5

它得到的* *变量,而不是的(引用)变量引用对象的副本至。 –

+0

即时通讯不清楚,有人可能会发布一个例子可能使用我的例子。 – j2emanue

+2

你对变量和对象之间的区别感到满意吗? –

回答

4

the Java tutorial

...本地类可以访问本地变量。

(其中 “本地班” 也适用于 “匿名类”)。

注意,它说变量,不对象。所以没有深层次的复制。


您可以用下面的代码用实验来验证这一点:

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) 

Live demo

+0

这正是我正在寻找的,谢谢。 – j2emanue