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

© 常万 中级黑马   /  2012-3-14 19:32  /  2050 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

public class People
{
int age = 20;
public void change(People people)
{
people = new People();

people.age = 30;
}
public static void main(String[] args)
{
People people = new People();
int age = people.age;
System.out.println(age);
people.change(people);
int age2 = people.age;
System.out.println(age2);
}

}
运行结果是20   20
把change()方法中的people = new People(); 注销了 运行结果是 20 30了
求高手详细解说,谢谢...

4 个回复

倒序浏览

,

本帖最后由 马胜平 于 2012-3-14 19:49 编辑

People people = new People();  //1
int age = people.age;
System.out.println(age);
people.change(people);
int age2 = people.age;//2   一处的和这里都是一个Person age=20  
System.out.println(age2);
你在函数里有创建了一个新的实例运行完就没了,局部变量分不清楚啊,即使不是局部的函数里创建的也是个新实例,你改变它的值和main 函数的person实例有什么关系

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

回复 使用道具 举报
people.change(people);
int age2 = people.age;
System.out.println(age2);
调用chang()方法的作用是改变某个People对象的age属性值,当调用
chang()方法时,age的值改变为30,所以再次调用的时候调用的是改变后的age的值,所以打印30
回复 使用道具 举报
public class People
{
int age = 20;
public void change(People people)
{
people = new People();//①

people.age = 30;
        //System.out.println(people.age);⑥
}
public static void main(String[] args)
{
         People people = new People();
int age = people.age;//④
System.out.println(age);
people.change(people);//②
int age2 = people.age;//③
System.out.println(age2);
}

}
①这样写是不是不太好啊,你是为了改变peopel的age直接下面那句就可以了为什么还新建立个people呢,这句话完全可以不要的
②这句话执行的时候是在方法里面建立了个对象然后将对象的age赋值为30,当方法结束的时候age的值也就没有了,你可以在方法内部加⑥就可以看出效果了
③所以这句打印的还是people初始化时候的值20,和④应该是一个age;
回复 使用道具 举报
你第一次运行的结果都是20,20,理由是people.change(people);并不可以改变年龄的值,因为它另外开辟一个存储空间,里面也有年龄的值,你改变的紧紧是里面的值,用完以后就会消失。

people = new People(); 注销了的结果是20,30.理由是你注销了,所以不会在内存中开辟一个新的空间,people都指向同一空间,所以你改变了年龄的值,结果就会改变了。

你也可以这样实验下,public static int age = 20;无论你注销与否,运行的结果都是20.和30.原因是age是一个共享变量。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马