我对我的代码片段有疑问:我的主要课程
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”中的值,但它也会改变这是怎么回事?可能是我要求一个大错,但我无法抗拒
答案 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);
分别获取alist
和blist
的索引3和0处元素的引用,取消引用它们以访问引用的对象并打印出其值。引用是针对同一个对象的。