对象是否通过Java集合中的引用传递?

时间:2013-12-30 04:32:46

标签: java oop object collections

我对我的代码片段有疑问:我的主要课程

public static void main(String[] args) {
    Test test = new Test();
    test.copyAtoB(3);
    test.setValueinAlist(30, 3);
    test.showValues(3, 0);   
    } 

这是我的虚拟课

public class Test {

    public ArrayList<MyClass> alist = new ArrayList<MyClass>();
    public ArrayList<MyClass> blist = new ArrayList<MyClass>();

    Test() {
    for (int i = 0; i < 10; i++) {
        MyClass myClass = new MyClass();
        myClass.setCount(i);
        alist.add(myClass);
    }
    }

    public void copyAtoB(int position) {
    MyClass o = alist.get(position);
    System.out.println("vlaue of count in object of myclass going to be copied "+o.getCount());
    blist.add(o);
    }

    public void setValueinAlist(int val,int position){
    MyClass myClass= alist.get(position);
    System.out.println(myClass.getCount()+" is changing to "+val);
    myClass.setCount(val);
    }

    public void showValues(int aPostion,int bPosition){
    System.out.println("Vlaue in a "+alist.get(aPostion).getCount()+"\n Vlaue in b "+blist.get(bPosition).getCount());
    }

}

这是我的对象类

public class MyClass {
    int count;

    public int getCount() {
        return count;
    }

    public void setCount(int count) {
        this.count = count;
    }
}

当我运行我的代码时,我期待像这样的输出

vlaue of count in object of myclass going to be copied 3
3 is changing to 30
Vlaue in a 30
 Vlaue in b 3

但我得到的是这个

vlaue of count in object of myclass going to be copied 3
3 is changing to 30
Vlaue in a 30
 Vlaue in b 30

你能帮我理解为什么我的观念错了吗?我没有编写代码来改变“blist”中的值,但它也会改变这是怎么回事?可能是我要求一个大错,但我无法抗拒

2 个答案:

答案 0 :(得分:4)

Java是按值传递的。对象类型变量的是对系统中某个对象的引用。在您的情况下,您将每个列表中的每个MyClass实例的引用副本放入,然后您使用其中一个引用值来更改两个列表指向的单个对象的字段

答案 1 :(得分:1)

test.copyAtoB(3);

alist中的索引3处引用元素的引用,并将其值的副本添加到blist的前面,即。指数0。

test.setValueinAlist(30, 3);

引用alist中索引3处的元素的引用,取消引用它以调用setCount方法,将对象的值更改为30。

test.showValues(3, 0);   

分别获取alistblist的索引3和0处元素的引用,取消引用它们以访问引用的对象并打印出其值。引用是针对同一个对象的。