java - 通过私有(private)方法返回更新后的变量

标签 java

今天我注意到一个场景。当我们在私有(private)方法上传递参数时,实体将返回修改后的值,但不是基元。

这是我的示例代码,

/**
 * @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;
    }


}

因此,即使我们没有从私有(private)方法返回 bean,但 bean 仍在更新,但字符串则不然。有人可以解释一下 JVM 级别发生了什么吗?

最佳答案

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

当你传递s时,你实际上传递的是s的值,而不是实际的s。因此,尽管您在 concateMe() 中更改了 s,但它不会在您的 main 方法中发生更改。

当您传递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 不会发生任何变化。

关于java - 通过私有(private)方法返回更新后的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54528533/

相关文章:

java - 当 Redis 连接出现问题时,在 Hibernate 中熔断 L2 缓存

java - Penn Treebank 词性符号本身在 CoreNLP 代码中的什么位置实际表示?

java - java中如何判断一个对象是字符串还是字符串数组?

java - 使用 wamp 服务器部署数据库驱动的应用程序

java - 关于Java堆空间字符串对象存储的查询

java - 查找用 @RequestMapping 注释的函数的完全限定 URL

java - 在 Java servlet 中,为什么只为上下文、请求和 session 范围定义属性?

java - 将新实例添加到集群器

java - Jaudiotagger getAll(FieldKey.COMMENT) 生成一个由 0 和 1 组成的数组

java - 关于 Java Web Start 应用程序的简单问题