问大家一个弱智问题,我写了一个简单的数值交换的小方法,可是我运行后发现数值交换根本没有成功,特在此请教大家是怎么回事,谢谢!
static void swap(int x, int y){
int temp;
temp = x;
x = y;
y = temp;
}

public static void main(String[] args){
int a = 3, b= 8;
swap(a, b);
System.out.println("a = " + a + ", b = " + b);
}

解决方案 »

  1.   

    因为java只有值传递,c/c++那套没用
      

  2.   

    可是java不是说是传引用吗?我还是没明白。
    据我理解C语言里参数是传值的,放在这儿确实没有用。
      

  3.   

    static void swap(int x, int y){ 
    int temp; 
    temp = x; 
    x = y; 
    y = temp; 
    System.out.println("a = " + x + ", b = " + y); } 
    你就会发现改变了,原因一楼说了
      

  4.   

    JAVA里基本类型最为参数传递的是形参的拷贝,C里面是变量的地址
    改变一个拷贝的值不会影响到原来实参的值呀
      

  5.   

    int a = 3, b= 8; //这里的a,b实际参数
    swap(a, b); //这里的a,b是形参
    System.out.println("a = " + a + ", b = " + b); 实际参数和形参是不同的变量来的!
      

  6.   

    JAVA程序语言对对象采用的不是引用调用,
    实际上,对象引用进行的是值传递。
      

  7.   

    参数传递引用可以改变引用指向的对象状态class SwapAB {
        public int a;
        public int b;
    }public class Test {
        static void swap(SwapAB aClass){ 
            int temp; 
            temp = aClass.a; 
            aClass.a = aClass.b; 
            aClass.b = temp; 
        }     public static void main(String[] args){ 
            SwapAB swapAB = new SwapAB();
            swapAB.a = 3;
            swapAB.b= 8; 
            swap(swapAB); 
            System.out.println("a = " + swapAB.a + ", b = " + swapAB.b); 
        }
    }这样写很不规范,只是为了说明问题
    有人会说JAVA只有传值,这点我也同意,只是在初学的时候还是说明下传递引用值的时候是可以改变对象状态的,而不是就认为是传值引起与基本类型的混淆。所以如果swap两个对象的指向是不可以的,因为他传递的同样是引用值的拷贝
      

  8.   

    swap 函数在 Java 中无法实现!
      

  9.   


    这位仁兄请允许我打破砂锅,为什么传数组行呢?而我传其它对象不行呢?比如:static void swap(String x, String y) {
    String temp;
    temp = x;
    x = y;
    y = temp;
    } public static void main(String[] args) {
    String a = new String("a");
    String b = new String("b");
    swap(a, b);
    System.out.println("a = " + a + ", b = " + b);
    }
      

  10.   

    说起来,既然是使用的java,就没必要考虑swap的实现这类问题吧。
    参数传递用多了就记住了。
      

  11.   

    请允许我告诉lz,别想了,Java不可能做到的。C++, C, C#都可以。
      

  12.   


    不好意思,ref是C#的。。羞愧啊!!
      

  13.   

    是的,C是可以的,比如:swap(x, y)
    int *x, *y;
    {
        int temp;
        temp = *x;
        *x = *y;
        *y = temp;    
    }
    main()
    {
        int a = 8, b = 2;
        swap(&a, &b);
        printf("a = %d, b = %d", a, b);
    }但是就是不明白java用数组传递进去就可以,而其它的类型传递进去就不可以,比如:static void swap(int[] array, int x, int y) {
    int temp;
    temp = array[x];
    array[x] = array[y];
    array[y] = temp;
    }public static void main(String[] args) {
    int[] array = {2, 5, 9};
    swap(array, 0, 1);
    System.out.println("array[0] = " + array[0] + ", array[2] = " + array[2]);
    }
      

  14.   

    Java的基础类型(int、 char等)是传值引用
      

  15.   

    不好意思,应该是swap(array, 0, 2);
      

  16.   

    因为JAVA中只有值传递这个概念!
      

  17.   

    这位兄弟,那请问包装类呢?比如我之前举得例子String.
      

  18.   

    是不是在java中既有值传递和引用传递?基础类型用值传递,非基础类型用引用(即类),谢谢!
      

  19.   

    值类型,引用类型的问题。
    分配在栈里的都是值类型。在栈中new的都是引用类型。
      

  20.   

    java里都是值传递,
    只不过这个值是什么的问题?数值:引用.
      

  21.   


    其实数组名字不就是数组的地址吗?相当于传址了。不过JAVA没有传址一说,好像又打破了,晕,我也晕了
      

  22.   

    java只有值传递
    没有引用传递
      

  23.   

      heh ,我说说个人的理解!  
    我觉得值传递和引用传递都只是理解的问题!只要在知道那个传进去的参数里面装的是值还是地址!
    就好像基本类型(如int,char,long)他们都分配在栈中,里面装的就是赋给它们的值,而不同的是,其他的引用(在栈中)里面装的是能找到(如String,Long,Integer)new出来的对象(在堆中)的地址,同样数组也是这样的道理。所以我的理解是传的都是里面的内容。只是内容是值还是地址!
      

  24.   

    Java参数传递机制就是传值,对形参的改变不会影响到实参. 这种参数传递就是copy的过程. 值类型的是copy值,引用类型的copy地址. 但是形参是不会影响实参的
      

  25.   

    因为在swap(x,y)这个方法里,x,y是a,b的副本,通过这个方法交换了x,y的值,但并没有影响到a,b.
    而如果x,y是引用的副本的话,它们也只是交换了自己的指向,比如说a及副本x本来是指向Objicet1,b及副本y本来指向Object2,交换后,x就会指向Object2,y就会指向Object1.但是并没有影响到a,b的指向。
    public class Test1 { public static void change(int num){
    num = num*2;
    }

    public static void change(Employee e){
    e.setSalary(5000);
    }

    public static void swamp(Employee x,Employee y){
    Employee temp = x;
    x = y;
    y = temp;
    }

    public static void main(String[] args) {
    int number = 10;
    change(number); //调用此方法不会改变number的值
    System.out.println(number); 
    Employee a = new Employee("Jim",3000);
    Employee b = new Employee("Tom",4000);
    change(a);//调用此方法将会改变a对象里的salary值
    swamp(a,b);//调用此方法不会改变存储在变量a,b中的对象的引用
    System.out.println(a.getSalary());
    }}class Employee {
    private String name;
    private int salary;
    public Employee(String name,int salary){
    this.name = name;
    this.salary = salary;
    }
    public String getName() {
    return name;
    }
    public void setName(String name) {
    this.name = name;
    }
    public int getSalary() {
    return salary;
    }
    public void setSalary(int salary) {
    this.salary = salary;
    }

    }
      

  26.   

    因为是java不是C++。我也很不习惯的说。