2016-06-04 3 views
0

Прошу прощения за такой глупый вопрос, но я не могу лучше описать свою проблему. У меня есть 2 класса:Имеет ли x = y x указатель на y?

//First Class 
    public class VKtracks extends Fragment { 

     RecyclerView list; 
     SongListAdapter listAdapter; 
     private ArrayList<song> songs = new ArrayList<>(); 
     MainActivity mainActivity; 

     public VKtracks(){ 

     } 

     @Override 
     public void onActivityCreated (Bundle savedInstanceState){ 
      super.onActivityCreated(savedInstanceState); 
      mainActivity = (MainActivity)getActivity(); 
      songs = mainActivity.songs; 
      Iterator<song> itr = songs.iterator(); 
      while (itr.hasNext()) { 
       song element = itr.next(); 
       if(element.getSource() == 0){ 
        itr.remove(); 
       } 
      } 
     } 

    //Second class 

public class Tracks extends Fragment { 


    RecyclerView list; 
    private MediaPlayer mp = new MediaPlayer(); 
    SongListAdapter listAdapter; 
    private ArrayList<song> songs = new ArrayList<>(); 
    ImageButton playButton; 
    boolean playerActive = false; 
    MainActivity mainActivity; 
    int mLastFirstVisibleItem = 0; 


    public Tracks() { 
    } 

    @Override 
    public void onActivityCreated (Bundle savedInstanceState){ 
     super.onActivityCreated(savedInstanceState); 
     mainActivity = (MainActivity)getActivity(); 
     songs = mainActivity.songs; 
     listAdapter = new SongListAdapter(getContext(),songs, mainActivity); 
     listAdapter.notifyDataSetChanged(); 
     list.setHasFixedSize(true); 
     LinearLayoutManager llm = new LinearLayoutManager(getActivity()); 
     list.setLayoutManager(llm); 
     list.setAdapter(listAdapter); 
    } 
} 

В обоих классах я получаю список песен из MainActivity. В классе Tracks я просто заполняю RecyclerView этим, а в VKtracks я перебираю ненужные элементы с помощью итератора и заполняю другое RecyclerView. В конце у меня есть 2 похожих фильтрационных списка. Если я прокомментирую фильтрующую часть в классе VKTracks, я получаю 2 похожих нефильтрованных списка.

Итак, почему это происходит?

Единственное, что я могу предположить, это то, что обе песни ArrayLists являются poiners для песен ArrayList в MainActivity.

ответ

3

Ваши аргументы верны. Указатели Tracks.songs, VKTracks.songs и MainActivity.songs все указывают на тот же список, поэтому изменение либо изменит все три. Попробуйте использовать конструктор копирования ArrayList в Tracks и VXTracks, чтобы создать три уникальных списка массивов. Для этого замените строку

songs = mainActivity.songs;

с

songs = new ArrayList(mainActivity.songs);

в обоих Tracks и VKTracks.

+1

@Tom Good catch. Я исправил описание. – Paul

0

Похоже, что у вас есть два подкласса Fragment и используйте его метод getActivity(), после инициализации с помощью «savedInstance».

Я предполагаю, что в обоих случаях атрибут «песни» дает вам точно такой же указатель. Поэтому, если вы изменяете список в одном месте, это изменяет его везде.

Чтобы остановить это поведение, попробуйте скопировать этот список перед изменением.

0

Вы правы, fragment.songs = mainActivity.songs точек фрагмента.songs к списку, содержащемуся в mainActivity.

Таким образом, фрагмент.songs.remove (песня) удаляет песню из этого списка.

Кроме того, изменение песни в фрагменте (например, добавление комментария) на самом деле изменит этот объект в списке mainActivity.songs.

Чтобы избежать этого, вам нужно будет создать копию списка и своих товаров.

0

Я не совсем уверен, что вы просите, но я постараюсь дать вам краткое объяснение объектов и примитивных значений.

Рассмотрим этот код:

int x; 
int y = 1; 
x = y; //x is now 1 
y = 2; //y is now 2, but x is still 1 
System.out.print(y); //prints 2 
System.out.print(x); //prints 1 

Поскольку int является примитивным значением, а не объект, писать x = y; не делает x пункт y поскольку y не является объектом, нет ничего, чтобы указать. x просто получает значение 2. Это то же самое, что и запись x = 2;.

Теперь рассмотрим этот код:

Person x; 
Person y = new Person("Johnny"); 
x = y; //x is now pointing to the same object as y 
y.changeName("Felicity"); //this changes the name of the object to Felicity 
y.printName(); //prints Felicity 
x.printName(); //also prints Felicity 

Поскольку Person является объектом, написание x = y;делает сделать эти две переменные указывают на тот же объект. Любые изменения, внесенные в объект через любую переменную, также видны через другую переменную.

0

Короче говоря,

Для примитивной переменной (например, INT, двойной, полукокса, логическое и т.д.): Нет

при использовании х = у,

х затем удерживать значение у, изменение у в дальнейшем не будет влиять на величину х

Для объекта (даже Integer, Double): Да

так

A x; 
A y = new A();// here y holds the reference of a new object of class A created. 
x = y // x then holds the reference of the same object of y 

так х и у «точка» того же объекта (они называются ссылки на термин в Java)

Боковые ноты:

Когда вы говорите «указывают на», если речь идет о C++ указатели, тогда ответ «Да» как для примитива, так и для объекта, но это вопрос Java.

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