方法调用后,对象状态不会改变

这个问题在这里已经有了答案:

  • Java是“通过引用传递”还是“按值传递”? 78个答案

  • 比较这两种方法:

    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

    上一篇: Object state does not change after method call

    下一篇: Does a List object get passed by reference?