今天我注意到一个场景。当我们在私有(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/