在Java中传递对象,并尝试以多种方式更改它们

在Java中传递对象,并尝试以多种方式更改它们,java,parameter-passing,new-operator,Java,Parameter Passing,New Operator,我知道一些Java是如何通过值传递的,以及将对象传递给方法如何改变对象的字段(例如Car类中的change1()) 然而,我的问题是为什么change2()和change3()不改变任何东西(特别是change3()) 每次JVM执行new操作符时,都会创建一个新的对象/实例。您正在change3(Car c)方法中创建汽车类型的新对象,并将该对象上的引用存储到局部变量c中。在此之后,在c上设置的任何内容都将修改新对象,而不是传递引用的对象 void change3(Car c) //recei

我知道一些Java是如何通过值传递的,以及将对象传递给方法如何改变对象的字段(例如Car类中的change1())

然而,我的问题是为什么change2()和change3()不改变任何东西(特别是change3())


每次JVM执行
new
操作符时,都会创建一个新的对象/实例。您正在
change3(Car c)
方法中创建汽车类型的新对象,并将该对象上的引用存储到局部变量
c
中。在此之后,在
c
上设置的任何内容都将修改新对象,而不是传递引用的对象

void change3(Car c) //receives the reference to the object you pass;
{
    c = new Car(888,"Audi"); //creates a new Car object and assigns reference to that **new object** to the variable c.
    c.price=80; //here, you're changing the price/name fields of different object.
    c.name="xxx";
}  
请注意,在
change1(carc)
中,您不会创建新对象,但在
change2(carc)
change3(carc)
中,您会[明确地]创建新对象。

编辑: Java是原语的传递值,对于对象,它是原始引用的副本

更具体地说,它是同一引用的副本,这意味着它是指向同一对象的同一引用的不同指针,因此如果在方法中更改对象,原始对象也将更改。但是如果您再次分配它(在您的例子中使用新的操作符),您将在方法中更新指针到一个新的引用,但是原始指针保持原样

关于StackOverflow上Java的另一个问题:)

传递值或引用可能来自C++语言中的理解和约定。 参数类型按值传递。
但是,当传递一个对象时,它不会传递整个对象,而是传递指向该对象的内存地址副本(也称为引用)。
通过引用传递参数意味着可以在方法内部更改该参数,并且该更改在该方法外部可见。
Java处于“按值传递”状态,因为更改/重新分配传递的参数在方法外部是不可见的

在下列情况下:

void change1(Car c)
{
    c.price=0;
    c.name="Changed";
}
price和name的赋值在该方法之外是可见的,因为该方法更改传递实例的成员字段,而不是实例本身

change2
change3
方法由于重新分配了传递的
c
参数而不能反映在它们之外。
重新分配传递的对象时,传递的对象参数后面的地址不再指向与最初传递的对象相同的对象。
类似地,不可能反映已传递原语的更改或重新分配,或者:

void change4(String name) {
    name = "whoopsie";
}
//and later calling it with:
c1.change4(c1.name);

更改对象的内部状态与更改对象本身不同。

我已经阅读了有关“按引用传递”和“按值传递”的内容,以及从堆创建空间的新方法,但我不知道仍在发生什么。。错误。Java总是按值传递。它在第二段中被指定为“引用的值”@EduardoPérez,但第一句话(大多数人会读到)是误导性的。“因此,如果你在方法中更改对象,原始对象也会更改”,这也不是那么回事。。。唯一的例外是“集合”,它是指向对象引用的指针,如
列表
数组
等。对不起,伙计,你的答案非常模糊,会让学习者更加困惑。首先,它说它有
通过引用传递
。然后它说,
这是对同一对象的不同引用
——这也是错误的。构成引用的地址值将被复制,这再次证明了Java总是按值传递的。感谢您回答我的问题!但是,如果我在main和chanage中写下“c2=c1.change3(c1);”将chnage3()函数返回c而不是void,那么为什么c2会被改变呢?一般来说,对帮助你的答案进行投票并接受你认为解决了你的问题/问题的答案总是一个很好的标准。不客气。因为如果在函数中从new接收对象后,本地变量(c)将消失,则表示您正在change2()方法中创建新对象。注意。。所以无论你以前做什么都会失去意义,因为你在那里分配了全新的对象。你在哪里写
c2=c1。更改(c1)
?我怀疑@Oscar的困惑不是关于
路过的策略。。而是一种新的对象创建范式:)
void change4(String name) {
    name = "whoopsie";
}
//and later calling it with:
c1.change4(c1.name);