使用方法在Java中交换变量

时间:2014-08-21 18:35:39

标签: java object instance pass-by-reference swap

我知道Java类实例是通过引用传递的。我试图交换两个类实例,但它没有奏效。我不明白,如果他们通过引用传递,那么代码应该有效。我在这里缺少什么?

public class Swapper {

    public static void main(String[] args) {
        NormalClass na = new NormalClass(1235);
        NormalClass nb = new NormalClass(5468);
        System.out.println("Before: 1st Object -->");
        na.print_obj();
        System.out.println("Before: 2nd Object -->");
        nb.print_obj();


        NormalClass.swap(na,nb);


        System.out.println("After: 1st Object -->");
        na.print_obj();
        System.out.println("After: 2nd Object -->");
        nb.print_obj();

    }

}

class NormalClass{
    public int _ID;
    public static void swap(NormalClass a, NormalClass b){
        NormalClass temp;
        temp = a;
        a = b;
        b = temp;
    }
    public void print_obj(){
        System.out.println(this._ID);
    }
    NormalClass(int __id){
        this._ID = __id;
    }
}

2 个答案:

答案 0 :(得分:6)

  

我知道Java类实例是通过引用传递的

首先,您不会传递实例,而是引用它们。引用按值传递。

在您的方法中,您传递了对两个实例的引用,这两个实例创建了两个实例的副本。然后你交换了那些引用的副本。由于它们是按值传递的,因此不会影响原始引用,从而影响行为。仅供参考,Java中的所有内容都按值传递。

答案 1 :(得分:2)

您无法直接更新来电者参考。要进行这种交换,您可以传入一个数组。另外,我会覆盖toString()进行打印 -

public int _ID;

public static void swap(NormalClass[] arr) {
    NormalClass temp = arr[0];
    arr[0] = arr[1];
    arr[1] = temp;
}

@Override
public String toString() {
    return String.valueOf(this._ID);
}

NormalClass(int __id) {
    this._ID = __id;
}

public static void main(String[] args) {
    NormalClass[] arr = new NormalClass[] { new NormalClass(1235),
            new NormalClass(5468) };
    System.out.println("Before: 1st Object -->");
    System.out.println(arr[0]);
    System.out.println("Before: 2nd Object -->");
    System.out.println(arr[1]);

    NormalClass.swap(arr);

    System.out.println("After: 1st Object -->");
    System.out.println(arr[0]);
    System.out.println("After: 2nd Object -->");
    System.out.println(arr[1]);
}

输出

Before: 1st Object -->
1235
Before: 2nd Object -->
5468
After: 1st Object -->
5468
After: 2nd Object -->
1235