【问题标题】:Swapping variables in Java using a method使用方法在Java中交换变量
【发布时间】:2014-10-15 12:21:36
【问题描述】:

我知道在 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 类实例中不通过引用传递。相反,类引用是按值传递的:-)
  • 对不起,我很困惑。你能解释一下吗?
  • 这是一个simple explanation
  • 如果将对象传递给java中的方法,并在被调用方法中更改变量指向的对象,则调用方法中的变量不会改变。

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


【解决方案1】:

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

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

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

【讨论】:

    【解决方案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
    

    【讨论】:

    • 我的代码有问题...但是您提供的代码中发生了什么?
    • @Bishal 数组也是按值传递的,但由于它们是对象,所以值是一个引用。因此,您可以更改数组中的元素,而无需修改调用者的引用。这就是它起作用的原因。
    猜你喜欢
    • 2017-06-01
    • 2016-11-29
    • 2016-05-09
    • 1970-01-01
    • 2016-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多