</pre><p>总结一下java参数传递几种情况给自己 有不对的地方 请指正 :)</p><p></p><p>------------- 情况1 --------------</p><pre name="code" class="java">
public class Pass {
static void add(int n){
++n;
}
public static void main(String[] args){
int n = 1;
add(n);
System.out.println(n);
}
}
由于JAVA 是值传递 也就是说会传递参数的一份拷贝 所以虽然在add方法内部n的值变化了 但是变化的只是n
的副本, 打印出来的n的值还是1
--------------- 情况 2 -----------------
public class Pass {
int i;
Pass(){
i = 2;
}
void add(int n){
i += n;
}
public static void main(String[] args){
Pass p = new Pass();
p.add(2);
System.out.println(p.i);
}
}
这里 由于i作为Pass类的成员变量 当p调用add方法时,p引用指向的堆中的i 已经发生变化 这时候i的值为 4
---------------- 情况 3 ----------------
public class Pass {
int i;
Pass(){
i = 2;
}
public void setI(Pass p){
p.i++;
}
public static void main(String[] args){
Pass p = new Pass();
p.setI(p);
System.out.println(p.i);
}
}
这里setI参数 传地的是p的引用副本 都指向一块实际的内存区域。i的值会变化成3
-------------- 情况4 ------------------
public class Pass {
int i;
Pass(){
i = 2;
}
public void setI(Pass p){
Pass p2 = new Pass();
p = p2;
}
public static void main(String[] args){
Pass p = new Pass();
p.setI(p);
System.out.println(p.i);
}
}
这种情况下 在setI方法内新产生了一个Pass引用p2和一块儿新的内存区域 此时副本p指向p2 所以没有变化 将打印2
---------------- 情况5 -------------------
public class Pass {
public static void setArr(int[] arr){
arr[0] = 1;
}
public static void main(String[] args){
int[] arr = new int[10];
for(int i:arr){
i = 0;
}
setArr(arr);
System.out.println(arr[0]);
}
}
这种情况和上面情况差不多 也是传递的是数组引用的拷贝 这样会改变数组第一个值 会打印1