Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java传递数组和对象值_Java_Arrays_Object - Fatal编程技术网

Java传递数组和对象值

Java传递数组和对象值,java,arrays,object,Java,Arrays,Object,只是想更好地理解,为什么swapA和swapB在主方法中打印时不更改值,而是通过其自身方法更改值。我以为对象和数组是通过引用传递的,当您交换它时,原始值也会改变?请参见 答案是否定的。Java是按值传递引用的 例如: public static void main(String[] args) { Foo[] foo1 = new Foo[1]; Foo[] foo2 = new Foo[1]; foo1[0] = new Foo(); foo2[0] = new

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

请参见

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

例如:

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
变量a的“指针”按值传递,并在方法范围内分配给b。更改b将更改b,但不会更改a。

请参见

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

例如:

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

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

JAVA总是按值传递


Java引用是按值传递的。

Java总是按值传递


Java引用是按值传递的。

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

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

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

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

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

顺便说一句,我见过的修改传入值的唯一例子是“swap”,这有点做作,因为它非常简单,编写泛型版本毫无意义


一般来说,修改传递给方法的值是如此罕见和混乱,以至于Java决定不需要它。并不是每个人都认为这是一个好的决定,但不管你是否同意通过引用传递是好的,你必须承认没有它会让你忘记一系列的顾虑(当你调用一个方法时,你的变量永远不会被修改)

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

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

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

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

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

顺便说一句,我见过的修改传入值的唯一例子是“swap”,这有点做作,因为它非常简单,编写泛型版本毫无意义

一般来说,修改传递给方法的值是如此罕见和混乱,以至于Java决定不需要它。并不是每个人都认为这是一个好的决定,但不管你是否同意通过引用传递是好的,你必须承认没有它会让你忘记一系列的顾虑(当你调用一个方法时,你的变量永远不会被修改)

请阅读。请阅读。