//A.class
B b = new B();
String haha="pri";
ubc.change(haha);
System.out.println(haha);
//B.class
public void change(String haha){haha="haha";}
//
为什么在A中打出来的haha是pri而不是haha啊
B b = new B();
String haha="pri";
ubc.change(haha);
System.out.println(haha);
//B.class
public void change(String haha){haha="haha";}
//
为什么在A中打出来的haha是pri而不是haha啊
haha="haha";操作前后haha所指的对象不一样了
可以考虑用StringBuffer
2.当change(haha)调用方发时
3.在栈内又开辟了块内存名为haha2
4.进入到change方法体中,haha2的值变为"haha“
5.方法体结束时haha2内存地址就会自动消失
所以最后haha最后的值还是pro
//在栈上分配一个变量haha,指向堆内存里德一个String对象pri
ubc.change(haha)的时候,调用chang()方法,程序进入change()
String haha,又分配了一个haha变量,并分配一个"haha"给haha,
同样是haha,但是是不同的引用变量。chang()方法结束后,栈上的haha(按顺序来说是第二个)消失,分配的"haha"消失,你打印的时候,就剩下栈上第一次分配的haha,指向的是"pri"。String的确是定长字符串,String的引用不可变,我觉得楼主的问题是Java如何传值、传引用的问题。
只是举例不当,如果换成int,就好说了。如果想改变某个成员变量的值,一般都会专门写个set()方法
this.value = value;
然后调用set方法改变变量的值。也是"菜鸟",说的不对请路过的大大们批评指正。
static String name = "Hello";
static int age ;
public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public static void main(String [] args){
TestPassValue test = new TestPassValue();
test.setName("World");
test.setAge(100);
System.out.println(age);
System.out.println(name);
}
}
打印的结果是
age=100;
name=world
(比较简陋,不要笑,不过我想,问题已经说清楚了,"Hello"改成了"world",这是你想要的change功效),具体怎么来的,画内存图。
因为字符串变量不可变,修改的结果是产生一个对应新值新的引用,在change方法中改变的是这个haha副本的引用,而原haha变量并没有发生变化。
我是菜鸟我是这样理解的
我总结了好多高手的理解,写到了我的百度空间,搞懂了我空间的问题相信这个问题不在话下