我有以下代码
一个可变的Person类,String和一个修改String和Person实例的方法
一个可变的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内存中
现在,string的引用传递给另一个方法,另一个方法尝试使用s =“foo”将内存位置(0x100)的内容更改为’foo’.这是发生了什么,还是在不同的内存位置创建“foo”?
java通过值引用引用吗?
解决方法
Java总是通过引用通过值NOT传递参数.
让我通过example解释一下:
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-声明一个名为f的F类型的引用,并将其分配给一个具有属性“f”的Foo类型的新对象.
Foo f = new Foo("f");
2-从方法方面,声明类型为Foo的名称为a的引用,最初分配给null.
public static void changeReference(Foo a)
在调用方法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中的作用:)