我有一个带有ArrayList的Activity,而且我已经将View,Activity和View扩展为分离的类。
public class activity extends Activity{
private ArrayList<customObject> ar = new ArrayList<customObject>();
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
drawview = new DrawView(this,ar);
setContentView(drawview);//more code
}}
如你所见,我传递给了draview的构造函数我的活动的ArrayList,所以我可以处理ArrayList的对象has.i在两个类中给出了相同的ArrayList名称。(如果这很重要......)
class DrawView extends View {
private ArrayList<customObject> ar;
public DrawView(Context context,ArrayList<customObject> a) {
super(context);
this.ar=a;
}
//more code
}
现在是一个非常非常奇怪的事情....据我所知java是按值调用,所以我实际上无法传递存储我的arraylist的内存段...所以唯一的值应该是drawview可以看到我在构造函数上传递的那些....但是当我在Activity的ArrayList中添加值时,值也是视图的aaraylist! 这会发生吗?为什么会发生这种情况......我非常困惑......
答案 0 :(得分:2)
在Java中,参数确实是按值传递的,但Java中的所有非基元都是引用。因此,当您传递引用时,引用(内存地址)将按值传递,并且净效果是引用所指向的对象或数组已按值传递。
换句话说,你的数组实际上是通过引用调用传递的 - 它是相同的数组。
来自评论的编辑:
变量ar
引用(指向)数组。 ar
已传递给DrawView
构造函数。变量ar
是按值传递的,因此ar
(数组的内存地址)的值被复制到构造函数参数a
中。所以现在ar
和a
指向同一个数组,即通过引用有效地传递数组。