为什么这个Java swap方法不影响原来的对象?

问题描述 投票:0回答:1

我正在努力理解最近面试中遇到的一个问题。我知道 Java 使用值传递,这意味着当您将对象传递给方法时,您正在传递引用的值。但这段代码让我很困惑:

class Double {
    public int x;
}

public class OOPS_3 {
    public static void swap(Double a, Double b) {
        Double temp = new Double();
        temp.x = a.x;
        a = b;
        b = temp;
    }

    public static void main(String[] args) {
        Double i = new Double();
        i.x = 10;
        Double j = new Double();
        j.x = 20;
        swap(i, j);
        System.out.println(i.x + " " + j.x);
    }
}

这是我不明白的:

对象引用的行为:如果a和b是对原始对象i和j的引用,为什么交换它们不会影响原始对象?我知道Java传递的是引用的值,而不是引用本身,但是为什么swap方法中的变化不能反映在它的外部呢?

对象字段的操作:如果我不重新分配a和b,而是直接修改a.x和b.x,它将按预期工作。但由于我正在处理对象引用,重新分配 a 和 b 不应该类似于直接更改它们的字段吗?关于 Java 如何处理这些引用,我缺少什么?

底层机制:如果交换方法仅操作引用的本地副本,为什么 temp.x 分配仍然有效?此分配与 a 和 b 的重新分配有何不同?我正在寻求更深入地了解 Java 在这种情况下如何管理对象引用和内存。

面试官提到这是 Java 中的一个“经典陷阱”,但我很难弄清楚为什么代码会这样运行,以及处理这种情况的最佳方法是什么。任何对此背后机制的见解,以及我将来如何更好地解决类似问题,将不胜感激。

java pass-by-value method-call
1个回答
0
投票

您向方法参数传递的是对对象的引用,而不是对象本身。因此,您无法交换对象,但可以更改对象的类变量。

© www.soinside.com 2019 - 2024. All rights reserved.