请用 图 讲解一下两次 new Person 的对象在内存中的建立位置,我只了解第一次 new 对象的操作。在方法调用时 new 对象不是很清楚,希望各位大神讲解一下。
public class Test {
String s = new String("good");
char[] ch = { 'a', 'b', 'c' };
Person person = new Person("zhangsan", 11);
public static void main(String args[]) {
Test t = new Test();
t.changer(t.s, t.ch, t.person);
System.out.println(t.s);
System.out.println(t.ch);
System.out.println(t.person.toString());
}
private void changer(String s, char[] ch, Person person) {
s = "ok";
ch[0] = 'g';
person = new Person("lisi", 22);
}
}
class Person{
private String name ;
private int age ;
public Person(String name,int age){
this.name = name;
this.age = age;
}
public String toString(){
return " Person [name="+name+", age="+age+"]";
}
}
方法中的persion指向了new Persion("list",22)这个对象的地址,他是个局部变量,在方法结束后,局部变量persion被释放,他与成员变量persion没有关系,成员变量还指向原先的new Persion("zhangsan",11)作者: 李春丽 时间: 2014-9-29 08:25
方法 changer 中的 Person person 参数传递,传的不是Test类中的成员person吗?一开始指向 new Persion("zhangsan",11),后来指向 new Persion("list",22),不是要覆盖原来的地址吗?指向不就改变了吗?
请问 我在哪里理解出错了?作者: 更上一层 时间: 2014-9-29 10:28 http://bbs.itheima.com/thread-146080-1-1.html作者: darkads 时间: 2014-9-29 10:51 本帖最后由 darkads 于 2014-9-29 10:56 编辑
Java中对方法的值传递只有一种方式:复制传值
1.基本变量类型,例如:int i = 5,当把i作为方法的参数传递给一个方法时,会新建一个局部变量,并把i的值复制一份给它,方法调用结束,新建的局部变量销毁,所以这种方法是无法改变i的值
2.引用变量类型,例如:Person p = new Person();这个p本质上是一个int型的变量,它的值是一个内存地址,该内存地址指向了Person这个对象在堆空间中的地址,进行方法参数传递时,跟上面一样,jvm也会为这个方法创建一个局部变量pp,把p的值,就是那个内存地址复制一份给它,在方法中,pp可以通过这个内存地址访问Person对象,并且调用它的方法,但是如果new了一个新的Person对象并且把值赋给pp,那么pp的值就不再跟p一样了,也就不能方法原来的p指向的Person对象了。同样方法调用结束局部变量pp销毁,而且如果没有别的变量指向pp新建的这个对象,那么GC(垃圾回收)也会回收该对象的内存空间。作者: darkads 时间: 2014-9-29 11:25
画了一个图,将就着看吧: