通过私有方法返回更新后的变量

时间:2019-02-05 06:05:13

标签: java

我今天注意到了一种情况。当我们在私有方法上传递参数时,实体将返回修改后的值,而不是原始值。

这是我的示例代码,

/**
 * @author gowthami
 *
 */
public class Test {

    /**
     * @param args
     */
    public static void main(String[] args) {

        String s = "gowth";
        System.out.println("before " + s);
        concateMe(s, "ami");
        System.out.println("after " + s);

        BeanTest bt = new BeanTest();
        bt.setId("1");
        System.out.println("before");
        System.out.println(bt.getId());
        System.out.println(bt.getName());
        setBeanTestName(bt, "gowthami");
        System.out.println("after");
        System.out.println(bt.getId());
        System.out.println(bt.getName());

        String st = new String("gowth");
        System.out.println("before " + st);
        concateMe(st, "ami");
        System.out.println("after " + st);

    }

    private static void setBeanTestName(BeanTest bt, String string) {
        bt.setName(string);

    }

    private static void concateMe(String s, String string) {
        s = s+string;
        System.out.println("inside method " + s);
    }

}

BeanTest.java

public class BeanTest {

    private String id;
    private String name;

    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }


}

因此,即使我们不是从私有方法返回它,但字符串也不是,bean仍在更新。有人可以解释我在JVM级别上发生了什么吗?

3 个答案:

答案 0 :(得分:2)

这是因为Java遵循按值调用,而不是按引用调用

传递 s 时,实际上传递的是s的值,而不是实际的s。因此,尽管您要在concateMe()中更改 s ,但在您的主要方法中将不会更改。

传递 bt 时,更改将影响更改引用的字段变量。但是,如果您更改参考,则将无效。您可以在main方法中添加它:

 System.out.println("before......");
 System.out.println(bt.getId());
 System.out.println(bt.getName());
 changeBeanTest(bt);
 System.out.println("after");
 System.out.println(bt.getId());
 System.out.println(bt.getName());

假设您的 changeBeanTest 是这样的:

private static void changeBeanTest(BeanTest tempBeanTest) { 
    BeanTest bt = new BeanTest();
    bt.setId("2");
    bt.setName("Trump");
    tempBeanTest = bt;
}

运行此。从main()发送的 bt 不变。

答案 1 :(得分:0)

Bean是java中的完整对象,通过引用私有方法传递,因此它在main方法和私有方法中是相同的实例。

您正在修改该实例的值,以使更改同时显示在两个地方。

该字符串或多或少是基元,并作为值的副本而不是main的确切实例传递。它是private方法中的新实例,因此您正在修改新变量。更改不会在main方法中显示,因为它是一个不同的实体。

答案 2 :(得分:0)

String s =“ gowth”;在此行中,s指向字符串池中的“ gowth”。调用时 private static void concateMe(String s,String string)在这里,String s与调用方方法String s不同。这里String的作用域是方法ContactMe的局部范围,但是contactMe local String指向相同的“ gowth”,这由调用方类String s指向在s = s + string之后;由于String是不可变的,因此方法本地引用String s指向另一个String“ gowthami”,但是调用方方法String s仍指向“ gowth”。因此,您将获得此输出。 但是在Bean的情况下,两个对象都指向相同的String引用,一旦我们对引用进行了任何更改,它将同时反映在两个对象上。