Java 中的值传递适用于基本数据类型,而引用传递则传递的是对象的地址值
这里我找到了几个自我感觉比较好的,关于值传递和引用传递的例题
1、StringBuilder
public class Test {
public static void main(String[] args) {
StringBuffer a = new StringBuffer("A");
StringBuffer b = new StringBuffer("B");
operator(a, b);
System.out.println(a + "," + b);
}
public static void operator(StringBuffer x, StringBuffer y) {
x.append(y); y = x;
}
}
判断这里的输出结果:
首先可以看到,向 operator 中传递的是一个对象,然后 x 的值发生了修改,y 只是一个指针又指向了 x 所指向的 a,b 的内容没有发生任何改变,因此输出的结果为:AB, B
如果需要画图来表示的话就是这个样子:
这是函数执行完成之后,已经弹出栈之后的画面。
2、char
public class Example {
String str = new String("good");
char[] ch = { 'a', 'b', 'c' };
public static void main(String args[]) {
Example ex = new Example();
ex.change(ex.str, ex.ch);
System.out.print(ex.str + " and ");
System.out.print(ex.ch);
}
public void change(String str, char ch[])
{
str = "test ok";
ch[0] = 'g';
}
}
这个和上一个的分析方式类似,传入函数的 str 和 ch 是一个引用类型的对象,在函数内部中,对 ch 的代码进行了修改,但是 str 又指向了一个新的字符串 “test ok” 因此字符串的结果没有变化,字符数组的结果发生了变化。
结果为:good and gbc
图示如下:
3、Integer
public class Tester{
public static void main(String[] args){
Integer var1=new Integer(1);
Integer var2=var1;
doSomething(var2);
System.out.print(var1.intValue());
System.out.print(var1==var2);
}
public static void doSomething(Integer integer){
integer=new Integer(2);
}
}
Integer 同样也是一个对象,传入了 integer 到 doSomething 之后,又在函数内部将原先指向 var2 所指向的地址值的参数,integer 又指向了 new Integer(2) 这个对象,对原来的 new Integer(1) 没有任何修改,因此返回的结果为 true。
这是函数调用还没有结束时的画面,如果结束了 integer 是要弹出去的。
还有一个图作为补充可以看一下:
参考博客:
- https://blog.csdn.net/qq_25827845/article/details/52605633