class Person{
int age = 15;
public static void changeAge(Person p){
p.age = 10;
Person p1 = new Person();
p = p1;
System.out.println(p.age);
}
public static void main(String [] args){
Person p = new Person();
changeAge(p);
System.out.println(p.age);
}
}为什么打印的是15 10了?
个人认为是15 15 啊
changeAge(p);
传入的这个p只是传了一个引用,这个p和
p.age = 10;
这个时候的p实际上是两个引用,在changeAge方法内部的p无论怎么改变也不会影响到主程序中的p
不是打印的P.age = 10吗 不是changeAge中改变的妈?
只传地址的COPY,即引用的COPY,ChangeAge方法里面对P的重新指向,并不影响原来main方法里的p对象的指向。
对不起。我说错了,是这样的
主程序中的p和changeAge方法里面的p由于指向同一个对象,那么你改变p指向对象的地址的值的话,那么另一个肯定会跟着变。
但你将changeAge方法里面的p重新指向另一个对象(即p1指向的对象),则不会影响到主程序中的p,所以主程序中的p还是指向原来那个对象,即age被改变的那个对象可以这样理解,有两个Person,
执行前
p(主程序),p(changeAge中的)指向Person1,p1指向Person2 同时Person1和Person2的age都是15
执行后
p(主程序)指向Person1,而且Person1中的age变成了10,而p(changeAge中的)和p1都指向Person2
int age = 15;
public static void changeAge(Person p){
// p.age = 10;
Person p1 = new Person();
p = p1;
System.out.println(p.age);
}
public static void main(String [] args){
Person p = null;
changeAge(p);
System.out.println(p.age);
}
}运行这个代码就明白了
changeAge(p);//并没有改变
执行changeage(p);时,在栈中产生一个变量p指向对象p,注意这两个p不是一回事,一个是局部变量一个是对象的引用,然后通过p.age=10;将对象中age的值改变为10,再将p=pl;就是说变量p不再指向对象p,而指向对象pl了,但对象p中的age的值仍然是10,所以方法中打印p.age输出的是新new出的对象pl的值,不管你前面如何改变,最后输出的都是15,因为pl.age的值没有被改变过!
执行打印main方法中的p.age时,自然就是输出对象p中的age的值了,age的值在方法中已被改变为10。搞清楚内存的分配很重要!你认为输出的值是15,是因为你把p=pl;看成是把对象pl赋给对象p了,其实这个p只不过是一个局部变量而已,当方法执行完以后,这个p也随之消失了。
int age = 15;
public static void changeAge(Person a){ //改一下看得明白点
a.age = 10;
Person p1 = new Person();
a = p1;
System.out.println(a.age);//输出的是p1.age的值
}
public static void main(String [] args){
Person p = new Person();
changeAge(p);
System.out.println(p.age);//输出的是被a.age改变后的值
}
}
Person p1 = new Person();//生成了新的地址
p = p1;//p的地址改变
所以就产生上面的打印信息
之后的
Person p1 = new Person();
p = p1;
System.out.println(p.age);
把方法里的 p 指向了一个新的地址 所以 p.age = 15;
而主程序的 p 是刚才被修改后的那个值 即 10;