疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

Java的值传递和引用传递


 

 

 
值传递:(形式参数类型是基本数据类型):方法调用时,实际参数把它的值传递给对应的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容,是两个不同的存储单元,所以方法执行中形式参数值的改变不影响实际参数的值。
 
引用传递:(形式参数类型是引用数据类型参数):也称为传地址。方法调用时,实际参数是对象(或数组),这时实际参数与形式参数指向同一个地址,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,这个结果在方法结束后被保留了下来,所以方法执行中形式参数的改变将会影响实际参数。
 
通俗的来说值传递其实就是一传递一些具体数据,也就是基本类型的数据(1,2,"哈哈"....),引用传递是你传递的你自己分装的对象,或者是数据集合,list,array,set。。。
 
我遇到的整好事对于list数据处理的问题,一言不合就上代码(测试代码):
 
1.下面的代码是我从我自己写的一个demo,详细的表述了值传递和引用传递:
 
复制代码
 1 @Test
 2     public void ck(){
 3         bean b = new bean("王","1");
 4         bean b2 = new bean("王","2");
 5         List<bean> list = new ArrayList<bean>();
 6         List<bean> list2 = new ArrayList<bean>();
 7         list.add(b);
 8         list.add(b2);
 9         
10         list2.addAll(list);
11         list2.get(0).setName("哈哈哈");
12         
13         for (bean bean : list2) {
14             System.out.println(bean.getName()+"ssss"+bean.getAge());
15         }
16         for (bean bean1 : list) {
17             System.out.println(bean1.getName()+"jjjjj"+bean1.getAge());
18         }
19     
20     }
复制代码
 bean类
 
复制代码
 1 public class bean {
 2 
 3     private String name ;
 4     private String age;
 5     
 6     
 7     
 8     
 9     
10     
11     public bean() {
12         super();
13     }
14     public bean(String name, String age) {
15         super();
16         this.name = name;
17         this.age = age;
18     }
19     public String getName() {
20         return name;
21     }
22     public void setName(String name) {
23         this.name = name;
24     }
25     public String getAge() {
26         return age;
27     }
28     public void setAge(String age) {
29         this.age = age;
30     }    
31 }
复制代码
 按我们正常思路来说,list应该输出俩个
 
list:
 
王ssss1
王ssss2
 
list2:
 
哈哈哈ssss1
王ssss2
 
但是:看我的运行结果
 
1 哈哈哈ssss1
2 王ssss2
3 哈哈哈jjjjj1
4 王jjjjj2
 可以看到虽然只是修改了list2中的一个元素,但是list中的元素数据也被修改了,有同学可能就会说了list.addAll的问题,其实不是,重点就是bean这个,list2.addAll(list)
这个方法其实是给list2赋值的bean的内存指针而不是把值拷贝到了list2的内存块中,也就是我们说的这里发生了引用传递而不是值传递,所以修改了list2中元素的值,也就修改
 
了bean对象元素的值,list输出元素的值当然会改变,后来我是这样解决的:
 
复制代码
 1 @Test
 2     public void ck(){
 3         bean b = new bean("王","1");
 4         bean b2 = new bean("王","2");
 5         List<bean> list = new ArrayList<bean>();
 6         List<bean> list2 = new ArrayList<bean>();
 7         list.add(b);
 8         list.add(b2);
 9         
10         for(int i=0;i<list.size();i++){
11             bean bn = new bean();
12             bn.setAge(list.get(i).getAge());
13             bn.setName(list.get(i).getName());
14             list2.add(bn);
15         }
16         list2.get(0).setName("哈哈哈");
17         
18         for (bean bean : list2) {
19             System.out.println(bean.getName()+"ssss"+bean.getAge());
20         }
21         for (bean bean1 : list) {
22             System.out.println(bean1.getName()+"jjjjj"+bean1.getAge());
23         }
24     
25     }
26     
复制代码
在在list赋值给list2的时候,我把bean对象新new了一个并且遍历list中的bean属性值给新new的这个bean对象,这样传递的是基本类型数据也就是copy到新new的bena内存块中,这样list2在怎么修改也不会影响到list中的值,因为他们包涵的bean对象是两不同指针的对象,这是修改后的输出结果:
 
1 list2:
2 哈哈哈ssss1
3 王ssss2
4 list:
5 王jjjjj1
6 王jjjjj2