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);
}
}

解决方案 »

  1.   

    经典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++的引用不同。
      

  2.   

    java只有值传递。区别只在于传的是真实值还是地址而已。 你上面的举例是有问题的,people类是对地址进行操作的,而在Swap中压根就没对a1和a2的地址做处理。int数据类型是对值进行操作的,所以在change中a1.age = 250;a2.age = 250;能够生效。
      

  3.   

    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个东西。 
    函数之间如果想【传递对象】,只能通过传递对象的地址来实现。
      

  4.   

    public static void Swap(People b1, People b2)
    People.Swap(a1, a2);
    我来说一下上面这两段代码
    当调用方法时,b1指向了a1,而方法里面,b1指向了其他人,并没有改变a1的指向,所以a1的值没有改变
      

  5.   


    java里面就只有传值而已,所谓的引用也是一个值。
    要闹明白到底什么情况,楼主应该对修改的“内容”特别清楚才行
    修改的是地址,还是地址里面的内容。另C++中是存在引用的! 
    swap(int &a,int &b)参数就是引用类型
      

  6.   

    java只有按值传递,所谓的按地址传递,也属于按值传递,只不过这个“值”是个地址。
      

  7.   

    看上图,方法的参数可以看做是另一个变量:a1_和a2_
    它们只是和传入参数拥有相同的对象地址而已;
    对于交换对象也只是对a1_和a2_这两个做交换罢了,不会影响a1,a2;
    但如果是通过内存地址去修改对象内部,如改变age的值,则会影响a1,a2;