您的位置:首页 > 编程语言 > Java开发

关于java引用型变量赋值

2014-09-28 14:34 260 查看
一般来说在java中赋值还是比较安全的(相对于C C++来说),

在java中将 一个对象作为参数传入一个函数中,然后给形参赋值 一般来说能成功

因为形参和实参指向的堆内存中的同一地址

刚才在集合赋值的时候出现问题 ,

List list=new arrayList<AccountInfo>();

AccountInfo ai=new AccountInfo();

for(AccountInfo temp : list)
{
temp=ai;
}
这段代码原意是将list的每一个子项都赋值成ai。

输出结果发现:   list的值没有发生任何变化

自己想下什么原因吧
栈变量 temp  先指向list 的某个节点
然后 又使 temp 指向 ai

这两个过程对 list 没有任何改变  就是简简单单的temp改变了一次引用的地址而已



对于引用型变量赋值 注意了  改变的只是其引用的地址

下面再看引用型变量内部非引用型数据   简单的传递引用赋值后,两个引用形变量指向同一段内存空间 所以改变list2 的值  list1的值同样改变了

package com.aaa.socketTest;

import java.util.ArrayList;
import java.util.List;

public class ListTest {
public static void main(String[] args){
//初始化list1
List<ClassA> list1=new ArrayList<ClassA>();
ClassA a=new ClassA(1, "aaa");
list1.add(a);
ClassA b=new ClassA(2, "bbb");
list1.add(b);
ClassA c=new ClassA(3, "ccc");
list1.add(c);

//将list1赋值给list2
List<ClassA> list2=new ArrayList<ClassA>();
for(int i=0;i<list1.size();i++)
{
list2.add(list1.get(i));
}

//改变list2的值
list2.get(0).j="ddd";
list2.get(1).j="eee";
list2.get(2).j="fff";

//输出list1 的值
for(int i=0;i<list1.size();i++)
{
System.out.println(list1.get(i).i+" : "+list1.get(i).j);
}
}
/*结果	1 : ddd
2 : eee
3 : fff      */

}
class ClassA{
public int i;
public String j;
public ClassA(int  i,String j){
this.i=i;
this.j=j;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息