我今天发现的情况。当我们传递一个参数的私有方法,该实体将返回修正值,但不是基本类型。
下面是我的示例代码,
/**
* @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);
}
}
bean test.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的水平?
这是因为Java遵循价值呼叫,而不是引用调用。
你逝去的是你实际上是通过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;
}
运行此。这里将是BT无变化主发送()。
豆是在java中通过引用传递给私有方法的完整对象,因此它在主要方法和私有方法相同的实例。
您正在修改该实例的值,从而改变在两个地方出现。
该字符串是或多或少一个原始的和作为值而不是从主确切实例的副本通过。它是私有方法一个新的实例,所以你正在修改一个新的变量。这些变化不会在main方法显示出来,因为它是不同的实体。
字符串s = “毛白杨丰产林生长”;在此线S指向“毛白杨丰产林生长”从字符串Pool.When您所呼叫私有静态无效concateMe(字符串s串串)这里的String是从主叫方法字符串s.Here一个String范围不同的是本地方法ContactMe,但contactMe本地的String指向相同的“毛白杨丰产林生长”,其是由主叫类字符串s.After S = S +串指出;因为字符串是不可改变的方法本地基准的String指向一个不同的字符串“gowthami”,但呼叫者方法字符串s是仍指向“毛白杨丰产林生长”。所以你得到这个输出。但在豆都指向同一个String引用对象的情况下,一旦我们在参考所做的任何更改将反映两个对象。