日期:2014-05-20  浏览次数:20683 次

请帮忙分析一下程序的运行结果
今天看圣思园的Java SE的第十讲视频,最后一个程序

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
我自己运行也是这样。但是我比较奇怪的是视频里他说是因为main里面的那个对象和change里面的对象不一样,main里面的对象一直没有改变过,所以最后还是20。
但是我认为在调用change的时候这个函数里面并没有新建一个变量,并不是People people = new People()而是没有开头的那个People所以在这个时候已经改变了传入参数change的指向,那么people.age = 30了之后,people的指向并没有改回去,或者说我觉得永远不可能改回去了,为啥最后出来的结果却是原来的那个20而不是后来的30 呢,望指教


------解决方案--------------------
形参与实参的问题,如果要变成30,那么这段代码:
public void change(People people) {
people = new People();
people.age = 30;
}
要修改为:
public void change(People people) {
// people = new People();
people.age = 30;
}

能理解么?
------解决方案--------------------
探讨

懂了,不是引用传递……

------解决方案--------------------
不是引用传递,和c/c++不一样的
------解决方案--------------------
people.change(people);

int age2 = people.age


这两句话中,虽然调用了change方法,在change方法里也new了新对象,但下面的people.age这个people对象根本没有改变。so 依然是20。
------解决方案--------------------
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);//people.age=30只能作用在这个方法里面,出了这个方法就没用啦。和作用域有关系吧

int age2 = people.age;

System.out.println(age2);
}

------解决方案--------------------
java中参数的传递是值的拷贝,如果你没有在change方法中又创建一个对象,他们就会指向同堆中的同一个对象,但你又为其创建了一个对象,所有就造成两个引用指向两个对象了。
------解决方案--------------------
方法执行完以后people指向原来的对象
------解决方案--------------------
public void change(People people)
{
people = new People();

people.age = 30;
}

当你去new 一个的时候,参数people和新new的people已经没有关系了,因为java都是值传递而不是引用传递
参数people只是传递过来的一个值,它与方法调用处的people是两个值,只不过是指向了同一个对象,当在方法中new一个时,参数people和调用处的people指向了不同的对象。