【问题标题】:Java Passing array and object valueJava 传递数组和对象值
【发布时间】:2010-12-16 01:32:08
【问题描述】:
public static void main(String[] args) {
    Foo[] foo1 = new Foo[1];
    Foo[] foo2 = new Foo[1];
    foo1[0] = new Foo();
    foo2[0] = new Foo();
    foo1[0].x = 1;
    foo2[0].x = 2;
    swapA(foo1, foo2);
    System.out.println("Swap A " + foo1[0].x + " " + foo2[0].x);
    swapB(foo1[0], foo2[0]);
    System.out.println("Swap B " + foo1[0].x + " " + foo2[0].x);
    swapC(foo1[0], foo2[0]);
    System.out.println("Swap C " + foo1[0].x + " " + foo2[0].x);
    swapD(foo1, foo2);
    System.out.println("Swap D " + foo1[0].x + " " + foo2[0].x);
}

public static void swapA(Foo[] o1, Foo[] o2) {
    Foo[] temp;
    temp = o1;
    o1 = o2;
    o2 = temp;
    System.out.println("Swap A " + o1[0].x + " " + o2[0].x);
}

public static void swapD(Foo[] o1, Foo[] o2) {
    Foo temp;
    temp = o1[0];
    o1[0] = o2[0];
    o2[0] = temp;
    System.out.println("Swap D " + o1[0].x + " " + o2[0].x);
}

public static void swapB(Foo o1, Foo o2) {
    Foo temp;
    temp = o1;
    o1 = o2;
    o2 = temp;
    System.out.println("Swap B " + o1.x + " " + o2.x);
}

public static void swapC(Foo o1, Foo o2) {
    int temp;
    temp = o1.x;
    o1.x = o2.x;
    o2.x = temp;
    System.out.println("Swap C " + o1.x + " " + o2.x);
}


Swap A 2 1
Swap A 1 2
Swap B 2 1
Swap B 1 2
Swap C 2 1
Swap C 2 1
Swap D 1 2
Swap D 1 2

只是想更好地理解,为什么swapA和swapB在main方法中打印时不改变值,而是通过自身方法改变值。我以为对象和数组是通过引用传递的,当你交换它时原始值也会改变?

【问题讨论】:

标签: java arrays object


【解决方案1】:

请看Is Java "pass-by-reference" or "pass-by-value"?

答案是否定的。 Java 是按值传递引用。

例如:

String a = "a string";
public void change(String b) {
    b = "some other string";
}
change(a);

指向变量 a 的“指针”是按值传递的,并在方法范围内分配给 b。改变 b 会改变 b,但不会改变 a。

【讨论】:

    【解决方案2】:

    JAVA 总是通过价值传递!!!

    Java 引用按值传递。

    【讨论】:

      【解决方案3】:

      按引用传递/按值传递是一个非常讨厌的术语。

      hvgotcodes 回答“引用按值传递”是最明显的证明。

      Java 是一致的,只要记住两点:

      1) 您始终可以将传入的变量重新分配给任何方法,而不会影响调用者。

      2) Java 不会复制对象,因此如果您有一个给定的实例传递给您,修改该实例中的数据将为每个人修改它。

      顺便说一句,我见过的修改传入值的唯一情况是“交换”,这有点做作,因为它非常简单,以至于编写通用版本毫无意义。

      一般来说,修改传递给方法的值非常少见且令人困惑,以至于 Java 决定您不需要它。不是每个人都认为这是一个好的决定,但是如果你同意通过引用传递是好的,你必须承认没有它会让你忘记一组问题(当你调用一个方法时,你的变量永远不会被修改)

      【讨论】:

        猜你喜欢
        • 2013-03-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-02
        • 2011-03-19
        相关资源
        最近更新 更多