方法调用后,对象状态不会改变
这个问题在这里已经有了答案:
比较这两种方法:
private static void hello(String t) {
t = "hello " + t;
}
private static void hello(CustomStringObject o) {
o.str = "hello " + o.str;
}
在第一种情况下,你正在为t
分配一个新值。 这对调用代码没有任何影响 - 您只需更改参数的值,并且所有参数都通过Java中的值传递。
在第二种情况下,您正在为o.str
分配一个新值。 这改变了o
的值所引用的对象内的字段的值。 调用者将看到该更改,因为调用者仍然具有对该对象的引用。
简而言之:Java总是使用按值传递,但是您需要记住,对于类,变量(或者其他表达式)的值是引用,而不是对象。 你不需要使用参数传递来看到这个:
Foo foo1 = new Foo();
Foo foo2 = foo1;
foo1.someField = "changed";
System.out.println(foo2.someField) // "changed"
这里的第二行将foo1
的值复制到foo2
- 两个变量引用同一个对象,因此使用哪个变量访问它并不重要。
这两种方法之间有一个重要的区别:使用hello(String)
你试图改变对String
的引用,并且用hello(CustomObject)
给定引用,你使用引用来改变对象的成员。
hello(String)
采用对一个参考String
。 在该函数中,您试图更改该引用指向哪个对象,但是您只更改引用的按值传递副本。 所以你的改变不会反映在方法之外。
hello(CustomObject)
被赋予一个对象的引用的副本,然后你可以使用它来改变实际的对象。 把它看作是改变对象的内容。 所以你的改变反映在调用者中。
给定一个对象的引用,你可以使用它暴露的方法/域来改变对象
因为对于字符串,您只是更改本地参数引用。
链接地址: http://www.djcxy.com/p/3517.html