Java参数传递到底是传值还是传引用
Java中对象作为参数传递到底是传值还是传引用一直在网上饱受争议
首先来看基本类型作为参数传递
public class Test
{
public static void main(String[] args)
{
int a = 1;
System.out.println("a = "+a);
add(a);
System.out.println("a = "+a);
}
public static void add(int a)
{
a++;
}
}
输出
a = 1
a = 1
我们很明显地知道在Java中基本类型的传递是传值
再来看对象作为参数传递的第一个例子
public class Test
{
public static void main(String[] args)
{
StringBuilder s = new StringBuilder("Java后台开发");
System.out.println(s);
add(s);
System.out.println(s);
}
public static void add(StringBuilder s)
{
s.append(" is a good official account");
}
}
输出
Java后台开发
Java后台开发 is a good official account
从这个例子可以知道在main函数中调用add函数,对象的属性发生了改变,两次输出结果不一样
那我们这样就能简单的认为Java对象作为参数传递时是传引用吗?
对象作为参数传递的第二个例子
public class Test
{
public static void main(String[] args)
{
StringBuilder s = new StringBuilder("Java后台开发");
System.out.println(s);
add(s);
System.out.println(s);
}
public static void add(StringBuilder s)
{
s = new StringBuilder("Java后台开发 is a good official account");
}
}
输出
Java后台开发
Java后台开发
为什么这里两次输出没有改变呢?
下面要引出程序中内存的变化来理解
下面是对象作为参数传递的第一个例子中传参前后程序内存中的变化
在第一个例子中,main函数中的变量s保存了字符串的地址,add函数中的变量s接收到了字符串的地址,并通过这个地址在heap中找到“Java后台开发”这个字符串,并append另一个字符串,使得字符串前后发生了改变。
下面是对象作为参数传递的第二个例子中传参前后程序内存中的变化
在第二个例子中,main函数中的变量s保存了字符串的地址,add函数中的变量s接收到了字符串的地址,这时程序又在堆中新建了一个字符串“Java后台开发 is a good offical account”,并将这个字符串的地址给add函数中的变量s。
所以显而易见,原字符串不会发生改变。
所以结论是:
Java中基本类型的参数传递是值传递,对象类型则是把对象的地址复制一份传给被调用函数。
当然也可以直接理解为Java中参数传递就是值传递,因为地址也就是一个数字,也可以说是值。
欢迎关注微信公众号:Java后台开发
致力于分享原创计算机与软件开发知识及SSM、Spring cloud、Redis、微服务等Java后端开发技术
公众号里还有很多开发工具及学习资料