在Java中使用方法交换变量



我知道在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;
    }
}

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

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

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

不能直接更新调用者引用。要进行这种交换,可以传入一个数组。此外,我将重写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

最新更新