传值的理解
废话不多说,继续看代码。
public class Test0602 {
String str=new String("good");
public void change(String str) {
str="okok";
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Test0602 stringTest = new Test0602();
stringTest.change(stringTest.str);
System.out.println(stringTest.str);
}
}
关于上面这代码 如何理解内存存储呢?
首先有个我们知道main函数是程序的入口,所以第一个代码是Test0602 stringTest = new Test0602();
在这里我们创建了一个对象,而在对象在有这么一行代码 String str=new String("good");
这表示在java堆中 有一个stringTest 对象,它里面有个地方有good值。接着继续是change(); 在对象中的方法可以调用对象中的所有的变量。所以改变的只是change的str并没有返回给stringTest的str。
如果加上一行 stringTest.str="hello";
Test0602 stringTest = new Test0602();
stringTest.str="hello";
stringTest.change(stringTest.str);
System.out.println(stringTest.str);
那么又是怎样的呢?
结果很容易理解是这样的。hello 是在堆里重新开辟出来的一个值。
传地址的理解
上面说的值传入后没有改变,一般说是值传递,那么地址传递是怎样的呢?
我们看一下的代码。
public class Test0602 {
char [] ch={"b","e","s","t"};
public void change(char ch[]) {
ch[0]="t";
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Test0602 stringTest = new Test0602();
stringTest.change(stringTest.ch);
System.out.println(stringTest.ch);
}
}
输出结果看一下
test
它将第一个值变成了一个t。这里的区别好像就是把字符串换成数组了,但看出来却变成地址传递了。
这个图是怎样的呢?
它在改变值得时候,是在地址的时候进行更改的,而不是开辟出一个新的地址。
以上就是我自己的理解,如有错误,请多多指正。