当前位置: 代码迷 >> J2SE >> java传参到底是按值仍是按引用?最好学过C/C++的人来回答一下
  详细解决方案

java传参到底是按值仍是按引用?最好学过C/C++的人来回答一下

热度:25   发布时间:2016-04-23 22:23:52.0
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个东西。 
函数之间如果想【传递对象】,只能通过传递对象的地址来实现。

------解决方案--------------------
  相关解决方案