我今天注意到了一种情况。当我们在私有方法上传递参数时,实体将返回修改后的值,而不是原始值。
这是我的示例代码,
/**
* @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级别上发生了什么吗?
答案 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引用,一旦我们对引用进行了任何更改,它将同时反映在两个对象上。