黑马程序员技术交流社区

标题: 求 讲解\(^o^)/~ [打印本页]

作者: 李春丽    时间: 2014-9-16 16:17
标题: 求 讲解\(^o^)/~
本帖最后由 李春丽 于 2014-9-29 08:12 编辑

请用 图 讲解一下两次 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+"]";
         }
}

:handshake:handshake:handshake


作者: 李春丽    时间: 2014-9-17 09:14
怎么没人给讲讲呢?大神呢?求帮助!!!
作者: 李春丽    时间: 2014-9-17 18:04
这个问题很简单吗?怎么没人理呢???
作者: 李春丽    时间: 2014-9-18 12:43
求解求解!Help!Help!为什么没人给解惑(⊙o⊙)?
作者: 李春丽    时间: 2014-9-22 17:32
真的真的没人吗?
解释解释肿么了?!
作者: xplcc    时间: 2014-9-22 17:50
方法中的person就是一个局部变量,它指引的是方法中实例对象的地址,方法结束后person就被释放了,与成员变量的person无关
作者: 李春丽    时间: 2014-9-28 21:03
xplcc 发表于 2014-9-22 17:50
方法中的person就是一个局部变量,它指引的是方法中实例对象的地址,方法结束后person就被释放了,与成员变 ...

调用方法 changer 后person指向的地址没有改变吗?
作者: xplcc    时间: 2014-9-28 22:45
李春丽 发表于 2014-9-28 21:03
调用方法 changer 后person指向的地址没有改变吗?

方法中的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
画了一个图,将就着看吧:






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2