通过"参考价值"?需要一些澄清

ksn*_*tum 5 java

我知道在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()

nos*_*nos 4

当你说 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 对象。