不变和传递价值

我有以下代码
一个可变的Person类,String和一个修改String和Person实例的方法

class Person{ int a = 8; public int getA() { return a; } public void setA(int a) { this.a = a; } @Override public String toString() { return "Person [a=" + a + "]"; } } 

 public class TestMutable { public static void main(String[] args) { Person p = new Person(); p.setA(34); String s = "bar"; modifyObject(s, p); //Call to modify objects System.out.println(s); System.out.println(p); } private static void modifyObject(String str, Person p) { str = "foo"; p.setA(45); } } 

输出符合预期。 它打印

  bar Person [a=45] 

现在,我的问题是

在你说str =“foo”的地方发生了什么

最初让我们假设s =’bar’,数据驻留在0x100内存中

现在将字符串的引用传递给另一个方法,另一个方法尝试使用s =“foo”将内存位置(0x100)的内容更改为“foo”。 这是发生了什么,或者’foo’是在不同的内存位置创建的?

java是否按值传递引用?

Java总是按值而不是通过引用传递参数。


让我通过一个例子解释一下:

 public class Main { public static void main(String[] args) { Foo f = new Foo("f"); changeReference(f); // It won't change the reference! modifyReference(f); // It will change the object that the reference variable "f" refers to! } public static void changeReference(Foo a) { Foo b = new Foo("b"); a = b; } public static void modifyReference(Foo c) { c.setAttribute("c"); } } 

我将逐步解释这个:

1-声明名为fFoo类型的引用,并将其分配给类型为Foo的新对象,其属性为"f"

 Foo f = new Foo("f"); 

在此处输入图像描述

2-从方法方面,声明了名为a的类型为Foo的引用,并且它最初被赋值为null

 public static void changeReference(Foo a) 

在此处输入图像描述

3-当您调用方法changeReference ,引用a将被分配给作为参数传递的对象。

 changeReference(f); 

在此处输入图像描述

4-声明名为b的类型为Foo的引用,并将其赋值给属性为"b" Foo类型的新对象。

 Foo b = new Foo("b"); 

在此处输入图像描述

5- a = b将引用a NOT f重新分配给其属性为"b"的对象。

在此处输入图像描述


6-当您调用modifyReference(Foo c)方法时,将创建引用c并将其分配给具有属性"f"的对象。

在此处输入图像描述

7- c.setAttribute("c"); 将更改引用c指向它的对象的属性,并且它是引用f指向它的同一对象。

在此处输入图像描述

我希望你现在明白如何将对象作为参数传递在Java中:)

modifyObject ,当你赋值给str ,你没有改变str ,你要设置它以使它指向另一个对象。 因为它是通过值传递的,所以你的modifyObject方法本地的str指针是main s指针的副本,所以当你改变前者时,它不会影响le。

另一方面,当涉及到pmodifyObject中的modifyObject仍然是modifyObject中的一个副本,但是两个指针都指向内存中的同一个对象,因此如果你从modifyObject调用一个方法,你’实际上是在改变p指向的东西。

有时人们在通过引用传递时会感到困惑。 可以更改引用引用的对象(给出引用传递的印象),但是不可能修改引用本身。 所以它仍然是价值传递。

在这个函数中调用“modifyObject(s,p);” 您正在将变量s的值发送到modifyObject方法的局部变量str。 因此,创建一个新变量并更改其值,但原始变量保持不变。