public class StaticTest {
private  void setUser(List<User> a){
a.add(new User(-1,"root"));
for(User u:a){
 
 u.setId(0); //this.id=0
}
 
}

private void setInt(int a){
a=5;
}

private void setAl(List<Integer> al){
for(int a:al){
a=6;
}
}

 
public void getA(){
List<User> a=new ArrayList<User>();
 a.add(new User(1,"l"));
 a.add(new User(2,"w"));
 setUser(a);
 
 int i=3;
 List<Integer> al=Arrays.asList(1,2,3);
 
 
 
 setAl(al);
 setInt(i);

 
 System.out.println(a);
System.out.println(i);
System.out.println(al);
}


public static void main(String[] args) {
StaticTest st=new StaticTest();
st.getA();
}}
就是如上的代码我很奇怪的就是为什么
 setUser(a);
 setAl(al);
setInt(i);
这三个方法, 其中setUser里面的循环将参数的值给更改了,
就是for(User u:a){
 
 u.setId(0);  }
这里, 通过u的setid方法, a (User)这个参数的内容被更改了。但是其余的int和arraylist<Integer>就没有任何改动。

解决方案 »

  1.   

    引用啊引用,u引用了list中的一个个对象
      

  2.   

     setUser(a);  //这里的参数是一个引用对象, 对应的内存地址指向arraylist里面包含的对象
    在这里  for(User u:a){
                   u.setId(0);} 
    的实质是修改了引用对象的内存里的内容。
    相当于 for(int i=0;i<a.size;i++)
    {     User u=a.get(i);
    u.setId(1);  // 这个u.setId实质上修改了引用对象的内容
    }
      

  3.   

     private void setInt(int a){
            a=5;
        }这里传进去的只是一个常量, 实质上没有指向任何地址。这里无论如何修改a的值, 最后外面作用域的那个数值是不会改变的
      

  4.   

    ref 传递的话  才会改变实参。