A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李春丽 中级黑马   /  2014-9-16 16:17  /  2401 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 李春丽 于 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

评分

参与人数 1技术分 +1 收起 理由
格子、 + 1 淡定

查看全部评分

11 个回复

倒序浏览
怎么没人给讲讲呢?大神呢?求帮助!!!
回复 使用道具 举报
这个问题很简单吗?怎么没人理呢???
回复 使用道具 举报
求解求解!Help!Help!为什么没人给解惑(⊙o⊙)?
回复 使用道具 举报
真的真的没人吗?
解释解释肿么了?!
回复 使用道具 举报
方法中的person就是一个局部变量,它指引的是方法中实例对象的地址,方法结束后person就被释放了,与成员变量的person无关
回复 使用道具 举报
xplcc 发表于 2014-9-22 17:50
方法中的person就是一个局部变量,它指引的是方法中实例对象的地址,方法结束后person就被释放了,与成员变 ...

调用方法 changer 后person指向的地址没有改变吗?
回复 使用道具 举报
xplcc 中级黑马 2014-9-28 22:45:16
8#
李春丽 发表于 2014-9-28 21:03
调用方法 changer 后person指向的地址没有改变吗?

方法中的persion指向了new Persion("list",22)这个对象的地址,他是个局部变量,在方法结束后,局部变量persion被释放,他与成员变量persion没有关系,成员变量还指向原先的new Persion("zhangsan",11)
回复 使用道具 举报
方法 changer 中的 Person person 参数传递,传的不是Test类中的成员person吗?一开始指向 new Persion("zhangsan",11),后来指向 new Persion("list",22),不是要覆盖原来的地址吗?指向不就改变了吗?
请问 我在哪里理解出错了?
回复 使用道具 举报
回复 使用道具 举报
本帖最后由 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(垃圾回收)也会回收该对象的内存空间。
回复 使用道具 举报
画了一个图,将就着看吧:

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马