2014-10-05 4 views
-2

При передаче объектов через параметр он проходит по ссылке. Когда я вызываю метод add из списка, он сохраняет ссылку на объект в списке или новый экземпляр объекта в списке? Если он хранится по ссылке, то могу ли я иметь объект с двумя списками одновременно?Объекты, хранящиеся в списке по ссылке или по значению

+0

В Java все передается копией. Когда вы передаете ссылку на объект в качестве аргумента в метод, такая ссылка копируется, и теперь две ссылки, аргумент на сайте вызова и фактический параметр в методе указывают на один и тот же объект. Это может смутить вас и заставить вас поверить, что оно передается по ссылке. –

ответ

0

Все в Java передается по значению. Мы имеем:

  • Примитивы: такие, как int, boolean, double, ... и т.д.. Они могут легко восприниматься как принятые по значению.

  • объектов: Ссылки на объекты передаются по значению

Пример для объектов:

public static void main(String[] args) { 
    String first = "a"; 

    tryToChangeReference(a); 

    // The value of 'first' is still "a" 
    // In fact, if the value of 'first' was changed by 
    // the tryToChangeReference method, then you 
    // know that the language passes by reference 
    System.out.println(a); //outputs: a 
} 

private static void tryToChangeReference(String a) { 
    a = "b"; 
} 

Таким образом, отвечая на ваш вопрос ... Да, вы можете иметь объект существующий с двумя разные списки. Например:

public class Person { 
    private String name; 
    private int age; 

    public Person(String name, int age) { 
     this.name = name; 
     this.age = age; 
    } 

    public String getName() { 
     return name; 
    } 
    public void getAge() { 
     return age; 
    } 
    public void setAge(int newAge) { 
     this.age = newAge; 
    } 

    @Override 
    public String toString() { 
     return name + ":" + age; 
    } 
} 

// a main somewhere else 
public static void main(String[] args) { 
    List<String> firstList = new ArrayList<String>(); 
    List<String> secondList = new ArrayList<String>(); 

    Person tom = new Person("Tom", 20); 

    firstList.add(tom); 
    secondList.add(tom); 

    System.out.println(firstList.get(0)); //output: Tom:20 
    System.out.println(secondList.get(0)); //output: Tom:20 

    //we modify the Person object in firstList 
    firstList.get(0).setAge(33); 

    System.out.println(firstList.get(0)); //output: Tom:33 
    System.out.println(secondList.get(0)); //output: Tom:33 

    //we modify the Person object 'tom' 
    tom.setAge(99); 

    System.out.println(firstList.get(0)); //output: Tom:99 
    System.out.println(secondList.get(0)); //output: Tom:99 

    //we now change the reference value of the Person object 'tom' 
    tom = new Person("Sam", 44); 

    System.out.println(firstList.get(0)); //output: Tom:99 
    System.out.println(secondList.get(0)); //output: Tom:99 

    //how about this 
    secondList.set(0, new Person("Mat", 50); 

    System.out.println(firstList.get(0)); //output: Tom:99 
    System.out.println(secondList.get(0)); //output: Mat:50 
} 
Смежные вопросы