java参数是传值还是传引用这个问题,就像豆包是不是干粮一样,众说纷云,哈哈,但是不管java参数的类型到底是什么,一律是传递的参数的副本.也就是如果java传递的是值,那么传递的是值得副本,如果传递的是引用,那么传递的是引用的副本。
首先来了解一下:
java中数据类型分为基本数据类型和引用数据类型,基本数据类型在栈内存中,传递的是值,引用数据类型在堆内存中,传递的是地址,为什么呢?因为引用类型比较大,就像一个仓库,你没必要给别人一个仓库,只需要给别人一个钥匙就好了,所以基本数据类型就算是副本改变了,自己也不会改变,说了这么多,写几个Demo看一下实例:
public class Test1 {
public static void main(String[] args) {
int i = 1;
System.out.println(i);
fun(i);
System.out.println(i);
}
public static void fun(int i){
i = 5;
}
}
结果是:
1
1
通过这个例子可以看出,fun方法改变了传进来的参数值,但是对原来的参数并没有改变,只是改变了i的一个副本。
public class Test2 {
public static void main(String[] args) {
StringBuffer str = new StringBuffer("Hello");
fun(str);
System.out.println(str);
}
public static void fun(StringBuffer str){
str.append(", World");
}
}
结果:
Hello, World
为什么呢?
fun(str)调用了fun(StringBffer)方法,并将String作为参数传递了进去,这里的str是一个引用,java对于引用形式传递对象类型的变量时,实际上是将引用作为副本传递进去的,那么这个函数里面的引用副本所指向的是对象的地址,通过副本找到地址,并且进行了修改,就相当于修改了对象。
public class Test03 {
public static void main(String[] args) {
Test t = new Test();
t.first();
}
public void first() {
int i= 5;
Value v= new Value();
v.i = 25;
second(v, i);
System.out.println(" "+v.i);
}
public void second(Value v, int i){
i =0;
//通过引用的副本改变了原对象的值为20
v.i = 20;
//new出了一个新的对象
Value val = new Value();
//引用的副本指向了新的Object
v = val;
// val = v;
//打印出新对象的值
System.out.print(v.i + " "+i);
}
}
class Value {
public int i = 15;
}
执行结果:
15 0 20
对象v传递的是一份引用的副本,v.i=20,通过引用的副本改变了元对象的值为20,Value val = new Value();中,new引出了一个新的对象,然后执行v=val,相当于引用的副本指向了一个新的Object,所以,v.i=15是改变了新的Object的值,而不改变原对象的值。
可能还有很多纰漏,请大家指导,我会及时评论。