java传参到底是按值还是按引用?最好学过C/C++的人来回答一下java传参到底是按值还是按引用?这书的作者也是
java传参到底是按值还是按引用?最好学过C/C++的人来回答一下 java传参到底是按值还是按引用?这书的作者也是朵奇葩,先是说java是按值传递,然后就摆事实讲道理;第二阶段又说java是按引用传递,继续摆事实讲道理;第三阶段又说是按值传递,当然继续摆事实讲道理。 最后我只能自己做实验了。下面是我的实验代码,代码说明了什么呢?我也不知道!!反正两者都证明了!
import java.io.Console; import java.io.File; import java.io.FileNotFoundException; import java.io.PrintWriter; import java.util.*; class People { public int age; public static void Swap(People a1, People a2) { People tem; tem = a1; a1 = a2; a2 = tem; } public static void Change(People a1, People a2) { a1.age = 250; a2.age = 250; } } public class Empty { public static void main(String[]args) { People a1 = new People(); People a2 = new People(); a1.age = 1; a2.age = 2; //这里没能交换,看起来是按值传递 People.Swap(a1, a2); System.out.printf("%d \t %d", a1.age, a2.age); System.out.println(); //这里修改了变量,看起来是按引用传递 People.Change(a1, a2); System.out.printf("%d \t %d", a1.age, a2.age); } } [解决办法] 经典Java教材都称Java只有“按值传递”。换个参数名,更容易懂:
public static void Swap(People b1, People b2)
{
People tem;
tem = b1;
b1 = b2;
b2 = tem;
}
People.Swap(a1, a2); 调用的时候,a1赋给了b1,a2赋给了b2,所以b1和a1指向了同一个对象,b2和a2指向了同一个对象。b1 = b2;当然不会影响a1,但b1.age = 250;修改了所指的对象……
如果学过C++的引用的话,java的“引用”相当于C++的指针,和C++的引用不同。
[解决办法] java只有值传递。区别只在于传的是真实值还是地址而已。
你上面的举例是有问题的,people类是对地址进行操作的,而在Swap中压根就没对a1和a2的地址做处理。int数据类型是对值进行操作的,所以在change中a1.age = 250;a2.age = 250;能够生效。
[解决办法] 1、
Java 只有按值传递。
C\C++也只有按值传递。
所谓的传引用、传指针,本质也是传值。只不过值的内容是 内存地址 例如 0xfff之类的。
2、
函数的形式参数,是传入参数的拷贝。
即 Swap 的参数 a1 a2,是main函数中a1 a2的值的拷贝。
3、
引用变量之间拷贝的是【地址】
基本变啦之间拷贝的是 内存中的值 (被称为直接量)
4、
swap 为什么没有交换成功?
swap的形参 a1 a2 是 一个拷贝,对a1 a2进行修改 既不影响对象本身、也不影响main中
的a1 a2.
你将swap中a1 a2 都=null,也不会影响main中的a1 a2.
因为【你修改的是引用的地址,没有修改对象】其次【你修改的只是一个拷贝,没有修改传入参数】
5、
为什么change函数产生了修改效果?
change函数与swap函数的本质区别是:【swap修改的是引用地址】【change修改的是对象本身】
结论:
java 按值传递
函数形式参数是传入参数的拷贝
对象本身,与对象的地址 是2个东西。
函数之间如果想【传递对象】,只能通过传递对象的地址来实现。
[解决办法] 只有值传递 所谓的引用传递是对地址进行值传递[解决办法] 只有值传递的 lz[解决办法]
看上图,方法的参数可以看做是另一个变量:a1_和a2_ 它们只是和传入参数拥有相同的对象地址而已; 对于交换对象也只是对a1_和a2_这两个做交换罢了,不会影响a1,a2; 但如果是通过内存地址去修改对象内部,如改变age的值,则会影响a1,a2;