JAVA小问题 帮忙看看

greenbar 2010-03-17 11:01:43

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 啊
...全文
259 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
rumlee 2010-03-18
  • 打赏
  • 举报
回复
changeAge里面自己改成了10当然就是10了,后面一个赋值出了方法作用域后就无效了。
gaoxiang519 2010-03-18
  • 打赏
  • 举报
回复
11楼的第一句话可以解决很多问题。
ctlu2ct2t 2010-03-18
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 gzsky133 的回复:]
画个内存图你就明白了。
执行changeage(p);时,在栈中产生一个变量p指向对象p,注意这两个p不是一回事,一个是局部变量一个是对象的引用,然后通过p.age=10;将对象中age的值改变为10,再将p=pl;就是说变量p不再指向对象p,而指向对象pl了,但对象p中的age的值仍然是10,所以方法中打印p.age输出的是新new出的对象pl的值,不管你前面如何改变,最后输出的都是15,因为……
[/Quote]
顶这个!
lryxxh 2010-03-18
  • 打赏
  • 举报
回复
学习了.....................
keeya0416 2010-03-18
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 greenbar 的回复:]
但是已经影响到了主程序中的P了啊
不是打印的P.age = 10吗 不是changeAge中改变的妈?
[/Quote]
p.age = 10;把主程序的P改到了10;这里的 p 和 主程序的 p 不是同一个引用,只是它们指向同一个地址;
之后的
Person p1 = new Person();
p = p1;
System.out.println(p.age);
把方法里的 p 指向了一个新的地址 所以 p.age = 15;
而主程序的 p 是刚才被修改后的那个值 即 10;
cbajing 2010-03-18
  • 打赏
  • 举报
回复
支持
[Quote=引用 11 楼 gzsky133 的回复:]
画个内存图你就明白了。
执行changeage(p);时,在栈中产生一个变量p指向对象p,注意这两个p不是一回事,一个是局部变量一个是对象的引用,然后通过p.age=10;将对象中age的值改变为10,再将p=pl;就是说变量p不再指向对象p,而指向对象pl了,但对象p中的age的值仍然是10,所以方法中打印p.age输出的是新new出的对象pl的值,不管你前面如何改变,最后输出的都是15,因为……
[/Quote]
peiqu123 2010-03-17
  • 打赏
  • 举报
回复
同意四楼的说法。。。可以这样说,JAVA调用函数时changeAge只是复制了一份指向Person对象的引用,这时两份引用(参数和主函数里的)指向了同一个对象,所以,p.age=10会修改对象的内容,而p=p1则将函数ChangeAge中的从主函数复制而来的引用指向了另一个对象的引用,所以,下面一句输出的是15,而结束函数调用后,主函数中的对象并没结束生命周期,所以其属性在函数changeAge中的改变(p.age=10)有效性还是存在的,所以输出的是10,LZ明白了没呢?
showhu714 2010-03-17
  • 打赏
  • 举报
回复
这么多人
xuzhijun969 2010-03-17
  • 打赏
  • 举报
回复
学习了


....
gmh521 2010-03-17
  • 打赏
  • 举报
回复
[Quote=引用楼主 greenbar 的回复:]
Java code

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);
……
[/Quote]
changeAge方法并没有改变this.age只是改变了传入的参数
gmh521 2010-03-17
  • 打赏
  • 举报
回复
java值传递
changeAge(p);//并没有改变
shadow55 2010-03-17
  • 打赏
  • 举报
回复
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 = null;
changeAge(p);
System.out.println(p.age);
}
}
运行这个代码就明白了
xiesisi3 2010-03-17
  • 打赏
  • 举报
回复
额。。
对不起。我说错了,

是这样的
主程序中的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
jafapple 2010-03-17
  • 打赏
  • 举报
回复
[Quote=引用楼主 greenbar 的回复:]
Java code

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);
}
……
[/Quote]

只传地址的COPY,即引用的COPY,ChangeAge方法里面对P的重新指向,并不影响原来main方法里的p对象的指向。
greenbar 2010-03-17
  • 打赏
  • 举报
回复
但是已经影响到了主程序中的P了啊
不是打印的P.age = 10吗 不是changeAge中改变的妈?
xiesisi3 2010-03-17
  • 打赏
  • 举报
回复
设个断点单步跟踪执行你就明白了

changeAge(p);
传入的这个p只是传了一个引用,这个p和
p.age = 10;
这个时候的p实际上是两个引用,在changeAge方法内部的p无论怎么改变也不会影响到主程序中的p
kaylg 2010-03-17
  • 打赏
  • 举报
回复
还是传引用的问题
dlnu05610 2010-03-17
  • 打赏
  • 举报
回复
一个是形参,你在方法里面把形参的引用给改变了,但是你实参的引用没有改变啊
岳丰源 2010-03-17
  • 打赏
  • 举报
回复
同意四楼(也是1楼)的说法,他刚开始没说错了,后面认真看了说的已经很明白了。
laolik 2010-03-17
  • 打赏
  • 举报
回复
看了这么多人的解释,总算是明白了。看来俺需要学得还很多啊。
加载更多回复(3)

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧