我知道在Java中,一切都是通过价值传递的.但对于对象,它是传递的对象的引用值.这意味着有时候一个对象可以通过参数进行更改,这就是为什么人们说,永远不要修改参数.
但在下面的代码中,会发生一些不同的事情. 当你回到时,sin changeIt()不会改变main():
public class TestClass {
static String str = "Hello World";
public static void changeIt( String s ) {
s = "Good bye world";
}
public static void main( String[] args ) {
changeIt( str );
System.out.println( str );
}
}
Run Code Online (Sandbox Code Playgroud)
我猜 - 我想要确认 - 当你说它s = "something"是相同或相当于说String s = new String("something").这是为什么s不改变?它是否在本地分配了一个全新的对象,一旦退出就会被丢弃changeIt()?
当你说 s = "something" 时,它与 String s = new String("something") 相同或等效
是的,差不多。(尽管 JVM 可能会进行优化,以便多次使用的相同字符串文字引用相同的 String 对象)。
这就是 s 不改变的原因吗?它是否在本地分配了一个全新的对象,一旦退出changeIt(),该对象就会被丢弃
是的。正如你所说,Java 中的所有内容都是按值传递的,甚至是对象的引用。s因此, in 中的 变量changeIt( String s )与您在 main() 中使用的值不同str,它只是 changeIt 方法中的局部变量。设置该引用来引用另一个对象不会影响 的调用者changeIt。
请注意,在分配不同的对象之前,引用的String 对象仍然与进入方法时引用s的 String 相同。strchangeIt()s
还有一件事您需要注意,那就是字符串是不可变的。这意味着您对字符串对象调用的任何方法都不会更改该字符串。例如,在您的changeIt()方法中调用s.toLowerCase()也不会影响调用者。这是因为 String.toLowerCase() 不会更改对象,而是返回一个新的 String 对象。
| 归档时间: |
|
| 查看次数: |
129 次 |
| 最近记录: |