Java传递数组和对象值

时间:2010-12-16 01:32:08

标签: java arrays object

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方法中打印时不会改变值,但是它自己的方法更改了值。我认为当交换它时,对象和数组是通过引用传递的,原始值也会改变吗?

3 个答案:

答案 0 :(得分:4)

请参阅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。

答案 1 :(得分:1)

JAVA总是值得通过!!!

Java引用按值传递。

答案 2 :(得分:1)

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

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

Java是一致的,只需记住两件事:

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

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

顺便说一句,我见过的唯一修改传入值的情况是“交换”,这种做法很简单,因为写一个通用版本是没有意义的。

通常,修改传递给方法的值是如此罕见,令人困惑,Java只是决定你不需要它。并不是每个人都认为这是一个好的决定,但是天气你同意通过引用传递是好的或不是你必须承认没有它它会让你忘记一组问题(当你调用一个方法时你的变量永远不会被修改)