2011-01-31 4 views
0

У меня есть активность с ArrayList, а также я увеличил вид, активность и просмотр в разделенных классах.ArrayList динамически меняется?

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, являются те, которые я передал конструктору .... НО, когда я добавляю значения в ArrayList Activity, значения также являются ainaylist представления !!!! Может ли это происходить? Почему это происходит ... Я очень смущен ...

ответ

2

В Java параметры действительно передаются по значению, но все не-примитивы в Java являются ссылками. Поэтому, когда вы передаете ссылку, ссылка (адрес памяти) передается по значению, а сетевой эффект - то, что объект или массив, на которые указывает эта ссылка, передается по значению.

Другими словами, ваш массив был эффективно передан по вызову - его же массив.

Edit: из комментариев:

переменная ar ссылки (указывает) массив. ar был передан в конструктор DrawView. Переменная ar была передана по значению, поэтому значение ar (адрес памяти массива) было скопировано в параметр конструктора a. Итак, теперь ar и a указывают на тот же массив, то есть эффективно передают массив по ссылке.

+0

приведенный выше код работает также с массивом, поэтому я догадываюсь, что и массив передан с ссылкой .... правильно? – stelios

+0

Да. Ваша переменная 'ar' ссылается (указывает на) массив. 'Ar' был передан конструктору' DrawView'. Переменная 'ar' была передана по значению, поэтому значение' ar' (адрес памяти массива) было скопировано в параметр конструктора 'a'. Итак, теперь 'ar' и' a' указывают на один и тот же массив, то есть эффективно передают массив по ссылке. –

+1

спасибо !!!! Теперь я понимаю ... вы были очень полезны !!! – stelios

Смежные вопросы