有很多人看不懂java值传递还是引用传递,可能因为参数传递导致问题,而java参数传递本质是赋值。今天带你简单看下java参数传递。
一、.基本类型参数传递
这样形参传递
public static void main(String [] args) {
int a = 1;
test(a);
System.out.println(a);
}
static void test(int p){
p = 3;
}
结果:a=1,方法并没有改变a的值。
实际过程是这样的
public static void main(String [] args) {
int a = 1;
int p = 0;
p = a;
p=3;
System.out.println(a);
}
结果 :
1
这样看清楚了么?
a的值没用被改变非常正常。
2.引用类型参数传递
public static void main(String[] args) {
ArrayList<String> s = new ArrayList();
Collections.addAll(s, "1", "2", "3");
test(s);
System.out.println(s.size());
test2(s);
System.out.println(s.size());
}
public static void test(ArrayList<String> p) {
p.add("4");
}
public static void test2(ArrayList<String> c) {
c=null;
}
结果:
4
4
第一次 s的值被改变了,第二次 s的值未被改变,为什么呢?
实际上代码的过程可以看成是这样
public static void main(String[] args) {
ArrayList<String> s = new ArrayList();
Collections.addAll(s, "1", "2", "3");
ArrayList<String> p = null;
p = s;
p.add("4");
System.out.println(s.size());
p=null;
System.out.println(s.size());
}
结果:
4
4
所以,java参数传递本质是赋值。因为每个方法在栈中都是一个栈帧,里面保存自己的变量,所有参数传递的本质就是把上个方法所要传的的参数 赋值给新的方法参数。
而赋值的本质是copy一个副本。基本类型copy基本类型的参数,引用类型copy引用参数再堆中的实际地址。