新人求助, 一个java的基础问题
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>就没有任何改动。
--------------------编程问答-------------------- 引用啊引用,u引用了list中的一个个对象 --------------------编程问答-------------------- 面对这种题,脑子里要生成一个 对象引用图 --------------------编程问答-------------------- 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实质上修改了引用对象的内容
}
--------------------编程问答-------------------- private void setInt(int a){
a=5;
}
这里传进去的只是一个常量, 实质上没有指向任何地址。
这里无论如何修改a的值, 最后外面作用域的那个数值是不会改变的 --------------------编程问答-------------------- --------------------编程问答-------------------- ref 传递的话 才会改变实参。
补充:Java , Java SE